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
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
91 additions
and
33 deletions
+91
-33
expose.go
pkg/kubectl/cmd/expose.go
+5
-1
expose_test.go
pkg/kubectl/cmd/expose_test.go
+26
-0
service.go
pkg/kubectl/service.go
+37
-32
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
:
return
cmdutil
.
UsageError
(
cmd
,
"couldn't find port via --port flag or introspection"
)
if
!
isHeadlessService
{
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,44 +134,46 @@ func generate(genericParams map[string]interface{}) (runtime.Object, error) {
...
@@ -131,44 +134,46 @@ 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."
)
}
}
}
}
portStringSlice
:=
strings
.
Split
(
portString
,
","
)
if
portString
!=
""
{
for
i
,
stillPortString
:=
range
portStringSlice
{
portStringSlice
:=
strings
.
Split
(
portString
,
","
)
port
,
err
:=
strconv
.
Atoi
(
stillPortString
)
for
i
,
stillPortString
:=
range
portStringSlice
{
if
err
!=
nil
{
port
,
err
:=
strconv
.
Atoi
(
stillPortString
)
return
nil
,
err
if
err
!=
nil
{
}
return
nil
,
err
name
:=
servicePortName
}
// If we are going to assign multiple ports to a service, we need to
name
:=
servicePortName
// generate a different name for each one.
// If we are going to assign multiple ports to a service, we need to
if
len
(
portStringSlice
)
>
1
{
// generate a different name for each one.
name
=
fmt
.
Sprintf
(
"port-%d"
,
i
+
1
)
if
len
(
portStringSlice
)
>
1
{
}
name
=
fmt
.
Sprintf
(
"port-%d"
,
i
+
1
)
protocol
:=
params
[
"protocol"
]
}
protocol
:=
params
[
"protocol"
]
switch
{
case
len
(
protocol
)
==
0
&&
len
(
portProtocolMap
)
==
0
:
switch
{
// Default to TCP, what the flag was doing previously.
case
len
(
protocol
)
==
0
&&
len
(
portProtocolMap
)
==
0
:
protocol
=
"TCP"
// Default to TCP, what the flag was doing previously.
case
len
(
protocol
)
>
0
&&
len
(
portProtocolMap
)
>
0
:
protocol
=
"TCP"
// User has specified the --protocol while exposing a multiprotocol resource
case
len
(
protocol
)
>
0
&&
len
(
portProtocolMap
)
>
0
:
// We should stomp multiple protocols with the one specified ie. do nothing
// User has specified the --protocol while exposing a multiprotocol resource
case
len
(
protocol
)
==
0
&&
len
(
portProtocolMap
)
>
0
:
// We should stomp multiple protocols with the one specified ie. do nothing
// no --protocol and we expose a multiprotocol resource
case
len
(
protocol
)
==
0
&&
len
(
portProtocolMap
)
>
0
:
protocol
=
"TCP"
// have the default so we can stay sane
// no --protocol and we expose a multiprotocol resource
if
exposeProtocol
,
found
:=
portProtocolMap
[
stillPortString
];
found
{
protocol
=
"TCP"
// have the default so we can stay sane
protocol
=
exposeProtocol
if
exposeProtocol
,
found
:=
portProtocolMap
[
stillPortString
];
found
{
protocol
=
exposeProtocol
}
}
}
ports
=
append
(
ports
,
api
.
ServicePort
{
Name
:
name
,
Port
:
int32
(
port
),
Protocol
:
api
.
Protocol
(
protocol
),
})
}
}
ports
=
append
(
ports
,
api
.
ServicePort
{
Name
:
name
,
Port
:
int32
(
port
),
Protocol
:
api
.
Protocol
(
protocol
),
})
}
}
service
:=
api
.
Service
{
service
:=
api
.
Service
{
...
...
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