and if we do only patching
This commit is contained in:
		
							parent
							
								
									a1f90d4a32
								
							
						
					
					
						commit
						e339b8fe1d
					
				| 
						 | 
				
			
			@ -373,95 +373,6 @@ func (c *Cluster) updateService(role PostgresRole, newService *v1.Service) error
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	serviceName := util.NameFromMeta(c.Services[role].ObjectMeta)
 | 
			
		||||
	endpointName := util.NameFromMeta(c.Endpoints[role].ObjectMeta)
 | 
			
		||||
	// TODO: check if it possible to change the service type with a patch in future versions of Kubernetes
 | 
			
		||||
	if newService.Spec.Type != c.Services[role].Spec.Type {
 | 
			
		||||
		// service type has changed, need to replace the service completely.
 | 
			
		||||
		// we cannot use just patch the current service, since it may contain attributes incompatible with the new type.
 | 
			
		||||
		var (
 | 
			
		||||
			currentEndpoint *v1.Endpoints
 | 
			
		||||
			err             error
 | 
			
		||||
		)
 | 
			
		||||
 | 
			
		||||
		if role == Master {
 | 
			
		||||
			// for the master service we need to re-create the endpoint as well. Get the up-to-date version of
 | 
			
		||||
			// the addresses stored in it before the service is deleted (deletion of the service removes the endpoint)
 | 
			
		||||
			currentEndpoint, err = c.KubeClient.Endpoints(c.Namespace).Get(c.endpointName(role), metav1.GetOptions{})
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return fmt.Errorf("could not get current cluster %s endpoints: %v", role, err)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		err = c.KubeClient.Services(serviceName.Namespace).Delete(serviceName.Name, c.deleteOptions)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return fmt.Errorf("could not delete service %q: %v", serviceName, err)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// wait until the service is truly deleted
 | 
			
		||||
		c.logger.Debugf("waiting for service to be deleted")
 | 
			
		||||
 | 
			
		||||
		err = retryutil.Retry(c.OpConfig.ResourceCheckInterval, c.OpConfig.ResourceCheckTimeout,
 | 
			
		||||
			func() (bool, error) {
 | 
			
		||||
				_, err2 := c.KubeClient.Services(serviceName.Namespace).Get(serviceName.Name, metav1.GetOptions{})
 | 
			
		||||
				if err2 == nil {
 | 
			
		||||
					return false, nil
 | 
			
		||||
				}
 | 
			
		||||
				if k8sutil.ResourceNotFound(err2) {
 | 
			
		||||
					return true, nil
 | 
			
		||||
				}
 | 
			
		||||
				return false, err2
 | 
			
		||||
			})
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return fmt.Errorf("could not delete service %q: %v", serviceName, err)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// wait until the service is truly deleted
 | 
			
		||||
		c.logger.Debugf("waiting for endpoint to be deleted")
 | 
			
		||||
		if role == Master {
 | 
			
		||||
			err = retryutil.Retry(c.OpConfig.ResourceCheckInterval, c.OpConfig.ResourceCheckTimeout,
 | 
			
		||||
				func() (bool, error) {
 | 
			
		||||
					_, err2 := c.KubeClient.Endpoints(c.Namespace).Get(c.endpointName(role), metav1.GetOptions{})
 | 
			
		||||
					if err2 == nil {
 | 
			
		||||
						return false, nil
 | 
			
		||||
					}
 | 
			
		||||
					if k8sutil.ResourceNotFound(err2) {
 | 
			
		||||
						return true, nil
 | 
			
		||||
					}
 | 
			
		||||
					return false, err2
 | 
			
		||||
				})
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return fmt.Errorf("could not delete endpoint %q: %v", currentEndpoint, err)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// make sure we clear the stored service and endpoint status if the subsequent create fails.
 | 
			
		||||
		c.Services[role] = nil
 | 
			
		||||
		c.Endpoints[role] = nil
 | 
			
		||||
 | 
			
		||||
		if role == Master {
 | 
			
		||||
			// create the new endpoint using the addresses obtained from the previous one
 | 
			
		||||
			endpointSpec := c.generateEndpoint(role, currentEndpoint.Subsets)
 | 
			
		||||
			ep, err := c.KubeClient.Endpoints(endpointSpec.Namespace).Create(endpointSpec)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				c.logger.Errorf("could not create endpoint %q: %v", endpointName, err)
 | 
			
		||||
			} else {
 | 
			
		||||
				c.Endpoints[role] = ep
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// create new service
 | 
			
		||||
		svc, err := c.KubeClient.Services(serviceName.Namespace).Create(newService)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			c.logger.Errorf("could not create service %q: %v", serviceName, err)
 | 
			
		||||
		} else {
 | 
			
		||||
			c.Services[role] = svc
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if c.Services[role] == nil || c.Endpoints[role] == nil {
 | 
			
		||||
			return fmt.Errorf("could not update service")
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// update the service annotation in order to propagate ELB notation.
 | 
			
		||||
	if len(newService.ObjectMeta.Annotations) > 0 {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue