diff --git a/openstack/cbr/v3/tasks/requests.go b/openstack/cbr/v3/tasks/requests.go new file mode 100644 index 00000000..bb0f2096 --- /dev/null +++ b/openstack/cbr/v3/tasks/requests.go @@ -0,0 +1,53 @@ +package tasks + +import ( + "github.com/huaweicloud/golangsdk" + "github.com/huaweicloud/golangsdk/pagination" +) + +type ListOpts struct { + EndTime string `q:"end_time"` + EnterpriseProjectId string `q:"enterprise_project_id"` + Limit int `q:"limit"` + Offset int `q:"offset"` + OperationType string `q:"operation_type"` + ProviderId string `q:"provider_id"` + ResourceId string `q:"resource_id"` + ResourceName string `q:"resource_name"` + StartTime string `q:"start_time"` + Status string `q:"status"` + VaultId string `q:"vault_id"` + VaultName string `q:"vault_name"` +} + +type ListOptsBuilder interface { + ToTaskListQuery() (string, error) +} + +func (opts ListOpts) ToTaskListQuery() (string, error) { + q, err := golangsdk.BuildQueryString(opts) + if err != nil { + return "", err + } + return q.String(), err +} + +func List(client *golangsdk.ServiceClient, opts ListOptsBuilder) pagination.Pager { + url := rootURL(client) + if opts != nil { + query, err := opts.ToTaskListQuery() + if err != nil { + return pagination.Pager{Err: err} + } + url += query + } + + return pagination.NewPager(client, url, func(r pagination.PageResult) pagination.Page { + return TaskPage{pagination.SinglePageBase(r)} + }) +} + +func Get(client *golangsdk.ServiceClient, id string) (r GetResult) { + _, r.Err = client.Get(resourceURL(client, id), &r.Body, nil) + return +} diff --git a/openstack/cbr/v3/tasks/results.go b/openstack/cbr/v3/tasks/results.go new file mode 100644 index 00000000..e6e32d25 --- /dev/null +++ b/openstack/cbr/v3/tasks/results.go @@ -0,0 +1,141 @@ +package tasks + +import ( + "github.com/huaweicloud/golangsdk" + "github.com/huaweicloud/golangsdk/pagination" +) + +type commonResult struct { + golangsdk.Result +} + +type GetResult struct { + commonResult +} + +type TaskPage struct { + pagination.SinglePageBase +} + +type OperationLog struct { + CheckpointID string `json:"checkpoint_id"` + CreatedAt string `json:"created_at"` + EndedAt string `json:"ended_at"` + ErrorInfo OpErrorInfo `json:"error_info"` + ExtraInfo OpExtraInfo `json:"extra_info"` + ID string `json:"id"` + OperationType string `json:"operation_type"` + PolicyID string `json:"policy_id"` + ProjectID string `json:"project_id"` + ProviderID string `json:"provider_id"` + StartedAt string `json:"started_at"` + Status string `json:"status"` + UpdatedAt string `json:"updated_at"` + VaultID string `json:"vault_id"` + VaultName string `json:"vault_name"` +} + +type OpErrorInfo struct { + Code string `json:"code"` + Message string `json:"message"` +} + +type OpExtraInfo struct { + Backup OpExtendInfoBackup `json:"backup"` + Common OpExtendInfoCommon `json:"common"` + Delete OpExtendInfoDelete `json:"delete"` + Sync OpExtendInfoSync `json:"sync"` + RemoveResources OpExtendInfoRemoveResources `json:"remove_resources"` + Replication OpExtendInfoReplication `json:"replication"` + Resource Resource `json:"resource"` + Restore OpExtendInfoRestore `json:"restore"` + VaultDelete OpExtendInfoVaultDelete `json:"vault_delete"` +} + +type OpExtendInfoBackup struct { + AppConsistencyErrorCode string `json:"app_consistency_error_code"` + AppConsistencyErrorMessage string `json:"app_consistency_error_message"` + AppConsistencyStatus string `json:"app_consistency_status"` + BackupID string `json:"backup_id"` + BackupName string `json:"backup_name"` + Incremental string `json:"incremental"` +} + +type OpExtendInfoCommon struct { + Progress int `json:"progress"` + RequestID string `json:"request_id"` + TaskID string `json:"task_id"` +} + +type OpExtendInfoDelete struct { + BackupID string `json:"backup_id"` + BackupName string `json:"backup_name"` +} + +type OpExtendInfoSync struct { + SyncBackupNum int `json:"sync_backup_num"` + DeleteBackupNum int `json:"delete_backup_num"` + ErrSyncBackupNum int `json:"err_sync_backup_num"` +} + +type OpExtendInfoRemoveResources struct { + FailCount int `json:"fail_count"` + TotalCount int `json:"total_count"` + Resources []Resource `json:"resources"` +} + +type Resource struct { + ExtraInfo ResourceExtraInfo `json:"extra_info"` + ID string `json:"id"` + Name string `json:"name"` + Type string `json:"type"` +} + +type OpExtendInfoReplication struct { + DestinationBackupID string `json:"destination_backup_id"` + DestinationCheckpointID string `json:"destination_checkpoint_id"` + DestinationProjectID string `json:"destination_project_id"` + DestinationRegion string `json:"destination_region"` + SourceBackupID string `json:"source_backup_id"` + SourceCheckpointID string `json:"source_checkpoint_id"` + SourceProjectID string `json:"source_project_id"` + SourceRegion string `json:"source_region"` + SourceBackupName string `json:"source_backup_name"` + DestinationBackupName string `json:"destination_backup_name"` +} + +type ResourceExtraInfo struct { + ExcludeVolumes []string `json:"exclude_volumes"` + IncludeVolumes []ResourceExtraInfoIncludeVolumes `json:"include_volumes"` +} + +type ResourceExtraInfoIncludeVolumes struct { + ID string `json:"id"` + OsVersion string `json:"os_version"` +} + +type OpExtendInfoRestore struct { + BackupID string `json:"backup_id"` + BackupName string `json:"backup_name"` + TargetResourceId string `json:"target_resource_id"` + TargetResourceName string `json:"target_resource_name"` +} + +type OpExtendInfoVaultDelete struct { + FailCount int `json:"fail_count"` + TotalCount int `json:"total_count"` +} + +func (r commonResult) Extract() (*OperationLog, error) { + var s struct { + Operation *OperationLog `json:"operation_log"` + } + err := r.ExtractInto(&s) + return s.Operation, err +} + +func ExtractTasks(r pagination.Page) (*[]OperationLog, error) { + var s []OperationLog + err := r.(TaskPage).Result.ExtractIntoSlicePtr(&s, "operation_log") + return &s, err +} diff --git a/openstack/cbr/v3/tasks/urls.go b/openstack/cbr/v3/tasks/urls.go new file mode 100644 index 00000000..d01fa67f --- /dev/null +++ b/openstack/cbr/v3/tasks/urls.go @@ -0,0 +1,11 @@ +package tasks + +import "github.com/huaweicloud/golangsdk" + +func rootURL(client *golangsdk.ServiceClient) string { + return client.ServiceURL("operation-logs") +} + +func resourceURL(client *golangsdk.ServiceClient, id string) string { + return client.ServiceURL("operation-logs", id) +}