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
f061f74f
Commit
f061f74f
authored
Aug 22, 2016
by
Michael Fraenkel
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Use scale subresource
- Use scale subresource for ReplicationController, ReplicaSet and Deployment.
parent
75fba4c9
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
71 additions
and
61 deletions
+71
-61
fixture.go
pkg/client/unversioned/testclient/fixture.go
+13
-4
scale.go
pkg/kubectl/scale.go
+30
-54
scale_test.go
pkg/kubectl/scale_test.go
+0
-0
stop_test.go
pkg/kubectl/stop_test.go
+28
-3
No files found.
pkg/client/unversioned/testclient/fixture.go
View file @
f061f74f
...
...
@@ -54,13 +54,22 @@ type ObjectScheme interface {
// Object or error that matches the requested action. For instance, list-replicationControllers
// should attempt to return a list of replication controllers. This method delegates to the
// ObjectRetriever interface to satisfy retrieval of lists or retrieval of single items.
// TODO: add support for sub resources
func
ObjectReaction
(
o
ObjectRetriever
,
mapper
meta
.
RESTMapper
)
ReactionFunc
{
return
func
(
action
Action
)
(
bool
,
runtime
.
Object
,
error
)
{
kind
,
err
:=
mapper
.
KindFor
(
unversioned
.
GroupVersionResource
{
Resource
:
action
.
GetResource
()})
if
err
!=
nil
{
return
false
,
nil
,
fmt
.
Errorf
(
"unrecognized action %s: %v"
,
action
.
GetResource
(),
err
)
var
err
error
var
kind
unversioned
.
GroupVersionKind
if
action
.
GetSubresource
()
!=
""
{
kind
,
err
=
mapper
.
KindFor
(
unversioned
.
GroupVersionResource
{
Resource
:
action
.
GetSubresource
()})
if
err
!=
nil
{
return
false
,
nil
,
fmt
.
Errorf
(
"unrecognized subresource action %s/%s: %v"
,
action
.
GetResource
(),
action
.
GetSubresource
(),
err
)
}
}
else
{
kind
,
err
=
mapper
.
KindFor
(
unversioned
.
GroupVersionResource
{
Resource
:
action
.
GetResource
()})
if
err
!=
nil
{
return
false
,
nil
,
fmt
.
Errorf
(
"unrecognized action %s: %v"
,
action
.
GetResource
(),
err
)
}
}
// TODO: have mapper return a Kind for a subresource?
...
...
pkg/kubectl/scale.go
View file @
f061f74f
...
...
@@ -143,13 +143,13 @@ func (precondition *ScalePrecondition) ValidatePetSet(ps *apps.PetSet) error {
return
nil
}
// Validate
ReplicationController
ensures that the preconditions match. Returns nil if they are valid, an error otherwise
func
(
precondition
*
ScalePrecondition
)
Validate
ReplicationController
(
controller
*
api
.
ReplicationController
)
error
{
if
precondition
.
Size
!=
-
1
&&
int
(
controller
.
Spec
.
Replicas
)
!=
precondition
.
Size
{
return
PreconditionError
{
"replicas"
,
strconv
.
Itoa
(
precondition
.
Size
),
strconv
.
Itoa
(
int
(
controller
.
Spec
.
Replicas
))}
// Validate
Scale
ensures that the preconditions match. Returns nil if they are valid, an error otherwise
func
(
precondition
*
ScalePrecondition
)
Validate
Scale
(
scale
*
extensions
.
Scale
)
error
{
if
precondition
.
Size
!=
-
1
&&
int
(
scale
.
Spec
.
Replicas
)
!=
precondition
.
Size
{
return
PreconditionError
{
"replicas"
,
strconv
.
Itoa
(
precondition
.
Size
),
strconv
.
Itoa
(
int
(
scale
.
Spec
.
Replicas
))}
}
if
len
(
precondition
.
ResourceVersion
)
!=
0
&&
controller
.
ResourceVersion
!=
precondition
.
ResourceVersion
{
return
PreconditionError
{
"resource version"
,
precondition
.
ResourceVersion
,
controller
.
ResourceVersion
}
if
len
(
precondition
.
ResourceVersion
)
!=
0
&&
scale
.
ResourceVersion
!=
precondition
.
ResourceVersion
{
return
PreconditionError
{
"resource version"
,
precondition
.
ResourceVersion
,
scale
.
ResourceVersion
}
}
return
nil
}
...
...
@@ -161,24 +161,24 @@ type ReplicationControllerScaler struct {
// ScaleSimple does a simple one-shot attempt at scaling. It returns the
// resourceVersion of the replication controller if the update is successful.
func
(
scaler
*
ReplicationControllerScaler
)
ScaleSimple
(
namespace
,
name
string
,
preconditions
*
ScalePrecondition
,
newSize
uint
)
(
string
,
error
)
{
controller
,
err
:=
scaler
.
c
.
ReplicationControllers
(
namespace
)
.
Get
(
name
)
sc
:=
scaler
.
c
.
Extensions
()
.
Scales
(
namespace
)
scale
,
err
:=
sc
.
Get
(
"ReplicationController"
,
name
)
if
err
!=
nil
{
return
""
,
ScaleError
{
ScaleGetFailure
,
"Unknown"
,
err
}
}
if
preconditions
!=
nil
{
if
err
:=
preconditions
.
Validate
ReplicationController
(
controller
);
err
!=
nil
{
if
err
:=
preconditions
.
Validate
Scale
(
scale
);
err
!=
nil
{
return
""
,
err
}
}
controller
.
Spec
.
Replicas
=
int32
(
newSize
)
updatedRC
,
err
:=
scaler
.
c
.
ReplicationControllers
(
namespace
)
.
Update
(
controller
)
if
err
!=
nil
{
scale
.
Spec
.
Replicas
=
int32
(
newSize
)
if
_
,
err
:=
sc
.
Update
(
"ReplicationController"
,
scale
);
err
!=
nil
{
if
errors
.
IsConflict
(
err
)
{
return
""
,
ScaleError
{
ScaleUpdateConflictFailure
,
controller
.
ResourceVersion
,
err
}
return
""
,
ScaleError
{
ScaleUpdateConflictFailure
,
scale
.
ResourceVersion
,
err
}
}
return
""
,
ScaleError
{
ScaleUpdateFailure
,
controller
.
ResourceVersion
,
err
}
return
""
,
ScaleError
{
ScaleUpdateFailure
,
scale
.
ResourceVersion
,
err
}
}
return
updatedRC
.
ObjectMeta
.
ResourceVersion
,
nil
return
scale
.
ObjectMeta
.
ResourceVersion
,
nil
}
// Scale updates a ReplicationController to a new size, with optional precondition check (if preconditions is not nil),
...
...
@@ -241,17 +241,6 @@ func (scaler *ReplicationControllerScaler) Scale(namespace, name string, newSize
return
nil
}
// ValidateReplicaSet ensures that the preconditions match. Returns nil if they are valid, an error otherwise
func
(
precondition
*
ScalePrecondition
)
ValidateReplicaSet
(
replicaSet
*
extensions
.
ReplicaSet
)
error
{
if
precondition
.
Size
!=
-
1
&&
int
(
replicaSet
.
Spec
.
Replicas
)
!=
precondition
.
Size
{
return
PreconditionError
{
"replicas"
,
strconv
.
Itoa
(
precondition
.
Size
),
strconv
.
Itoa
(
int
(
replicaSet
.
Spec
.
Replicas
))}
}
if
len
(
precondition
.
ResourceVersion
)
!=
0
&&
replicaSet
.
ResourceVersion
!=
precondition
.
ResourceVersion
{
return
PreconditionError
{
"resource version"
,
precondition
.
ResourceVersion
,
replicaSet
.
ResourceVersion
}
}
return
nil
}
type
ReplicaSetScaler
struct
{
c
client
.
ExtensionsInterface
}
...
...
@@ -259,24 +248,24 @@ type ReplicaSetScaler struct {
// ScaleSimple does a simple one-shot attempt at scaling. It returns the
// resourceVersion of the replicaset if the update is successful.
func
(
scaler
*
ReplicaSetScaler
)
ScaleSimple
(
namespace
,
name
string
,
preconditions
*
ScalePrecondition
,
newSize
uint
)
(
string
,
error
)
{
rs
,
err
:=
scaler
.
c
.
ReplicaSets
(
namespace
)
.
Get
(
name
)
sc
:=
scaler
.
c
.
Scales
(
namespace
)
scale
,
err
:=
sc
.
Get
(
"ReplicaSet"
,
name
)
if
err
!=
nil
{
return
""
,
ScaleError
{
ScaleGetFailure
,
"Unknown"
,
err
}
}
if
preconditions
!=
nil
{
if
err
:=
preconditions
.
Validate
ReplicaSet
(
rs
);
err
!=
nil
{
if
err
:=
preconditions
.
Validate
Scale
(
scale
);
err
!=
nil
{
return
""
,
err
}
}
rs
.
Spec
.
Replicas
=
int32
(
newSize
)
updatedRS
,
err
:=
scaler
.
c
.
ReplicaSets
(
namespace
)
.
Update
(
rs
)
if
err
!=
nil
{
scale
.
Spec
.
Replicas
=
int32
(
newSize
)
if
_
,
err
:=
sc
.
Update
(
"ReplicaSet"
,
scale
);
err
!=
nil
{
if
errors
.
IsConflict
(
err
)
{
return
""
,
ScaleError
{
ScaleUpdateConflictFailure
,
rs
.
ResourceVersion
,
err
}
return
""
,
ScaleError
{
ScaleUpdateConflictFailure
,
scale
.
ResourceVersion
,
err
}
}
return
""
,
ScaleError
{
ScaleUpdateFailure
,
rs
.
ResourceVersion
,
err
}
return
""
,
ScaleError
{
ScaleUpdateFailure
,
scale
.
ResourceVersion
,
err
}
}
return
updatedRS
.
ObjectMeta
.
ResourceVersion
,
nil
return
scale
.
ObjectMeta
.
ResourceVersion
,
nil
}
// Scale updates a ReplicaSet to a new size, with optional precondition check (if preconditions is
...
...
@@ -433,17 +422,6 @@ func (scaler *JobScaler) Scale(namespace, name string, newSize uint, preconditio
return
nil
}
// ValidateDeployment ensures that the preconditions match. Returns nil if they are valid, an error otherwise.
func
(
precondition
*
ScalePrecondition
)
ValidateDeployment
(
deployment
*
extensions
.
Deployment
)
error
{
if
precondition
.
Size
!=
-
1
&&
int
(
deployment
.
Spec
.
Replicas
)
!=
precondition
.
Size
{
return
PreconditionError
{
"replicas"
,
strconv
.
Itoa
(
precondition
.
Size
),
strconv
.
Itoa
(
int
(
deployment
.
Spec
.
Replicas
))}
}
if
len
(
precondition
.
ResourceVersion
)
!=
0
&&
deployment
.
ResourceVersion
!=
precondition
.
ResourceVersion
{
return
PreconditionError
{
"resource version"
,
precondition
.
ResourceVersion
,
deployment
.
ResourceVersion
}
}
return
nil
}
type
DeploymentScaler
struct
{
c
client
.
ExtensionsInterface
}
...
...
@@ -452,27 +430,25 @@ type DeploymentScaler struct {
// count. It returns the resourceVersion of the deployment if the update is
// successful.
func
(
scaler
*
DeploymentScaler
)
ScaleSimple
(
namespace
,
name
string
,
preconditions
*
ScalePrecondition
,
newSize
uint
)
(
string
,
error
)
{
deployment
,
err
:=
scaler
.
c
.
Deployments
(
namespace
)
.
Get
(
name
)
sc
:=
scaler
.
c
.
Scales
(
namespace
)
scale
,
err
:=
sc
.
Get
(
"Deployment"
,
name
)
if
err
!=
nil
{
return
""
,
ScaleError
{
ScaleGetFailure
,
"Unknown"
,
err
}
}
if
preconditions
!=
nil
{
if
err
:=
preconditions
.
Validate
Deployment
(
deployment
);
err
!=
nil
{
if
err
:=
preconditions
.
Validate
Scale
(
scale
);
err
!=
nil
{
return
""
,
err
}
}
// TODO(madhusudancs): Fix this when Scale group issues are resolved (see issue #18528).
// For now I'm falling back to regular Deployment update operation.
deployment
.
Spec
.
Replicas
=
int32
(
newSize
)
updatedDeployment
,
err
:=
scaler
.
c
.
Deployments
(
namespace
)
.
Update
(
deployment
)
if
err
!=
nil
{
scale
.
Spec
.
Replicas
=
int32
(
newSize
)
if
_
,
err
:=
sc
.
Update
(
"Deployment"
,
scale
);
err
!=
nil
{
if
errors
.
IsConflict
(
err
)
{
return
""
,
ScaleError
{
ScaleUpdateConflictFailure
,
deployment
.
ResourceVersion
,
err
}
return
""
,
ScaleError
{
ScaleUpdateConflictFailure
,
scale
.
ResourceVersion
,
err
}
}
return
""
,
ScaleError
{
ScaleUpdateFailure
,
deployment
.
ResourceVersion
,
err
}
return
""
,
ScaleError
{
ScaleUpdateFailure
,
scale
.
ResourceVersion
,
err
}
}
return
updatedDeployment
.
ObjectMeta
.
ResourceVersion
,
nil
return
scale
.
ObjectMeta
.
ResourceVersion
,
nil
}
// Scale updates a deployment to a new size, with optional precondition check (if preconditions is not nil),
...
...
pkg/kubectl/scale_test.go
View file @
f061f74f
This diff is collapsed.
Click to expand it.
pkg/kubectl/stop_test.go
View file @
f061f74f
...
...
@@ -68,6 +68,11 @@ func TestReplicationControllerStop(t *testing.T) {
},
},
},
&
extensions
.
Scale
{
Spec
:
extensions
.
ScaleSpec
{
Replicas
:
0
,
},
},
},
StopError
:
nil
,
ExpectedActions
:
[]
string
{
"get"
,
"list"
,
"get"
,
"update"
,
"get"
,
"delete"
},
...
...
@@ -106,6 +111,11 @@ func TestReplicationControllerStop(t *testing.T) {
},
},
},
&
extensions
.
Scale
{
Spec
:
extensions
.
ScaleSpec
{
Replicas
:
0
,
},
},
},
StopError
:
nil
,
ExpectedActions
:
[]
string
{
"get"
,
"list"
,
"get"
,
"update"
,
"get"
,
"delete"
},
...
...
@@ -268,7 +278,7 @@ func TestReplicationControllerStop(t *testing.T) {
continue
}
for
i
,
verb
:=
range
test
.
ExpectedActions
{
if
actions
[
i
]
.
GetResource
()
!=
"replicationcontrollers"
{
if
actions
[
i
]
.
GetResource
()
!=
"replicationcontrollers"
&&
actions
[
i
]
.
GetSubresource
()
!=
"scale"
{
t
.
Errorf
(
"%s unexpected action: %+v, expected %s-replicationController"
,
test
.
Name
,
actions
[
i
],
verb
)
}
if
actions
[
i
]
.
GetVerb
()
!=
verb
{
...
...
@@ -314,6 +324,11 @@ func TestReplicaSetStop(t *testing.T) {
},
},
},
&
extensions
.
Scale
{
Spec
:
extensions
.
ScaleSpec
{
Replicas
:
0
,
},
},
},
StopError
:
nil
,
ExpectedActions
:
[]
string
{
"get"
,
"get"
,
"update"
,
"get"
,
"get"
,
"delete"
},
...
...
@@ -355,6 +370,11 @@ func TestReplicaSetStop(t *testing.T) {
},
},
},
&
extensions
.
Scale
{
Spec
:
extensions
.
ScaleSpec
{
Replicas
:
0
,
},
},
},
StopError
:
nil
,
ExpectedActions
:
[]
string
{
"get"
,
"get"
,
"update"
,
"get"
,
"get"
,
"delete"
},
...
...
@@ -378,7 +398,7 @@ func TestReplicaSetStop(t *testing.T) {
continue
}
for
i
,
verb
:=
range
test
.
ExpectedActions
{
if
actions
[
i
]
.
GetResource
()
!=
"replicasets"
{
if
actions
[
i
]
.
GetResource
()
!=
"replicasets"
&&
actions
[
i
]
.
GetSubresource
()
!=
"scale"
{
t
.
Errorf
(
"%s unexpected action: %+v, expected %s-replicaSet"
,
test
.
Name
,
actions
[
i
],
verb
)
}
if
actions
[
i
]
.
GetVerb
()
!=
verb
{
...
...
@@ -570,6 +590,11 @@ func TestDeploymentStop(t *testing.T) {
},
},
},
&
extensions
.
Scale
{
Spec
:
extensions
.
ScaleSpec
{
Replicas
:
0
,
},
},
},
StopError
:
nil
,
ExpectedActions
:
[]
string
{
"get:deployments"
,
"update:deployments"
,
...
...
@@ -598,7 +623,7 @@ func TestDeploymentStop(t *testing.T) {
if
actions
[
i
]
.
GetVerb
()
!=
action
[
0
]
{
t
.
Errorf
(
"%s unexpected verb: %+v, expected %s"
,
test
.
Name
,
actions
[
i
],
expAction
)
}
if
actions
[
i
]
.
GetResource
()
!=
action
[
1
]
{
if
actions
[
i
]
.
GetResource
()
!=
action
[
1
]
&&
actions
[
i
]
.
GetSubresource
()
!=
"scale"
{
t
.
Errorf
(
"%s unexpected resource: %+v, expected %s"
,
test
.
Name
,
actions
[
i
],
expAction
)
}
if
len
(
action
)
==
3
&&
actions
[
i
]
.
GetSubresource
()
!=
action
[
2
]
{
...
...
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