func()

in pkg/controller/direct/metastore/service_controller.go [195:266]


func (a *MetastoreServiceAdapter) Update(ctx context.Context, updateOp *directbase.UpdateOperation) error {
	log := klog.FromContext(ctx)
	log.V(2).Info("updating MetastoreService", "name", a.id)

	if err := a.resolveReferences(ctx); err != nil {
		return err
	}

	mapCtx := &direct.MapContext{}
	desired := a.desired.DeepCopy()
	resource := MetastoreServiceSpec_ToProto(mapCtx, &desired.Spec)
	if mapCtx.Err() != nil {
		return mapCtx.Err()
	}

	paths := []string{}
	if desired.Spec.Labels != nil && !reflect.DeepEqual(resource.Labels, a.actual.Labels) {
		paths = append(paths, "labels")
	}
	if desired.Spec.Port != nil && !reflect.DeepEqual(resource.Port, a.actual.Port) {
		paths = append(paths, "port")
	}
	if desired.Spec.Tier != nil && !reflect.DeepEqual(resource.Tier, a.actual.Tier) {
		paths = append(paths, "tier")
	}
	if desired.Spec.MaintenanceWindow != nil && !reflect.DeepEqual(resource.MaintenanceWindow, a.actual.MaintenanceWindow) {
		paths = append(paths, "maintenance_window")
	}
	if desired.Spec.HiveMetastoreConfig != nil && !reflect.DeepEqual(resource.GetHiveMetastoreConfig(), a.actual.GetHiveMetastoreConfig()) {
		// TODO(kcc): Add support for hiveMetastoreConfig.configOverrides and auxiliaryVersions
		paths = append(paths, "hive_metastore_config.kerberos_config")
		// Endpoint protocol is output_only
	}
	if desired.Spec.NetworkConfig != nil && !reflect.DeepEqual(resource.NetworkConfig, a.actual.NetworkConfig) {
		paths = append(paths, "network_config")
	}
	if desired.Spec.TelemetryConfig != nil && !reflect.DeepEqual(resource.TelemetryConfig, a.actual.TelemetryConfig) {
		paths = append(paths, "telemetry_config")
	}
	if desired.Spec.ScalingConfig != nil && !reflect.DeepEqual(resource.ScalingConfig, a.actual.ScalingConfig) {
		paths = append(paths, "scaling_config")
	}

	var updated *pb.Service
	if len(paths) == 0 {
		log.V(2).Info("no field needs update", "name", a.id)
		updated = a.actual
	} else {
		resource.Name = a.id.String() // we need to set the name so that GCP API can identify the resource
		req := &pb.UpdateServiceRequest{
			Service:    resource,
			UpdateMask: &fieldmaskpb.FieldMask{Paths: paths},
		}
		op, err := a.gcpClient.UpdateService(ctx, req)
		if err != nil {
			return fmt.Errorf("updating MetastoreService %s: %w", a.id, err)
		}
		updated, err = op.Wait(ctx)
		if err != nil {
			return fmt.Errorf("MetastoreService %s waiting update: %w", a.id, err)
		}
		log.V(2).Info("successfully updated MetastoreService", "name", a.id)
	}

	status := &krm.MetastoreServiceStatus{}
	status.ObservedState = MetastoreServiceObservedState_FromProto(mapCtx, updated)
	if mapCtx.Err() != nil {
		return mapCtx.Err()
	}
	status.ExternalRef = direct.LazyPtr(a.id.String())
	return updateOp.UpdateStatus(ctx, status, nil)
}