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  )