2015-01-09 23:53:06 +00:00
/ *
Copyright 2014 Google Inc . All rights reserved .
Licensed under the Apache License , Version 2.0 ( the "License" ) ;
you may not use this file except in compliance with the License .
You may obtain a copy of the License at
http : //www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing , software
distributed under the License is distributed on an "AS IS" BASIS ,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
See the License for the specific language governing permissions and
limitations under the License .
* /
package cmd
import (
"fmt"
"io"
2015-03-01 02:40:57 +00:00
"time"
2015-01-09 23:53:06 +00:00
2015-04-11 06:06:05 +00:00
"github.com/spf13/cobra"
2015-03-01 02:40:57 +00:00
"github.com/GoogleCloudPlatform/kubernetes/pkg/controller"
2015-01-09 23:53:06 +00:00
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubectl"
2015-04-07 18:21:25 +00:00
cmdutil "github.com/GoogleCloudPlatform/kubernetes/pkg/kubectl/cmd/util"
2015-04-11 06:06:05 +00:00
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubectl/resource"
2015-03-01 02:40:57 +00:00
"github.com/GoogleCloudPlatform/kubernetes/pkg/util/wait"
2015-01-09 23:53:06 +00:00
)
2015-02-20 21:28:43 +00:00
const (
resize_long = ` Set a new size for a Replication Controller .
2015-01-09 23:53:06 +00:00
Resize also allows users to specify one or more preconditions for the resize action .
2015-02-03 17:59:21 +00:00
If -- current - replicas or -- resource - version is specified , it is validated before the
resize is attempted , and it is guaranteed that the precondition holds true when the
2015-02-20 21:28:43 +00:00
resize is sent to the server . `
resize_example = ` // Resize replication controller named 'foo' to 3.
$ kubectl resize -- replicas = 3 replicationcontrollers foo
2015-01-09 23:53:06 +00:00
2015-02-20 21:28:43 +00:00
// If the replication controller named foo's current size is 2, resize foo to 3.
$ kubectl resize -- current - replicas = 2 -- replicas = 3 replicationcontrollers foo `
2015-03-01 02:40:57 +00:00
retryFrequency = controller . DefaultSyncPeriod / 100
retryTimeout = 10 * time . Second
2015-02-20 21:28:43 +00:00
)
2015-02-03 17:59:21 +00:00
2015-04-07 18:21:25 +00:00
func NewCmdResize ( f * cmdutil . Factory , out io . Writer ) * cobra . Command {
2015-02-20 21:28:43 +00:00
cmd := & cobra . Command {
2015-03-11 17:22:08 +00:00
Use : "resize [--resource-version=version] [--current-replicas=count] --replicas=COUNT RESOURCE ID" ,
2015-02-20 21:28:43 +00:00
Short : "Set a new size for a Replication Controller." ,
Long : resize_long ,
Example : resize_example ,
2015-01-09 23:53:06 +00:00
Run : func ( cmd * cobra . Command , args [ ] string ) {
2015-03-09 22:08:16 +00:00
err := RunResize ( f , out , cmd , args )
2015-04-07 18:21:25 +00:00
cmdutil . CheckErr ( err )
2015-01-09 23:53:06 +00:00
} ,
}
2015-02-03 17:59:21 +00:00
cmd . Flags ( ) . String ( "resource-version" , "" , "Precondition for resource version. Requires that the current resource version match this value in order to resize." )
cmd . Flags ( ) . Int ( "current-replicas" , - 1 , "Precondition for current size. Requires that the current size of the replication controller match this value in order to resize." )
cmd . Flags ( ) . Int ( "replicas" , - 1 , "The new desired number of replicas. Required." )
2015-01-09 23:53:06 +00:00
return cmd
}
2015-03-09 22:08:16 +00:00
2015-04-07 18:21:25 +00:00
func RunResize ( f * cmdutil . Factory , out io . Writer , cmd * cobra . Command , args [ ] string ) error {
count := cmdutil . GetFlagInt ( cmd , "replicas" )
2015-03-09 22:08:16 +00:00
if len ( args ) != 2 || count < 0 {
2015-04-07 18:21:25 +00:00
return cmdutil . UsageError ( cmd , "--replicas=COUNT RESOURCE ID" )
2015-03-09 22:08:16 +00:00
}
2015-03-14 10:45:18 +00:00
cmdNamespace , err := f . DefaultNamespace ( )
2015-03-09 22:08:16 +00:00
if err != nil {
return err
}
2015-04-11 06:06:05 +00:00
mapper , typer := f . Object ( )
r := resource . NewBuilder ( mapper , typer , f . ClientMapperForCommand ( ) ) .
ContinueOnError ( ) .
NamespaceParam ( cmdNamespace ) . DefaultNamespace ( ) .
ResourceTypeOrNameArgs ( false , args ... ) .
Flatten ( ) .
Do ( )
err = r . Err ( )
if err != nil {
return err
}
mapping , err := r . ResourceMapping ( )
if err != nil {
return err
}
infos , err := r . Infos ( )
2015-03-09 22:08:16 +00:00
if err != nil {
return err
}
2015-04-11 06:06:05 +00:00
info := infos [ 0 ]
2015-03-09 22:08:16 +00:00
2015-03-14 10:45:18 +00:00
resizer , err := f . Resizer ( mapping )
2015-03-09 22:08:16 +00:00
if err != nil {
return err
}
2015-04-07 18:21:25 +00:00
resourceVersion := cmdutil . GetFlagString ( cmd , "resource-version" )
currentSize := cmdutil . GetFlagInt ( cmd , "current-replicas" )
2015-03-09 22:08:16 +00:00
precondition := & kubectl . ResizePrecondition { currentSize , resourceVersion }
2015-04-11 06:06:05 +00:00
cond := kubectl . ResizeCondition ( resizer , precondition , info . Namespace , info . Name , uint ( count ) )
2015-03-09 22:08:16 +00:00
msg := "resized"
if err = wait . Poll ( retryFrequency , retryTimeout , cond ) ; err != nil {
msg = fmt . Sprintf ( "Failed to resize controller in spite of retrying for %s" , retryTimeout )
if err != nil {
return err
}
}
fmt . Fprintf ( out , "%s\n" , msg )
return nil
}