// getAllReplicaSetsAndSyncRevision returns all the replica sets for the provided deployment (new and all old), with new RS's and deployment's revision updated. // 1. Get all old RSes this deployment targets, and calculate the max revision number among them (maxOldV). // 2. Get new RS this deployment targets (whose pod template matches deployment's), and update new RS's revision number to (maxOldV + 1), // only if its revision number is smaller than (maxOldV + 1). If this step failed, we'll update it in the next deployment sync loop. // 3. Copy new RS's revision number to deployment (update deployment's revision). If this step failed, we'll update it in the next deployment sync loop. // Note that currently the deployment controller is using caches to avoid querying the server for reads. // This may lead to stale reads of replica sets, thus incorrect deployment status. func (dc *DeploymentController) getAllReplicaSetsAndSyncRevision(deployment *extensions.Deployment, createIfNotExisted bool) (*extensions.ReplicaSet, []*extensions.ReplicaSet, error) { // List the deployment's RSes & Pods and apply pod-template-hash info to deployment's adopted RSes/Pods rsList, podList, err := dc.rsAndPodsWithHashKeySynced(deployment) if err != nil { return nil, nil, fmt.Errorf("error labeling replica sets and pods with pod-template-hash: %v", err) } _, allOldRSs, err := deploymentutil.FindOldReplicaSets(deployment, rsList, podList) if err != nil { return nil, nil, err } // Calculate the max revision number among all old RSes maxOldV := maxRevision(allOldRSs) // Get new replica set with the updated revision number newRS, err := dc.getNewReplicaSet(deployment, rsList, maxOldV, allOldRSs, createIfNotExisted) if err != nil { return nil, nil, err } // Sync deployment's revision number with new replica set if newRS != nil && newRS.Annotations != nil && len(newRS.Annotations[deploymentutil.RevisionAnnotation]) > 0 && (deployment.Annotations == nil || deployment.Annotations[deploymentutil.RevisionAnnotation] != newRS.Annotations[deploymentutil.RevisionAnnotation]) { if err = dc.updateDeploymentRevision(deployment, newRS.Annotations[deploymentutil.RevisionAnnotation]); err != nil { glog.V(4).Infof("Error: %v. Unable to update deployment revision, will retry later.", err) } } return newRS, allOldRSs, nil }
// GetDeploymentDetail returns model object of deployment and error, if any. func GetDeploymentDetail(client client.Interface, namespace string, name string) (*DeploymentDetail, error) { log.Printf("Getting details of %s deployment in %s namespace", name, namespace) deployment, err := client.Extensions().Deployments(namespace).Get(name) if err != nil { return nil, err } selector, err := unversioned.LabelSelectorAsSelector(deployment.Spec.Selector) if err != nil { return nil, err } options := api.ListOptions{LabelSelector: selector} channels := &common.ResourceChannels{ ReplicaSetList: common.GetReplicaSetListChannelWithOptions(client.Extensions(), common.NewSameNamespaceQuery(namespace), options, 1), PodList: common.GetPodListChannelWithOptions(client, common.NewSameNamespaceQuery(namespace), options, 1), EventList: common.GetEventListChannelWithOptions(client, common.NewSameNamespaceQuery(namespace), options, 1), } rsList := <-channels.ReplicaSetList.List if err := <-channels.ReplicaSetList.Error; err != nil { return nil, err } podList := <-channels.PodList.List if err := <-channels.PodList.Error; err != nil { return nil, err } eventList := <-channels.EventList.List if err := <-channels.EventList.Error; err != nil { return nil, err } oldReplicaSets, _, err := deploymentutil.FindOldReplicaSets(deployment, rsList.Items, podList) if err != nil { return nil, err } newReplicaSet, err := deploymentutil.FindNewReplicaSet(deployment, rsList.Items) if err != nil { return nil, err } events, err := GetDeploymentEvents(eventList.Items, namespace, name) if err != nil { return nil, err } return getDeploymentDetail(deployment, oldReplicaSets, newReplicaSet, podList.Items, events, eventList.Items), nil }
// GetDeploymentEvents returns model events for a deployment with the given name in the given // namespace func GetDeploymentOldReplicaSets(client client.Interface, dsQuery *dataselect.DataSelectQuery, namespace string, deploymentName string) (*replicaset.ReplicaSetList, error) { deployment, err := client.Extensions().Deployments(namespace).Get(deploymentName) if err != nil { return nil, err } selector, err := unversioned.LabelSelectorAsSelector(deployment.Spec.Selector) if err != nil { return nil, err } options := api.ListOptions{LabelSelector: selector} channels := &common.ResourceChannels{ ReplicaSetList: common.GetReplicaSetListChannelWithOptions(client.Extensions(), common.NewSameNamespaceQuery(namespace), options, 1), PodList: common.GetPodListChannelWithOptions(client, common.NewSameNamespaceQuery(namespace), options, 1), EventList: common.GetEventListChannelWithOptions(client, common.NewSameNamespaceQuery(namespace), options, 1), } rawRs := <-channels.ReplicaSetList.List if err := <-channels.ReplicaSetList.Error; err != nil { return nil, err } rawPods := <-channels.PodList.List if err := <-channels.PodList.Error; err != nil { return nil, err } rawEvents := <-channels.EventList.List if err := <-channels.EventList.Error; err != nil { return nil, err } oldRs, _, err := deploymentutil.FindOldReplicaSets(deployment, rawRs.Items, rawPods) if err != nil { return nil, err } oldReplicaSets := make([]extensions.ReplicaSet, len(oldRs)) for i, replicaSet := range oldRs { oldReplicaSets[i] = *replicaSet } oldReplicaSetList := replicaset.CreateReplicaSetList(oldReplicaSets, rawPods.Items, rawEvents.Items, dsQuery, nil) return oldReplicaSetList, nil }