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)
}