2016-01-21 19:07:23 +00:00
/ *
2016-06-03 00:25:58 +00:00
Copyright 2016 The Kubernetes Authors .
2016-01-21 19:07:23 +00:00
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 kubectl
import (
"fmt"
"k8s.io/kubernetes/pkg/apis/extensions"
2016-09-08 15:50:53 +00:00
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
2016-10-21 22:24:05 +00:00
extensionsclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/internalversion"
2016-10-10 11:07:38 +00:00
"k8s.io/kubernetes/pkg/controller/deployment/util"
2016-11-21 02:55:31 +00:00
"k8s.io/kubernetes/pkg/runtime/schema"
2016-01-21 19:07:23 +00:00
)
2016-10-10 11:07:38 +00:00
// StatusViewer provides an interface for resources that have rollout status.
2016-01-21 19:07:23 +00:00
type StatusViewer interface {
2016-10-10 11:07:38 +00:00
Status ( namespace , name string , revision int64 ) ( string , bool , error )
2016-01-21 19:07:23 +00:00
}
2016-11-21 02:55:31 +00:00
func StatusViewerFor ( kind schema . GroupKind , c internalclientset . Interface ) ( StatusViewer , error ) {
2016-01-21 19:07:23 +00:00
switch kind {
case extensions . Kind ( "Deployment" ) :
return & DeploymentStatusViewer { c . Extensions ( ) } , nil
}
return nil , fmt . Errorf ( "no status viewer has been implemented for %v" , kind )
}
type DeploymentStatusViewer struct {
2016-09-08 15:50:53 +00:00
c extensionsclient . DeploymentsGetter
2016-01-21 19:07:23 +00:00
}
// Status returns a message describing deployment status, and a bool value indicating if the status is considered done
2016-10-10 11:07:38 +00:00
func ( s * DeploymentStatusViewer ) Status ( namespace , name string , revision int64 ) ( string , bool , error ) {
2016-01-21 19:07:23 +00:00
deployment , err := s . c . Deployments ( namespace ) . Get ( name )
if err != nil {
return "" , false , err
}
2016-10-10 11:07:38 +00:00
if revision > 0 {
deploymentRev , err := util . Revision ( deployment )
if err != nil {
return "" , false , fmt . Errorf ( "cannot get the revision of deployment %q: %v" , deployment . Name , err )
}
if revision != deploymentRev {
return "" , false , fmt . Errorf ( "desired revision (%d) is different from the running revision (%d)" , revision , deploymentRev )
}
}
2016-01-21 19:07:23 +00:00
if deployment . Generation <= deployment . Status . ObservedGeneration {
2016-11-18 20:58:22 +00:00
cond := util . GetDeploymentConditionInternal ( deployment . Status , extensions . DeploymentProgressing )
2016-09-27 14:48:39 +00:00
if cond != nil && cond . Reason == util . TimedOutReason {
return "" , false , fmt . Errorf ( "deployment %q exceeded its progress deadline" , name )
}
2016-08-26 07:21:43 +00:00
if deployment . Status . UpdatedReplicas < deployment . Spec . Replicas {
return fmt . Sprintf ( "Waiting for rollout to finish: %d out of %d new replicas have been updated...\n" , deployment . Status . UpdatedReplicas , deployment . Spec . Replicas ) , false , nil
2016-01-21 19:07:23 +00:00
}
2016-08-26 07:21:43 +00:00
if deployment . Status . Replicas > deployment . Status . UpdatedReplicas {
return fmt . Sprintf ( "Waiting for rollout to finish: %d old replicas are pending termination...\n" , deployment . Status . Replicas - deployment . Status . UpdatedReplicas ) , false , nil
}
if deployment . Status . AvailableReplicas < deployment . Status . UpdatedReplicas {
return fmt . Sprintf ( "Waiting for rollout to finish: %d of %d updated replicas are available...\n" , deployment . Status . AvailableReplicas , deployment . Status . UpdatedReplicas ) , false , nil
}
2016-10-10 11:07:38 +00:00
return fmt . Sprintf ( "deployment %q successfully rolled out\n" , name ) , true , nil
2016-01-21 19:07:23 +00:00
}
return fmt . Sprintf ( "Waiting for deployment spec update to be observed...\n" ) , false , nil
}