github.com/sacloud/libsacloud/v2@v2.32.3/internal/define/archive.go (about) 1 // Copyright 2016-2022 The Libsacloud Authors 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package define 16 17 import ( 18 "net/http" 19 20 "github.com/sacloud/libsacloud/v2/sacloud/types" 21 22 "github.com/sacloud/libsacloud/v2/internal/define/names" 23 "github.com/sacloud/libsacloud/v2/internal/define/ops" 24 "github.com/sacloud/libsacloud/v2/internal/dsl" 25 "github.com/sacloud/libsacloud/v2/internal/dsl/meta" 26 "github.com/sacloud/libsacloud/v2/sacloud/naked" 27 ) 28 29 const ( 30 archiveAPIName = "Archive" 31 archiveAPIPathName = "archive" 32 ) 33 34 var archiveAPI = &dsl.Resource{ 35 Name: archiveAPIName, 36 PathName: archiveAPIPathName, 37 PathSuffix: dsl.CloudAPISuffix, 38 Operations: dsl.Operations{ 39 // find 40 ops.Find(archiveAPIName, archiveNakedType, findParameter, archiveView), 41 42 // create 43 ops.Create(archiveAPIName, archiveNakedType, archiveCreateParam, archiveView), 44 45 // CreateBlank 46 { 47 ResourceName: archiveAPIName, 48 Name: "CreateBlank", 49 PathFormat: dsl.DefaultPathFormat, 50 Method: http.MethodPost, 51 RequestEnvelope: dsl.RequestEnvelope(&dsl.EnvelopePayloadDesc{ 52 Name: names.ResourceFieldName(archiveAPIName, dsl.PayloadForms.Singular), 53 Type: archiveNakedType, 54 }), 55 ResponseEnvelope: dsl.ResponseEnvelope( 56 &dsl.EnvelopePayloadDesc{ 57 Name: names.ResourceFieldName(archiveAPIName, dsl.PayloadForms.Singular), 58 Type: archiveNakedType, 59 }, 60 &dsl.EnvelopePayloadDesc{ 61 Name: models.ftpServer().Name, 62 Type: meta.Static(naked.OpeningFTPServer{}), 63 }, 64 ), 65 Arguments: dsl.Arguments{ 66 dsl.MappableArgument("param", archiveCreateBlankParam, names.ResourceFieldName(archiveAPIName, dsl.PayloadForms.Singular)), 67 }, 68 Results: dsl.Results{ 69 { 70 SourceField: names.ResourceFieldName(archiveAPIName, dsl.PayloadForms.Singular), 71 DestField: archiveView.Name, 72 IsPlural: false, 73 Model: archiveView, 74 }, 75 { 76 SourceField: models.ftpServer().Name, 77 DestField: models.ftpServer().Name, 78 IsPlural: false, 79 Model: models.ftpServer(), 80 }, 81 }, 82 }, 83 84 // TODO 他ゾーンからの転送コピー作成 85 86 // read 87 ops.Read(archiveAPIName, archiveNakedType, archiveView), 88 89 // update 90 ops.Update(archiveAPIName, archiveNakedType, archiveUpdateParam, archiveView), 91 92 // delete 93 ops.Delete(archiveAPIName), 94 95 // openFTP 96 ops.OpenFTP(archiveAPIName, models.ftpServerOpenParameter(), models.ftpServer()), 97 98 // closeFTP 99 ops.CloseFTP(archiveAPIName), 100 101 // Share 102 &dsl.Operation{ 103 ResourceName: archiveAPIName, 104 Name: "Share", 105 PathFormat: dsl.IDAndSuffixPathFormat("ftp"), 106 Method: http.MethodPut, 107 RequestEnvelope: dsl.RequestEnvelope( 108 &dsl.EnvelopePayloadDesc{ 109 Name: "Shared", // sacloudパッケージ内でMarshalJSON時に設定される 110 Type: meta.TypeFlag, 111 }, 112 ), 113 Arguments: dsl.Arguments{ 114 dsl.ArgumentID, 115 }, 116 ResponseEnvelope: dsl.ResponseEnvelope( 117 &dsl.EnvelopePayloadDesc{ 118 Name: "ArchiveShareInfo", 119 Type: meta.Static(naked.ArchiveShareInfo{}), 120 }, 121 ), 122 Results: dsl.Results{ 123 { 124 SourceField: "ArchiveShareInfo", 125 DestField: "ArchiveShareInfo", 126 IsPlural: false, 127 Model: archiveShareInfo, 128 }, // sacloudパッケージ内のcustomized_envelopeで設定される 129 }, 130 }, 131 // CreateFromShared 132 { 133 ResourceName: archiveAPIName, 134 Name: "CreateFromShared", 135 PathFormat: dsl.DefaultPathFormat + "/{{.sourceArchiveID}}/to/zone/{{.destZoneID}}", 136 Method: http.MethodPost, 137 RequestEnvelope: dsl.RequestEnvelope(&dsl.EnvelopePayloadDesc{ 138 Name: names.ResourceFieldName(archiveAPIName, dsl.PayloadForms.Singular), 139 Type: archiveNakedType, 140 }), 141 ResponseEnvelope: dsl.ResponseEnvelope( 142 &dsl.EnvelopePayloadDesc{ 143 Name: names.ResourceFieldName(archiveAPIName, dsl.PayloadForms.Singular), 144 Type: archiveNakedType, 145 }, 146 ), 147 Arguments: dsl.Arguments{ 148 &dsl.Argument{Name: "sourceArchiveID", Type: meta.TypeID}, 149 &dsl.Argument{Name: "destZoneID", Type: meta.TypeID}, 150 dsl.MappableArgument("param", archiveCreateFromSharedParam, names.ResourceFieldName(archiveAPIName, dsl.PayloadForms.Singular)), 151 }, 152 Results: dsl.Results{ 153 { 154 SourceField: names.ResourceFieldName(archiveAPIName, dsl.PayloadForms.Singular), 155 DestField: archiveView.Name, 156 IsPlural: false, 157 Model: archiveView, 158 }, 159 }, 160 }, 161 // Transfer 162 { 163 ResourceName: archiveAPIName, 164 Name: "Transfer", 165 PathFormat: dsl.DefaultPathFormat + "/{{.sourceArchiveID}}/to/zone/{{.destZoneID}}", 166 Method: http.MethodPost, 167 RequestEnvelope: dsl.RequestEnvelope(&dsl.EnvelopePayloadDesc{ 168 Name: names.ResourceFieldName(archiveAPIName, dsl.PayloadForms.Singular), 169 Type: archiveNakedType, 170 }), 171 ResponseEnvelope: dsl.ResponseEnvelope( 172 &dsl.EnvelopePayloadDesc{ 173 Name: names.ResourceFieldName(archiveAPIName, dsl.PayloadForms.Singular), 174 Type: archiveNakedType, 175 }, 176 ), 177 Arguments: dsl.Arguments{ 178 &dsl.Argument{Name: "sourceArchiveID", Type: meta.TypeID}, 179 &dsl.Argument{Name: "destZoneID", Type: meta.TypeID}, 180 dsl.MappableArgument("param", archiveTransferParam, names.ResourceFieldName(archiveAPIName, dsl.PayloadForms.Singular)), 181 }, 182 Results: dsl.Results{ 183 { 184 SourceField: names.ResourceFieldName(archiveAPIName, dsl.PayloadForms.Singular), 185 DestField: archiveView.Name, 186 IsPlural: false, 187 Model: archiveView, 188 }, 189 }, 190 }, 191 }, 192 } 193 194 var ( 195 archiveNakedType = meta.Static(naked.Archive{}) 196 197 archiveView = &dsl.Model{ 198 Name: archiveAPIName, 199 NakedType: archiveNakedType, 200 Fields: []*dsl.FieldDesc{ 201 fields.ID(), 202 fields.Name(), 203 fields.Description(), 204 fields.Tags(), 205 fields.DisplayOrder(), 206 fields.Availability(), 207 fields.Scope(), 208 fields.SizeMB(), 209 fields.MigratedMB(), 210 fields.DiskPlanID(), 211 fields.DiskPlanName(), 212 fields.DiskPlanStorageClass(), 213 fields.SourceDiskID(), 214 fields.SourceDiskAvailability(), 215 fields.SourceArchiveID(), 216 fields.SourceArchiveAvailability(), 217 fields.BundleInfo(), 218 fields.Storage(), 219 fields.IconID(), 220 fields.CreatedAt(), 221 fields.ModifiedAt(), 222 fields.OriginalArchiveID(), 223 fields.SourceInfo(), 224 }, 225 } 226 227 archiveCreateParam = &dsl.Model{ 228 Name: names.CreateParameterName(archiveAPIName), 229 NakedType: archiveNakedType, 230 Fields: []*dsl.FieldDesc{ 231 fields.SourceDiskID(), 232 fields.SourceArchiveID(), 233 fields.Name(), 234 fields.Description(), 235 fields.Tags(), 236 fields.IconID(), 237 }, 238 } 239 240 archiveCreateBlankParam = &dsl.Model{ 241 Name: "ArchiveCreateBlankRequest", 242 NakedType: archiveNakedType, 243 Fields: []*dsl.FieldDesc{ 244 fields.SizeMB(), 245 fields.Name(), 246 fields.Description(), 247 fields.Tags(), 248 fields.IconID(), 249 }, 250 } 251 252 archiveUpdateParam = &dsl.Model{ 253 Name: names.UpdateParameterName(archiveAPIName), 254 NakedType: archiveNakedType, 255 Fields: []*dsl.FieldDesc{ 256 fields.Name(), 257 fields.Description(), 258 fields.Tags(), 259 fields.IconID(), 260 }, 261 } 262 263 archiveShareInfo = &dsl.Model{ 264 Name: "ArchiveShareInfo", 265 NakedType: meta.Static(naked.ArchiveShareInfo{}), 266 Fields: []*dsl.FieldDesc{ 267 fields.Def("SharedKey", meta.Static(types.ArchiveShareKey(""))), 268 }, 269 } 270 271 archiveCreateFromSharedParam = &dsl.Model{ 272 Name: names.CreateParameterName(archiveAPIName) + "FromShared", 273 NakedType: archiveNakedType, 274 Fields: []*dsl.FieldDesc{ 275 fields.Name(), 276 fields.Description(), 277 fields.Tags(), 278 fields.IconID(), 279 fields.Def("SourceSharedKey", meta.Static(types.ArchiveShareKey(""))), 280 }, 281 } 282 283 archiveTransferParam = &dsl.Model{ 284 Name: "ArchiveTransferRequest", 285 NakedType: archiveNakedType, 286 Fields: []*dsl.FieldDesc{ 287 fields.SizeMB(), 288 fields.Name(), 289 fields.Description(), 290 fields.Tags(), 291 fields.IconID(), 292 }, 293 } 294 )