in internal/onetime/status/status.go [551:652]
func (s *Status) backintStatus(ctx context.Context) *spb.ServiceStatus {
status := &spb.ServiceStatus{
Name: "Backint",
State: spb.State_UNSPECIFIED_STATE,
}
if s.BackintParametersPath == "" {
status.UnspecifiedStateMessage = "Backint parameters file not specified / Disabled"
return status
}
p := backintconfiguration.Parameters{
User: "Status OTE",
Function: "diagnose",
ParamFile: s.BackintParametersPath,
}
config, err := p.ParseArgsAndValidateConfig(s.backintReadFile, s.backintReadFile)
if err != nil {
log.CtxLogger(ctx).Errorw("Could not parse backint parameters", "error", err)
status.State = spb.State_ERROR_STATE
status.ErrorMessage = err.Error()
return status
}
printConfig := backintconfiguration.ConfigToPrint(config)
status.State = spb.State_SUCCESS_STATE
log.CtxLogger(ctx).Infof("Backint parameters: %v", printConfig)
// Due to the large number of config values, print the important ones always
// and the others only if the user has overridden the default.
status.ConfigValues = []*spb.ConfigValue{
configValue("bucket", printConfig.Bucket, ""),
configValue("log_to_cloud", printConfig.LogToCloud.GetValue(), true),
configValue("param_file", printConfig.ParamFile, ""),
}
overrideOnlyConfigValues := []*spb.ConfigValue{
configValue("buffer_size_mb", printConfig.BufferSizeMb, 100),
configValue("client_endpoint", printConfig.ClientEndpoint, ""),
configValue("compress", printConfig.Compress, false),
configValue("custom_time", printConfig.CustomTime, ""),
configValue("encryption_key", printConfig.EncryptionKey, ""),
configValue("folder_prefix", printConfig.FolderPrefix, ""),
configValue("file_read_timeout_ms", printConfig.FileReadTimeoutMs, 60000),
configValue("kms_key", printConfig.KmsKey, ""),
configValue("metadata", printConfig.Metadata, map[string]string{}),
configValue("parallel_streams", printConfig.ParallelStreams, 1),
configValue("parallel_recovery_streams", printConfig.ParallelRecoveryStreams, 0),
configValue("rate_limit_mb", printConfig.RateLimitMb, 0),
configValue("recovery_bucket", printConfig.RecoveryBucket, ""),
configValue("recovery_folder_prefix", printConfig.RecoveryFolderPrefix, ""),
configValue("retries", printConfig.Retries, 5),
configValue("send_metrics_to_monitoring", printConfig.SendMetricsToMonitoring.GetValue(), true),
configValue("service_account_key", printConfig.ServiceAccountKey, ""),
configValue("shorten_folder_path", printConfig.ShortenFolderPath, false),
configValue("storage_class", printConfig.StorageClass, "STORAGE_CLASS_UNSPECIFIED"),
configValue("threads", printConfig.Threads, 64),
configValue("xml_multipart_upload", printConfig.XmlMultipartUpload, false),
configValue("object_retention_mode", printConfig.ObjectRetentionMode, ""),
configValue("object_retention_time", printConfig.ObjectRetentionTime, ""),
}
for _, configValue := range overrideOnlyConfigValues {
if !configValue.GetIsDefault() {
status.ConfigValues = append(status.ConfigValues, configValue)
}
}
permissionsStatus, allGranted, err := s.fetchPermissionsStatus(ctx, backintLabel, &permissions.ResourceDetails{
ProjectID: s.CloudProps.GetProjectId(),
BucketName: printConfig.Bucket,
})
if err != nil {
return logCheckFailureAndReturnStatus(ctx, status, fmt.Sprintf("Error checking IAM permissions: %v", err.Error()), spb.State_ERROR_STATE)
}
if printConfig.XmlMultipartUpload {
multipartUploadPermissionsStatus, multipartAllGranted, err := s.fetchPermissionsStatus(ctx, backintMultipartLabel, &permissions.ResourceDetails{
ProjectID: s.CloudProps.GetProjectId(),
BucketName: printConfig.Bucket,
})
if err != nil {
return logCheckFailureAndReturnStatus(ctx, status, fmt.Sprintf("Error checking multipart upload IAM permissions: %v", err.Error()), spb.State_ERROR_STATE)
}
permissionsStatus = append(permissionsStatus, multipartUploadPermissionsStatus...)
allGranted = allGranted && multipartAllGranted
}
status.IamPermissions = permissionsStatus
if !allGranted {
return logCheckFailureAndReturnStatus(ctx, status, "IAM permissions not granted", spb.State_FAILURE_STATE)
}
connectParams := &storage.ConnectParameters{
StorageClient: s.backintClient,
ServiceAccount: config.GetServiceAccountKey(),
BucketName: config.GetBucket(),
UserAgentSuffix: "Backint for GCS",
VerifyConnection: true,
MaxRetries: config.GetRetries(),
Endpoint: config.GetClientEndpoint(),
UserAgent: configuration.StorageAgentName(),
}
_, ok := storage.ConnectToBucket(ctx, connectParams)
if !ok {
return logCheckFailureAndReturnStatus(ctx, status, "Failed to connect to bucket", spb.State_FAILURE_STATE)
}
status.FullyFunctional = spb.State_SUCCESS_STATE
return status
}