Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
k3s
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
k3s
Commits
a3537a02
Commit
a3537a02
authored
Sep 15, 2016
by
Michael Fraenkel
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Allow no ports when exposing headless service
parent
39e3c986
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
59 additions
and
1 deletion
+59
-1
expose.go
pkg/kubectl/cmd/expose.go
+4
-0
expose_test.go
pkg/kubectl/cmd/expose_test.go
+26
-0
service.go
pkg/kubectl/service.go
+6
-1
service_test.go
pkg/kubectl/service_test.go
+23
-0
No files found.
pkg/kubectl/cmd/expose.go
View file @
a3537a02
...
@@ -186,6 +186,8 @@ func RunExpose(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []str
...
@@ -186,6 +186,8 @@ func RunExpose(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []str
params
[
"selector"
]
=
s
params
[
"selector"
]
=
s
}
}
isHeadlessService
:=
params
[
"cluster-ip"
]
==
"None"
// For objects that need a port, derive it from the exposed object in case a user
// For objects that need a port, derive it from the exposed object in case a user
// didn't explicitly specify one via --port
// didn't explicitly specify one via --port
if
port
,
found
:=
params
[
"port"
];
found
&&
kubectl
.
IsZero
(
port
)
{
if
port
,
found
:=
params
[
"port"
];
found
&&
kubectl
.
IsZero
(
port
)
{
...
@@ -195,7 +197,9 @@ func RunExpose(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []str
...
@@ -195,7 +197,9 @@ func RunExpose(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []str
}
}
switch
len
(
ports
)
{
switch
len
(
ports
)
{
case
0
:
case
0
:
if
!
isHeadlessService
{
return
cmdutil
.
UsageError
(
cmd
,
"couldn't find port via --port flag or introspection"
)
return
cmdutil
.
UsageError
(
cmd
,
"couldn't find port via --port flag or introspection"
)
}
case
1
:
case
1
:
params
[
"port"
]
=
ports
[
0
]
params
[
"port"
]
=
ports
[
0
]
default
:
default
:
...
...
pkg/kubectl/cmd/expose_test.go
View file @
a3537a02
...
@@ -263,6 +263,32 @@ func TestRunExposeService(t *testing.T) {
...
@@ -263,6 +263,32 @@ func TestRunExposeService(t *testing.T) {
status
:
200
,
status
:
200
,
},
},
{
{
name
:
"expose-headless-service-no-port"
,
args
:
[]
string
{
"service"
,
"baz"
},
ns
:
"test"
,
calls
:
map
[
string
]
string
{
"GET"
:
"/namespaces/test/services/baz"
,
"POST"
:
"/namespaces/test/services"
,
},
input
:
&
api
.
Service
{
ObjectMeta
:
api
.
ObjectMeta
{
Name
:
"baz"
,
Namespace
:
"test"
,
ResourceVersion
:
"12"
},
Spec
:
api
.
ServiceSpec
{
Selector
:
map
[
string
]
string
{
"app"
:
"go"
},
},
},
flags
:
map
[
string
]
string
{
"selector"
:
"func=stream"
,
"name"
:
"foo"
,
"labels"
:
"svc=test"
,
"cluster-ip"
:
"None"
,
"dry-run"
:
"true"
},
output
:
&
api
.
Service
{
ObjectMeta
:
api
.
ObjectMeta
{
Name
:
"foo"
,
Namespace
:
""
,
Labels
:
map
[
string
]
string
{
"svc"
:
"test"
}},
Spec
:
api
.
ServiceSpec
{
Ports
:
[]
api
.
ServicePort
{},
Selector
:
map
[
string
]
string
{
"func"
:
"stream"
},
ClusterIP
:
api
.
ClusterIPNone
,
},
},
expected
:
"service
\"
foo
\"
exposed"
,
status
:
200
,
},
{
name
:
"expose-from-file"
,
name
:
"expose-from-file"
,
args
:
[]
string
{},
args
:
[]
string
{},
ns
:
"test"
,
ns
:
"test"
,
...
...
pkg/kubectl/service.go
View file @
a3537a02
...
@@ -110,6 +110,9 @@ func generate(genericParams map[string]interface{}) (runtime.Object, error) {
...
@@ -110,6 +110,9 @@ func generate(genericParams map[string]interface{}) (runtime.Object, error) {
return
nil
,
fmt
.
Errorf
(
"'name' is a required parameter."
)
return
nil
,
fmt
.
Errorf
(
"'name' is a required parameter."
)
}
}
}
}
isHeadlessService
:=
params
[
"cluster-ip"
]
==
"None"
ports
:=
[]
api
.
ServicePort
{}
ports
:=
[]
api
.
ServicePort
{}
servicePortName
,
found
:=
params
[
"port-name"
]
servicePortName
,
found
:=
params
[
"port-name"
]
if
!
found
{
if
!
found
{
...
@@ -131,11 +134,12 @@ func generate(genericParams map[string]interface{}) (runtime.Object, error) {
...
@@ -131,11 +134,12 @@ func generate(genericParams map[string]interface{}) (runtime.Object, error) {
var
portString
string
var
portString
string
if
portString
,
found
=
params
[
"ports"
];
!
found
{
if
portString
,
found
=
params
[
"ports"
];
!
found
{
portString
,
found
=
params
[
"port"
]
portString
,
found
=
params
[
"port"
]
if
!
found
{
if
!
found
&&
!
isHeadlessService
{
return
nil
,
fmt
.
Errorf
(
"'port' is a required parameter."
)
return
nil
,
fmt
.
Errorf
(
"'port' is a required parameter."
)
}
}
}
}
if
portString
!=
""
{
portStringSlice
:=
strings
.
Split
(
portString
,
","
)
portStringSlice
:=
strings
.
Split
(
portString
,
","
)
for
i
,
stillPortString
:=
range
portStringSlice
{
for
i
,
stillPortString
:=
range
portStringSlice
{
port
,
err
:=
strconv
.
Atoi
(
stillPortString
)
port
,
err
:=
strconv
.
Atoi
(
stillPortString
)
...
@@ -170,6 +174,7 @@ func generate(genericParams map[string]interface{}) (runtime.Object, error) {
...
@@ -170,6 +174,7 @@ func generate(genericParams map[string]interface{}) (runtime.Object, error) {
Protocol
:
api
.
Protocol
(
protocol
),
Protocol
:
api
.
Protocol
(
protocol
),
})
})
}
}
}
service
:=
api
.
Service
{
service
:=
api
.
Service
{
ObjectMeta
:
api
.
ObjectMeta
{
ObjectMeta
:
api
.
ObjectMeta
{
...
...
pkg/kubectl/service_test.go
View file @
a3537a02
...
@@ -536,6 +536,29 @@ func TestGenerateService(t *testing.T) {
...
@@ -536,6 +536,29 @@ func TestGenerateService(t *testing.T) {
},
},
},
},
},
},
{
generator
:
ServiceGeneratorV2
{},
params
:
map
[
string
]
interface
{}{
"selector"
:
"foo=bar,baz=blah"
,
"name"
:
"test"
,
"protocol"
:
"TCP"
,
"container-port"
:
"1234"
,
"cluster-ip"
:
"None"
,
},
expected
:
api
.
Service
{
ObjectMeta
:
api
.
ObjectMeta
{
Name
:
"test"
,
},
Spec
:
api
.
ServiceSpec
{
Selector
:
map
[
string
]
string
{
"foo"
:
"bar"
,
"baz"
:
"blah"
,
},
Ports
:
[]
api
.
ServicePort
{},
ClusterIP
:
api
.
ClusterIPNone
,
},
},
},
}
}
for
_
,
test
:=
range
tests
{
for
_
,
test
:=
range
tests
{
obj
,
err
:=
test
.
generator
.
Generate
(
test
.
params
)
obj
,
err
:=
test
.
generator
.
Generate
(
test
.
params
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment