github.com/sacloud/iaas-api-go@v1.12.0/internal/define/disk.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 diskAPIName = "Disk" 30 diskAPIPathName = "disk" 31 ) 32 33 var diskAPI = &dsl.Resource{ 34 Name: diskAPIName, 35 PathName: diskAPIPathName, 36 PathSuffix: dsl.CloudAPISuffix, 37 Operations: dsl.Operations{ 38 // find 39 ops.Find(diskAPIName, diskNakedType, findParameter, diskModel), 40 41 // create 42 { 43 ResourceName: diskAPIName, 44 Name: "Create", 45 PathFormat: dsl.DefaultPathFormat, 46 Method: http.MethodPost, 47 RequestEnvelope: dsl.RequestEnvelope( 48 &dsl.EnvelopePayloadDesc{ 49 Type: diskNakedType, 50 Name: "Disk", 51 }, 52 &dsl.EnvelopePayloadDesc{ 53 Type: diskDistantFromType, 54 Name: "DistantFrom", 55 }, 56 ), 57 Arguments: dsl.Arguments{ 58 { 59 Name: "createParam", 60 MapConvTag: "Disk,recursive", 61 Type: diskCreateParam, 62 }, 63 { 64 Name: "distantFrom", 65 MapConvTag: "DistantFrom", 66 Type: diskDistantFromType, 67 }, 68 }, 69 ResponseEnvelope: dsl.ResponseEnvelope(&dsl.EnvelopePayloadDesc{ 70 Type: diskNakedType, 71 Name: "Disk", 72 }), 73 Results: dsl.Results{ 74 { 75 SourceField: "Disk", 76 DestField: diskModel.Name, 77 IsPlural: false, 78 Model: diskModel, 79 }, 80 }, 81 }, 82 83 // config(DiskEdit) 84 { 85 ResourceName: diskAPIName, 86 Name: "Config", 87 PathFormat: dsl.IDAndSuffixPathFormat("config"), 88 Method: http.MethodPut, 89 RequestEnvelope: dsl.RequestEnvelopeFromModel(diskEditParam), 90 Arguments: dsl.Arguments{ 91 dsl.ArgumentID, 92 dsl.PassthroughModelArgument("edit", diskEditParam), 93 }, 94 }, 95 96 // create with config(DiskEdit) 97 { 98 ResourceName: diskAPIName, 99 Name: "CreateWithConfig", 100 PathFormat: dsl.DefaultPathFormat, 101 Method: http.MethodPost, 102 RequestEnvelope: dsl.RequestEnvelope( 103 &dsl.EnvelopePayloadDesc{ 104 Type: diskNakedType, 105 Name: "Disk", 106 }, 107 &dsl.EnvelopePayloadDesc{ 108 Type: diskEditNakedType, 109 Name: "Config", 110 }, 111 &dsl.EnvelopePayloadDesc{ 112 Type: meta.TypeFlag, 113 Name: "BootAtAvailable", 114 }, 115 &dsl.EnvelopePayloadDesc{ 116 Type: diskDistantFromType, 117 Name: "DistantFrom", 118 }, 119 ), 120 ResponseEnvelope: dsl.ResponseEnvelope(&dsl.EnvelopePayloadDesc{ 121 Type: diskNakedType, 122 Name: "Disk", 123 }), 124 Arguments: dsl.Arguments{ 125 { 126 Name: "createParam", 127 MapConvTag: "Disk,recursive", 128 Type: diskCreateParam, 129 }, 130 { 131 Name: "editParam", 132 MapConvTag: "Config,recursive", 133 Type: diskEditParam, 134 }, 135 { 136 Name: "bootAtAvailable", 137 Type: meta.TypeFlag, 138 MapConvTag: "BootAtAvailable", 139 }, 140 { 141 Name: "distantFrom", 142 Type: diskDistantFromType, 143 MapConvTag: "DistantFrom", 144 }, 145 }, 146 Results: dsl.Results{ 147 { 148 SourceField: "Disk", 149 DestField: diskModel.Name, 150 IsPlural: false, 151 Model: diskModel, 152 }, 153 }, 154 }, 155 156 // resize partition 157 { 158 ResourceName: diskAPIName, 159 Name: "ResizePartition", 160 PathFormat: dsl.IDAndSuffixPathFormat("resize-partition"), 161 Method: http.MethodPut, 162 RequestEnvelope: dsl.RequestEnvelope( 163 &dsl.EnvelopePayloadDesc{ 164 Type: meta.TypeFlag, 165 Name: "Background", 166 }, 167 ), 168 Arguments: dsl.Arguments{ 169 dsl.ArgumentID, 170 dsl.PassthroughModelArgument("param", &dsl.Model{ 171 Name: "DiskResizePartitionRequest", 172 Fields: []*dsl.FieldDesc{ 173 fields.Def("Background", meta.TypeFlag), 174 }, 175 NakedType: meta.Static(naked.ResizePartitionRequest{}), 176 }), 177 }, 178 }, 179 180 // connect to server 181 ops.WithIDAction(diskAPIName, "ConnectToServer", http.MethodPut, "to/server/{{.serverID}}", 182 &dsl.Argument{ 183 Name: "serverID", 184 Type: meta.TypeID, 185 }, 186 ), 187 188 // disconnect from server 189 ops.WithIDAction(diskAPIName, "DisconnectFromServer", http.MethodDelete, "to/server"), 190 191 // read 192 ops.Read(diskAPIName, diskNakedType, diskModel), 193 194 // update 195 ops.Update(diskAPIName, diskNakedType, diskUpdateParam, diskModel), 196 197 // delete 198 ops.Delete(diskAPIName), 199 200 // monitor 201 ops.Monitor(diskAPIName, monitorParameter, monitors.diskModel()), 202 ops.MonitorChild(diskAPIName, "Disk", "", monitorParameter, monitors.diskModel()), 203 }, 204 } 205 206 var ( 207 diskNakedType = meta.Static(naked.Disk{}) 208 diskEditNakedType = meta.Static(naked.DiskEdit{}) 209 diskDistantFromType = meta.Static([]types.ID{}) 210 211 diskModel = &dsl.Model{ 212 Name: diskAPIName, 213 NakedType: diskNakedType, 214 Fields: []*dsl.FieldDesc{ 215 fields.ID(), 216 fields.Name(), 217 fields.Description(), 218 fields.Tags(), 219 fields.Availability(), 220 fields.DiskConnection(), 221 fields.DiskConnectionOrder(), 222 fields.DiskEncryptionAlgorithm(), 223 fields.DiskReinstallCount(), 224 fields.Def("JobStatus", models.migrationJobStatus()), 225 fields.SizeMB(), 226 fields.MigratedMB(), 227 fields.DiskPlanID(), 228 fields.DiskPlanName(), 229 fields.DiskPlanStorageClass(), 230 fields.SourceDiskID(), 231 fields.SourceDiskAvailability(), 232 fields.SourceArchiveID(), 233 fields.SourceArchiveAvailability(), 234 fields.BundleInfo(), 235 fields.Storage(), 236 fields.ServerID(), 237 fields.ServerName(), 238 fields.IconID(), 239 fields.CreatedAt(), 240 fields.ModifiedAt(), 241 }, 242 } 243 244 diskCreateParam = &dsl.Model{ 245 Name: names.CreateParameterName(diskAPIName), 246 NakedType: diskNakedType, 247 Fields: []*dsl.FieldDesc{ 248 fields.DiskPlanID(), 249 fields.DiskConnection(), 250 fields.DiskEncryptionAlgorithm(), 251 fields.SourceDiskID(), 252 fields.SourceArchiveID(), 253 fields.ServerID(), 254 fields.SizeMB(), 255 fields.Name(), 256 fields.Description(), 257 fields.Tags(), 258 fields.IconID(), 259 }, 260 } 261 262 diskUpdateParam = &dsl.Model{ 263 Name: names.UpdateParameterName(diskAPIName), 264 NakedType: diskNakedType, 265 Fields: []*dsl.FieldDesc{ 266 fields.Name(), 267 fields.Description(), 268 fields.Tags(), 269 fields.IconID(), 270 fields.DiskConnection(), 271 }, 272 } 273 274 diskEditParam = models.diskEdit() 275 )