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  )