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
608bf0de
Commit
608bf0de
authored
Aug 02, 2018
by
David Eads
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update polymorphichelpers for external types
parent
23111ad4
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
240 additions
and
4 deletions
+240
-4
BUILD
pkg/kubectl/polymorphichelpers/BUILD
+1
-0
mapbasedselectorforobject.go
pkg/kubectl/polymorphichelpers/mapbasedselectorforobject.go
+71
-0
objectpauser.go
pkg/kubectl/polymorphichelpers/objectpauser.go
+34
-0
objectresumer.go
pkg/kubectl/polymorphichelpers/objectresumer.go
+34
-0
portsforobject.go
pkg/kubectl/polymorphichelpers/portsforobject.go
+49
-2
protocolsforobject.go
pkg/kubectl/polymorphichelpers/protocolsforobject.go
+51
-2
No files found.
pkg/kubectl/polymorphichelpers/BUILD
View file @
608bf0de
...
...
@@ -31,6 +31,7 @@ go_library(
"//pkg/controller:go_default_library",
"//pkg/kubectl:go_default_library",
"//pkg/kubectl/genericclioptions:go_default_library",
"//pkg/kubectl/scheme:go_default_library",
"//staging/src/k8s.io/api/apps/v1:go_default_library",
"//staging/src/k8s.io/api/apps/v1beta1:go_default_library",
"//staging/src/k8s.io/api/apps/v1beta2:go_default_library",
...
...
pkg/kubectl/polymorphichelpers/mapbasedselectorforobject.go
View file @
608bf0de
...
...
@@ -19,6 +19,11 @@ package polymorphichelpers
import
(
"fmt"
appsv1
"k8s.io/api/apps/v1"
appsv1beta1
"k8s.io/api/apps/v1beta1"
appsv1beta2
"k8s.io/api/apps/v1beta2"
corev1
"k8s.io/api/core/v1"
extensionsv1beta1
"k8s.io/api/extensions/v1beta1"
"k8s.io/apimachinery/pkg/runtime"
api
"k8s.io/kubernetes/pkg/apis/core"
"k8s.io/kubernetes/pkg/apis/extensions"
...
...
@@ -33,16 +38,31 @@ func mapBasedSelectorForObject(object runtime.Object) (string, error) {
switch
t
:=
object
.
(
type
)
{
case
*
api
.
ReplicationController
:
return
kubectl
.
MakeLabels
(
t
.
Spec
.
Selector
),
nil
case
*
corev1
.
ReplicationController
:
return
kubectl
.
MakeLabels
(
t
.
Spec
.
Selector
),
nil
case
*
api
.
Pod
:
if
len
(
t
.
Labels
)
==
0
{
return
""
,
fmt
.
Errorf
(
"the pod has no labels and cannot be exposed"
)
}
return
kubectl
.
MakeLabels
(
t
.
Labels
),
nil
case
*
corev1
.
Pod
:
if
len
(
t
.
Labels
)
==
0
{
return
""
,
fmt
.
Errorf
(
"the pod has no labels and cannot be exposed"
)
}
return
kubectl
.
MakeLabels
(
t
.
Labels
),
nil
case
*
api
.
Service
:
if
t
.
Spec
.
Selector
==
nil
{
return
""
,
fmt
.
Errorf
(
"the service has no pod selector set"
)
}
return
kubectl
.
MakeLabels
(
t
.
Spec
.
Selector
),
nil
case
*
corev1
.
Service
:
if
t
.
Spec
.
Selector
==
nil
{
return
""
,
fmt
.
Errorf
(
"the service has no pod selector set"
)
}
return
kubectl
.
MakeLabels
(
t
.
Spec
.
Selector
),
nil
case
*
extensions
.
Deployment
:
// TODO(madhusudancs): Make this smarter by admitting MatchExpressions with Equals
// operator, DoubleEquals operator and In operator with only one element in the set.
...
...
@@ -50,6 +70,35 @@ func mapBasedSelectorForObject(object runtime.Object) (string, error) {
return
""
,
fmt
.
Errorf
(
"couldn't convert expressions -
\"
%+v
\"
to map-based selector format"
,
t
.
Spec
.
Selector
.
MatchExpressions
)
}
return
kubectl
.
MakeLabels
(
t
.
Spec
.
Selector
.
MatchLabels
),
nil
case
*
extensionsv1beta1
.
Deployment
:
// TODO(madhusudancs): Make this smarter by admitting MatchExpressions with Equals
// operator, DoubleEquals operator and In operator with only one element in the set.
if
len
(
t
.
Spec
.
Selector
.
MatchExpressions
)
>
0
{
return
""
,
fmt
.
Errorf
(
"couldn't convert expressions -
\"
%+v
\"
to map-based selector format"
,
t
.
Spec
.
Selector
.
MatchExpressions
)
}
return
kubectl
.
MakeLabels
(
t
.
Spec
.
Selector
.
MatchLabels
),
nil
case
*
appsv1
.
Deployment
:
// TODO(madhusudancs): Make this smarter by admitting MatchExpressions with Equals
// operator, DoubleEquals operator and In operator with only one element in the set.
if
len
(
t
.
Spec
.
Selector
.
MatchExpressions
)
>
0
{
return
""
,
fmt
.
Errorf
(
"couldn't convert expressions -
\"
%+v
\"
to map-based selector format"
,
t
.
Spec
.
Selector
.
MatchExpressions
)
}
return
kubectl
.
MakeLabels
(
t
.
Spec
.
Selector
.
MatchLabels
),
nil
case
*
appsv1beta2
.
Deployment
:
// TODO(madhusudancs): Make this smarter by admitting MatchExpressions with Equals
// operator, DoubleEquals operator and In operator with only one element in the set.
if
len
(
t
.
Spec
.
Selector
.
MatchExpressions
)
>
0
{
return
""
,
fmt
.
Errorf
(
"couldn't convert expressions -
\"
%+v
\"
to map-based selector format"
,
t
.
Spec
.
Selector
.
MatchExpressions
)
}
return
kubectl
.
MakeLabels
(
t
.
Spec
.
Selector
.
MatchLabels
),
nil
case
*
appsv1beta1
.
Deployment
:
// TODO(madhusudancs): Make this smarter by admitting MatchExpressions with Equals
// operator, DoubleEquals operator and In operator with only one element in the set.
if
len
(
t
.
Spec
.
Selector
.
MatchExpressions
)
>
0
{
return
""
,
fmt
.
Errorf
(
"couldn't convert expressions -
\"
%+v
\"
to map-based selector format"
,
t
.
Spec
.
Selector
.
MatchExpressions
)
}
return
kubectl
.
MakeLabels
(
t
.
Spec
.
Selector
.
MatchLabels
),
nil
case
*
extensions
.
ReplicaSet
:
// TODO(madhusudancs): Make this smarter by admitting MatchExpressions with Equals
// operator, DoubleEquals operator and In operator with only one element in the set.
...
...
@@ -57,6 +106,28 @@ func mapBasedSelectorForObject(object runtime.Object) (string, error) {
return
""
,
fmt
.
Errorf
(
"couldn't convert expressions -
\"
%+v
\"
to map-based selector format"
,
t
.
Spec
.
Selector
.
MatchExpressions
)
}
return
kubectl
.
MakeLabels
(
t
.
Spec
.
Selector
.
MatchLabels
),
nil
case
*
extensionsv1beta1
.
ReplicaSet
:
// TODO(madhusudancs): Make this smarter by admitting MatchExpressions with Equals
// operator, DoubleEquals operator and In operator with only one element in the set.
if
len
(
t
.
Spec
.
Selector
.
MatchExpressions
)
>
0
{
return
""
,
fmt
.
Errorf
(
"couldn't convert expressions -
\"
%+v
\"
to map-based selector format"
,
t
.
Spec
.
Selector
.
MatchExpressions
)
}
return
kubectl
.
MakeLabels
(
t
.
Spec
.
Selector
.
MatchLabels
),
nil
case
*
appsv1
.
ReplicaSet
:
// TODO(madhusudancs): Make this smarter by admitting MatchExpressions with Equals
// operator, DoubleEquals operator and In operator with only one element in the set.
if
len
(
t
.
Spec
.
Selector
.
MatchExpressions
)
>
0
{
return
""
,
fmt
.
Errorf
(
"couldn't convert expressions -
\"
%+v
\"
to map-based selector format"
,
t
.
Spec
.
Selector
.
MatchExpressions
)
}
return
kubectl
.
MakeLabels
(
t
.
Spec
.
Selector
.
MatchLabels
),
nil
case
*
appsv1beta2
.
ReplicaSet
:
// TODO(madhusudancs): Make this smarter by admitting MatchExpressions with Equals
// operator, DoubleEquals operator and In operator with only one element in the set.
if
len
(
t
.
Spec
.
Selector
.
MatchExpressions
)
>
0
{
return
""
,
fmt
.
Errorf
(
"couldn't convert expressions -
\"
%+v
\"
to map-based selector format"
,
t
.
Spec
.
Selector
.
MatchExpressions
)
}
return
kubectl
.
MakeLabels
(
t
.
Spec
.
Selector
.
MatchLabels
),
nil
default
:
return
""
,
fmt
.
Errorf
(
"cannot extract pod selector from %T"
,
object
)
}
...
...
pkg/kubectl/polymorphichelpers/objectpauser.go
View file @
608bf0de
...
...
@@ -20,10 +20,15 @@ import (
"errors"
"fmt"
appsv1
"k8s.io/api/apps/v1"
appsv1beta1
"k8s.io/api/apps/v1beta1"
appsv1beta2
"k8s.io/api/apps/v1beta2"
extensionsv1beta1
"k8s.io/api/extensions/v1beta1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/kubernetes/pkg/api/legacyscheme"
"k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/kubectl/scheme"
)
// Currently only supports Deployments.
...
...
@@ -35,6 +40,35 @@ func defaultObjectPauser(obj runtime.Object) ([]byte, error) {
}
obj
.
Spec
.
Paused
=
true
return
runtime
.
Encode
(
internalVersionJSONEncoder
(),
obj
)
case
*
extensionsv1beta1
.
Deployment
:
if
obj
.
Spec
.
Paused
{
return
nil
,
errors
.
New
(
"is already paused"
)
}
obj
.
Spec
.
Paused
=
true
return
runtime
.
Encode
(
scheme
.
Codecs
.
LegacyCodec
(
extensionsv1beta1
.
SchemeGroupVersion
),
obj
)
case
*
appsv1
.
Deployment
:
if
obj
.
Spec
.
Paused
{
return
nil
,
errors
.
New
(
"is already paused"
)
}
obj
.
Spec
.
Paused
=
true
return
runtime
.
Encode
(
scheme
.
Codecs
.
LegacyCodec
(
appsv1
.
SchemeGroupVersion
),
obj
)
case
*
appsv1beta2
.
Deployment
:
if
obj
.
Spec
.
Paused
{
return
nil
,
errors
.
New
(
"is already paused"
)
}
obj
.
Spec
.
Paused
=
true
return
runtime
.
Encode
(
scheme
.
Codecs
.
LegacyCodec
(
appsv1beta2
.
SchemeGroupVersion
),
obj
)
case
*
appsv1beta1
.
Deployment
:
if
obj
.
Spec
.
Paused
{
return
nil
,
errors
.
New
(
"is already paused"
)
}
obj
.
Spec
.
Paused
=
true
return
runtime
.
Encode
(
scheme
.
Codecs
.
LegacyCodec
(
appsv1beta1
.
SchemeGroupVersion
),
obj
)
default
:
return
nil
,
fmt
.
Errorf
(
"pausing is not supported"
)
}
...
...
pkg/kubectl/polymorphichelpers/objectresumer.go
View file @
608bf0de
...
...
@@ -20,8 +20,13 @@ import (
"errors"
"fmt"
appsv1
"k8s.io/api/apps/v1"
appsv1beta1
"k8s.io/api/apps/v1beta1"
appsv1beta2
"k8s.io/api/apps/v1beta2"
extensionsv1beta1
"k8s.io/api/extensions/v1beta1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/kubectl/scheme"
)
func
defaultObjectResumer
(
obj
runtime
.
Object
)
([]
byte
,
error
)
{
...
...
@@ -32,6 +37,35 @@ func defaultObjectResumer(obj runtime.Object) ([]byte, error) {
}
obj
.
Spec
.
Paused
=
false
return
runtime
.
Encode
(
internalVersionJSONEncoder
(),
obj
)
case
*
extensionsv1beta1
.
Deployment
:
if
!
obj
.
Spec
.
Paused
{
return
nil
,
errors
.
New
(
"is not paused"
)
}
obj
.
Spec
.
Paused
=
false
return
runtime
.
Encode
(
scheme
.
Codecs
.
LegacyCodec
(
extensionsv1beta1
.
SchemeGroupVersion
),
obj
)
case
*
appsv1
.
Deployment
:
if
!
obj
.
Spec
.
Paused
{
return
nil
,
errors
.
New
(
"is not paused"
)
}
obj
.
Spec
.
Paused
=
false
return
runtime
.
Encode
(
scheme
.
Codecs
.
LegacyCodec
(
appsv1
.
SchemeGroupVersion
),
obj
)
case
*
appsv1beta2
.
Deployment
:
if
!
obj
.
Spec
.
Paused
{
return
nil
,
errors
.
New
(
"is not paused"
)
}
obj
.
Spec
.
Paused
=
false
return
runtime
.
Encode
(
scheme
.
Codecs
.
LegacyCodec
(
appsv1beta2
.
SchemeGroupVersion
),
obj
)
case
*
appsv1beta1
.
Deployment
:
if
!
obj
.
Spec
.
Paused
{
return
nil
,
errors
.
New
(
"is not paused"
)
}
obj
.
Spec
.
Paused
=
false
return
runtime
.
Encode
(
scheme
.
Codecs
.
LegacyCodec
(
appsv1beta1
.
SchemeGroupVersion
),
obj
)
default
:
return
nil
,
fmt
.
Errorf
(
"resuming is not supported"
)
}
...
...
pkg/kubectl/polymorphichelpers/portsforobject.go
View file @
608bf0de
...
...
@@ -20,6 +20,11 @@ import (
"fmt"
"strconv"
appsv1
"k8s.io/api/apps/v1"
appsv1beta1
"k8s.io/api/apps/v1beta1"
appsv1beta2
"k8s.io/api/apps/v1beta2"
corev1
"k8s.io/api/core/v1"
extensionsv1beta1
"k8s.io/api/extensions/v1beta1"
"k8s.io/apimachinery/pkg/runtime"
api
"k8s.io/kubernetes/pkg/apis/core"
"k8s.io/kubernetes/pkg/apis/extensions"
...
...
@@ -28,21 +33,45 @@ import (
func
portsForObject
(
object
runtime
.
Object
)
([]
string
,
error
)
{
switch
t
:=
object
.
(
type
)
{
case
*
api
.
ReplicationController
:
return
getPortsInternal
(
t
.
Spec
.
Template
.
Spec
),
nil
case
*
corev1
.
ReplicationController
:
return
getPorts
(
t
.
Spec
.
Template
.
Spec
),
nil
case
*
api
.
Pod
:
return
getPortsInternal
(
t
.
Spec
),
nil
case
*
corev1
.
Pod
:
return
getPorts
(
t
.
Spec
),
nil
case
*
api
.
Service
:
return
getServicePortsInternal
(
t
.
Spec
),
nil
case
*
corev1
.
Service
:
return
getServicePorts
(
t
.
Spec
),
nil
case
*
extensions
.
Deployment
:
return
getPortsInternal
(
t
.
Spec
.
Template
.
Spec
),
nil
case
*
extensionsv1beta1
.
Deployment
:
return
getPorts
(
t
.
Spec
.
Template
.
Spec
),
nil
case
*
appsv1
.
Deployment
:
return
getPorts
(
t
.
Spec
.
Template
.
Spec
),
nil
case
*
appsv1beta2
.
Deployment
:
return
getPorts
(
t
.
Spec
.
Template
.
Spec
),
nil
case
*
appsv1beta1
.
Deployment
:
return
getPorts
(
t
.
Spec
.
Template
.
Spec
),
nil
case
*
extensions
.
ReplicaSet
:
return
getPortsInternal
(
t
.
Spec
.
Template
.
Spec
),
nil
case
*
extensionsv1beta1
.
ReplicaSet
:
return
getPorts
(
t
.
Spec
.
Template
.
Spec
),
nil
case
*
appsv1
.
ReplicaSet
:
return
getPorts
(
t
.
Spec
.
Template
.
Spec
),
nil
case
*
appsv1beta2
.
ReplicaSet
:
return
getPorts
(
t
.
Spec
.
Template
.
Spec
),
nil
default
:
return
nil
,
fmt
.
Errorf
(
"cannot extract ports from %T"
,
object
)
}
}
func
getPorts
(
spec
api
.
PodSpec
)
[]
string
{
func
getPorts
Internal
(
spec
api
.
PodSpec
)
[]
string
{
result
:=
[]
string
{}
for
_
,
container
:=
range
spec
.
Containers
{
for
_
,
port
:=
range
container
.
Ports
{
...
...
@@ -53,7 +82,25 @@ func getPorts(spec api.PodSpec) []string {
}
// Extracts the ports exposed by a service from the given service spec.
func
getServicePorts
(
spec
api
.
ServiceSpec
)
[]
string
{
func
getServicePortsInternal
(
spec
api
.
ServiceSpec
)
[]
string
{
result
:=
[]
string
{}
for
_
,
servicePort
:=
range
spec
.
Ports
{
result
=
append
(
result
,
strconv
.
Itoa
(
int
(
servicePort
.
Port
)))
}
return
result
}
func
getPorts
(
spec
corev1
.
PodSpec
)
[]
string
{
result
:=
[]
string
{}
for
_
,
container
:=
range
spec
.
Containers
{
for
_
,
port
:=
range
container
.
Ports
{
result
=
append
(
result
,
strconv
.
Itoa
(
int
(
port
.
ContainerPort
)))
}
}
return
result
}
func
getServicePorts
(
spec
corev1
.
ServiceSpec
)
[]
string
{
result
:=
[]
string
{}
for
_
,
servicePort
:=
range
spec
.
Ports
{
result
=
append
(
result
,
strconv
.
Itoa
(
int
(
servicePort
.
Port
)))
...
...
pkg/kubectl/polymorphichelpers/protocolsforobject.go
View file @
608bf0de
...
...
@@ -20,6 +20,11 @@ import (
"fmt"
"strconv"
appsv1
"k8s.io/api/apps/v1"
appsv1beta1
"k8s.io/api/apps/v1beta1"
appsv1beta2
"k8s.io/api/apps/v1beta2"
corev1
"k8s.io/api/core/v1"
extensionsv1beta1
"k8s.io/api/extensions/v1beta1"
"k8s.io/apimachinery/pkg/runtime"
api
"k8s.io/kubernetes/pkg/apis/core"
"k8s.io/kubernetes/pkg/apis/extensions"
...
...
@@ -29,21 +34,65 @@ func protocolsForObject(object runtime.Object) (map[string]string, error) {
// TODO: replace with a swagger schema based approach (identify pod selector via schema introspection)
switch
t
:=
object
.
(
type
)
{
case
*
api
.
ReplicationController
:
return
getProtocolsInternal
(
t
.
Spec
.
Template
.
Spec
),
nil
case
*
corev1
.
ReplicationController
:
return
getProtocols
(
t
.
Spec
.
Template
.
Spec
),
nil
case
*
api
.
Pod
:
return
getProtocolsInternal
(
t
.
Spec
),
nil
case
*
corev1
.
Pod
:
return
getProtocols
(
t
.
Spec
),
nil
case
*
api
.
Service
:
return
getServiceProtocolsInternal
(
t
.
Spec
),
nil
case
*
corev1
.
Service
:
return
getServiceProtocols
(
t
.
Spec
),
nil
case
*
extensions
.
Deployment
:
return
getProtocolsInternal
(
t
.
Spec
.
Template
.
Spec
),
nil
case
*
extensionsv1beta1
.
Deployment
:
return
getProtocols
(
t
.
Spec
.
Template
.
Spec
),
nil
case
*
appsv1
.
Deployment
:
return
getProtocols
(
t
.
Spec
.
Template
.
Spec
),
nil
case
*
appsv1beta2
.
Deployment
:
return
getProtocols
(
t
.
Spec
.
Template
.
Spec
),
nil
case
*
appsv1beta1
.
Deployment
:
return
getProtocols
(
t
.
Spec
.
Template
.
Spec
),
nil
case
*
extensions
.
ReplicaSet
:
return
getProtocolsInternal
(
t
.
Spec
.
Template
.
Spec
),
nil
case
*
extensionsv1beta1
.
ReplicaSet
:
return
getProtocols
(
t
.
Spec
.
Template
.
Spec
),
nil
case
*
appsv1
.
ReplicaSet
:
return
getProtocols
(
t
.
Spec
.
Template
.
Spec
),
nil
case
*
appsv1beta2
.
ReplicaSet
:
return
getProtocols
(
t
.
Spec
.
Template
.
Spec
),
nil
default
:
return
nil
,
fmt
.
Errorf
(
"cannot extract protocols from %T"
,
object
)
}
}
func
getProtocols
(
spec
api
.
PodSpec
)
map
[
string
]
string
{
func
getProtocolsInternal
(
spec
api
.
PodSpec
)
map
[
string
]
string
{
result
:=
make
(
map
[
string
]
string
)
for
_
,
container
:=
range
spec
.
Containers
{
for
_
,
port
:=
range
container
.
Ports
{
result
[
strconv
.
Itoa
(
int
(
port
.
ContainerPort
))]
=
string
(
port
.
Protocol
)
}
}
return
result
}
// Extracts the protocols exposed by a service from the given service spec.
func
getServiceProtocolsInternal
(
spec
api
.
ServiceSpec
)
map
[
string
]
string
{
result
:=
make
(
map
[
string
]
string
)
for
_
,
servicePort
:=
range
spec
.
Ports
{
result
[
strconv
.
Itoa
(
int
(
servicePort
.
Port
))]
=
string
(
servicePort
.
Protocol
)
}
return
result
}
func
getProtocols
(
spec
corev1
.
PodSpec
)
map
[
string
]
string
{
result
:=
make
(
map
[
string
]
string
)
for
_
,
container
:=
range
spec
.
Containers
{
for
_
,
port
:=
range
container
.
Ports
{
...
...
@@ -54,7 +103,7 @@ func getProtocols(spec api.PodSpec) map[string]string {
}
// Extracts the protocols exposed by a service from the given service spec.
func
getServiceProtocols
(
spec
api
.
ServiceSpec
)
map
[
string
]
string
{
func
getServiceProtocols
(
spec
corev1
.
ServiceSpec
)
map
[
string
]
string
{
result
:=
make
(
map
[
string
]
string
)
for
_
,
servicePort
:=
range
spec
.
Ports
{
result
[
strconv
.
Itoa
(
int
(
servicePort
.
Port
))]
=
string
(
servicePort
.
Protocol
)
...
...
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