github.com/gophercloud/gophercloud@v1.11.0/openstack/blockstorage/extensions/backups/testing/fixtures_test.go (about) 1 package testing 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "net/http" 7 "testing" 8 "time" 9 10 "github.com/gophercloud/gophercloud/openstack/blockstorage/extensions/backups" 11 th "github.com/gophercloud/gophercloud/testhelper" 12 fake "github.com/gophercloud/gophercloud/testhelper/client" 13 ) 14 15 const ListResponse = ` 16 { 17 "backups": [ 18 { 19 "id": "289da7f8-6440-407c-9fb4-7db01ec49164", 20 "name": "backup-001" 21 }, 22 { 23 "id": "96c3bda7-c82a-4f50-be73-ca7621794835", 24 "name": "backup-002" 25 } 26 ], 27 "backups_links": [ 28 { 29 "href": "%s/backups?marker=1", 30 "rel": "next" 31 } 32 ] 33 } 34 ` 35 36 const ListDetailResponse = ` 37 { 38 "backups": [ 39 { 40 "id": "289da7f8-6440-407c-9fb4-7db01ec49164", 41 "name": "backup-001", 42 "volume_id": "521752a6-acf6-4b2d-bc7a-119f9148cd8c", 43 "description": "Daily Backup", 44 "status": "available", 45 "size": 30, 46 "created_at": "2017-05-30T03:35:03.000000" 47 }, 48 { 49 "id": "96c3bda7-c82a-4f50-be73-ca7621794835", 50 "name": "backup-002", 51 "volume_id": "76b8950a-8594-4e5b-8dce-0dfa9c696358", 52 "description": "Weekly Backup", 53 "status": "available", 54 "size": 25, 55 "created_at": "2017-05-30T03:35:03.000000" 56 } 57 ], 58 "backups_links": [ 59 { 60 "href": "%s/backups/detail?marker=1", 61 "rel": "next" 62 } 63 ] 64 } 65 ` 66 67 const GetResponse = ` 68 { 69 "backup": { 70 "id": "d32019d3-bc6e-4319-9c1d-6722fc136a22", 71 "name": "backup-001", 72 "description": "Daily backup", 73 "volume_id": "521752a6-acf6-4b2d-bc7a-119f9148cd8c", 74 "status": "available", 75 "size": 30, 76 "created_at": "2017-05-30T03:35:03.000000" 77 } 78 } 79 ` 80 const CreateRequest = ` 81 { 82 "backup": { 83 "volume_id": "1234", 84 "name": "backup-001" 85 } 86 } 87 ` 88 89 const CreateResponse = ` 90 { 91 "backup": { 92 "volume_id": "1234", 93 "name": "backup-001", 94 "id": "d32019d3-bc6e-4319-9c1d-6722fc136a22", 95 "description": "Daily backup", 96 "volume_id": "1234", 97 "status": "available", 98 "size": 30, 99 "created_at": "2017-05-30T03:35:03.000000" 100 } 101 } 102 ` 103 104 const RestoreRequest = ` 105 { 106 "restore": { 107 "name": "vol-001", 108 "volume_id": "1234" 109 } 110 } 111 ` 112 113 const RestoreResponse = ` 114 { 115 "restore": { 116 "backup_id": "d32019d3-bc6e-4319-9c1d-6722fc136a22", 117 "volume_id": "1234", 118 "volume_name": "vol-001" 119 } 120 } 121 ` 122 123 const ExportResponse = ` 124 { 125 "backup-record": { 126 "backup_service": "cinder.backup.drivers.swift.SwiftBackupDriver", 127 "backup_url": "eyJpZCI6ImQzMjAxOWQzLWJjNmUtNDMxOS05YzFkLTY3MjJmYzEzNmEyMiIsInZvbHVtZV9pZCI6ImNmOWJjNmZhLWM1YmMtNDFmNi1iYzRlLTZlNzZjMGJlYTk1OSIsInNuYXBzaG90X2lkIjpudWxsLCJzdGF0dXMiOiJhdmFpbGFibGUiLCJzaXplIjoxLCJvYmplY3RfY291bnQiOjIsImNvbnRhaW5lciI6Im15LXRlc3QtYmFja3VwIiwic2VydmljZV9tZXRhZGF0YSI6InZvbHVtZV9jZjliYzZmYS1jNWJjLTQxZjYtYmM0ZS02ZTc2YzBiZWE5NTkvMjAyMDAzMTExOTI4NTUvYXpfcmVnaW9uYl9iYWNrdXBfYjg3YmIxZTUtMGQ0ZS00NDVlLWE1NDgtNWFlNzQyNTYyYmFjIiwic2VydmljZSI6ImNpbmRlci5iYWNrdXAuZHJpdmVycy5zd2lmdC5Td2lmdEJhY2t1cERyaXZlciIsImhvc3QiOiJjaW5kZXItYmFja3VwLWhvc3QxIiwidXNlcl9pZCI6IjkzNTE0ZTA0LWEwMjYtNGY2MC04MTc2LTM5NWM4NTk1MDFkZCIsInRlbXBfc25hcHNob3RfaWQiOm51bGwsInRlbXBfdm9sdW1lX2lkIjpudWxsLCJyZXN0b3JlX3ZvbHVtZV9pZCI6bnVsbCwibnVtX2RlcGVuZGVudF9iYWNrdXBzIjpudWxsLCJlbmNyeXB0aW9uX2tleV9pZCI6bnVsbCwicGFyZW50X2lkIjpudWxsLCJkZWxldGVkIjpmYWxzZSwiZGlzcGxheV9uYW1lIjpudWxsLCJkaXNwbGF5X2Rlc2NyaXB0aW9uIjpudWxsLCJkcml2ZXJfaW5mbyI6bnVsbCwiZmFpbF9yZWFzb24iOm51bGwsInByb2plY3RfaWQiOiIxNGYxYzFmNWQxMmI0NzU1Yjk0ZWRlZjc4ZmY4YjMyNSIsIm1ldGFkYXRhIjp7fSwiYXZhaWxhYmlsaXR5X3pvbmUiOiJyZWdpb24xYiIsImNyZWF0ZWRfYXQiOiIyMDIwLTAzLTExVDE5OjI1OjI0WiIsInVwZGF0ZWRfYXQiOiIyMDIwLTAzLTExVDE5OjI5OjA4WiIsImRlbGV0ZWRfYXQiOm51bGwsImRhdGFfdGltZXN0YW1wIjoiMjAyMC0wMy0xMVQxOToyNToyNFoifQ==" 128 } 129 } 130 ` 131 132 const ImportRequest = ExportResponse 133 134 const ImportResponse = ` 135 { 136 "backup": { 137 "id": "d32019d3-bc6e-4319-9c1d-6722fc136a22", 138 "links": [ 139 { 140 "href": "https://volume/v2/14f1c1f5d12b4755b94edef78ff8b325/backups/d32019d3-bc6e-4319-9c1d-6722fc136a22", 141 "rel": "self" 142 }, 143 { 144 "href": "https://volume/14f1c1f5d12b4755b94edef78ff8b325/backups/d32019d3-bc6e-4319-9c1d-6722fc136a22", 145 "rel": "bookmark" 146 } 147 ], 148 "name": null 149 } 150 } 151 ` 152 153 var ( 154 status = "available" 155 availabilityZone = "region1b" 156 host = "cinder-backup-host1" 157 serviceMetadata = "volume_cf9bc6fa-c5bc-41f6-bc4e-6e76c0bea959/20200311192855/az_regionb_backup_b87bb1e5-0d4e-445e-a548-5ae742562bac" 158 size = 1 159 objectCount = 2 160 container = "my-test-backup" 161 service = "cinder.backup.drivers.swift.SwiftBackupDriver" 162 backupImport = backups.ImportBackup{ 163 ID: "d32019d3-bc6e-4319-9c1d-6722fc136a22", 164 Status: &status, 165 AvailabilityZone: &availabilityZone, 166 VolumeID: "cf9bc6fa-c5bc-41f6-bc4e-6e76c0bea959", 167 UpdatedAt: time.Date(2020, 3, 11, 19, 29, 8, 0, time.UTC), 168 Host: &host, 169 UserID: "93514e04-a026-4f60-8176-395c859501dd", 170 ServiceMetadata: &serviceMetadata, 171 Size: &size, 172 ObjectCount: &objectCount, 173 Container: &container, 174 Service: &service, 175 CreatedAt: time.Date(2020, 3, 11, 19, 25, 24, 0, time.UTC), 176 DataTimestamp: time.Date(2020, 3, 11, 19, 25, 24, 0, time.UTC), 177 ProjectID: "14f1c1f5d12b4755b94edef78ff8b325", 178 Metadata: make(map[string]string), 179 } 180 backupURL, _ = json.Marshal(backupImport) 181 ) 182 183 func MockListResponse(t *testing.T) { 184 th.Mux.HandleFunc("/backups", func(w http.ResponseWriter, r *http.Request) { 185 th.TestMethod(t, r, "GET") 186 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 187 188 w.Header().Add("Content-Type", "application/json") 189 w.WriteHeader(http.StatusOK) 190 191 r.ParseForm() 192 marker := r.Form.Get("marker") 193 switch marker { 194 case "": 195 fmt.Fprintf(w, ListResponse, th.Server.URL) 196 case "1": 197 fmt.Fprintf(w, `{"backups": []}`) 198 default: 199 t.Fatalf("Unexpected marker: [%s]", marker) 200 } 201 }) 202 } 203 204 func MockListDetailResponse(t *testing.T) { 205 th.Mux.HandleFunc("/backups/detail", func(w http.ResponseWriter, r *http.Request) { 206 th.TestMethod(t, r, "GET") 207 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 208 209 w.Header().Add("Content-Type", "application/json") 210 w.WriteHeader(http.StatusOK) 211 212 r.ParseForm() 213 marker := r.Form.Get("marker") 214 switch marker { 215 case "": 216 fmt.Fprintf(w, ListDetailResponse, th.Server.URL) 217 case "1": 218 fmt.Fprintf(w, `{"backups": []}`) 219 default: 220 t.Fatalf("Unexpected marker: [%s]", marker) 221 } 222 }) 223 } 224 225 func MockGetResponse(t *testing.T) { 226 th.Mux.HandleFunc("/backups/d32019d3-bc6e-4319-9c1d-6722fc136a22", func(w http.ResponseWriter, r *http.Request) { 227 th.TestMethod(t, r, "GET") 228 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 229 230 w.Header().Add("Content-Type", "application/json") 231 w.WriteHeader(http.StatusOK) 232 fmt.Fprintf(w, GetResponse) 233 }) 234 } 235 236 func MockCreateResponse(t *testing.T) { 237 th.Mux.HandleFunc("/backups", func(w http.ResponseWriter, r *http.Request) { 238 th.TestMethod(t, r, "POST") 239 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 240 th.TestHeader(t, r, "Content-Type", "application/json") 241 th.TestHeader(t, r, "Accept", "application/json") 242 th.TestJSONRequest(t, r, CreateRequest) 243 244 w.Header().Add("Content-Type", "application/json") 245 w.WriteHeader(http.StatusAccepted) 246 247 fmt.Fprintf(w, CreateResponse) 248 }) 249 } 250 251 func MockRestoreResponse(t *testing.T) { 252 th.Mux.HandleFunc("/backups/d32019d3-bc6e-4319-9c1d-6722fc136a22/restore", func(w http.ResponseWriter, r *http.Request) { 253 th.TestMethod(t, r, "POST") 254 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 255 th.TestHeader(t, r, "Content-Type", "application/json") 256 th.TestHeader(t, r, "Accept", "application/json") 257 th.TestJSONRequest(t, r, RestoreRequest) 258 259 w.Header().Add("Content-Type", "application/json") 260 w.WriteHeader(http.StatusAccepted) 261 262 fmt.Fprintf(w, RestoreResponse) 263 }) 264 } 265 266 func MockDeleteResponse(t *testing.T) { 267 th.Mux.HandleFunc("/backups/d32019d3-bc6e-4319-9c1d-6722fc136a22", func(w http.ResponseWriter, r *http.Request) { 268 th.TestMethod(t, r, "DELETE") 269 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 270 w.WriteHeader(http.StatusNoContent) 271 }) 272 } 273 274 func MockExportResponse(t *testing.T) { 275 th.Mux.HandleFunc("/backups/d32019d3-bc6e-4319-9c1d-6722fc136a22/export_record", func(w http.ResponseWriter, r *http.Request) { 276 th.TestMethod(t, r, "GET") 277 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 278 th.TestHeader(t, r, "Accept", "application/json") 279 280 w.Header().Add("Content-Type", "application/json") 281 w.WriteHeader(http.StatusOK) 282 283 fmt.Fprintf(w, ExportResponse) 284 }) 285 } 286 287 func MockImportResponse(t *testing.T) { 288 th.Mux.HandleFunc("/backups/import_record", func(w http.ResponseWriter, r *http.Request) { 289 th.TestMethod(t, r, "POST") 290 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 291 th.TestHeader(t, r, "Content-Type", "application/json") 292 th.TestHeader(t, r, "Accept", "application/json") 293 th.TestJSONRequest(t, r, ImportRequest) 294 295 w.Header().Add("Content-Type", "application/json") 296 w.WriteHeader(http.StatusCreated) 297 298 fmt.Fprintf(w, ImportResponse) 299 }) 300 }