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