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  )