github.com/sacloud/libsacloud/v2@v2.32.3/internal/define/vpc_router.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/internal/define/names"
    21  	"github.com/sacloud/libsacloud/v2/internal/define/ops"
    22  	"github.com/sacloud/libsacloud/v2/internal/dsl"
    23  	"github.com/sacloud/libsacloud/v2/internal/dsl/meta"
    24  	"github.com/sacloud/libsacloud/v2/sacloud/naked"
    25  	"github.com/sacloud/libsacloud/v2/sacloud/types"
    26  )
    27  
    28  const (
    29  	vpcRouterAPIName     = "VPCRouter"
    30  	vpcRouterAPIPathName = "appliance"
    31  )
    32  
    33  var vpcRouterAPI = &dsl.Resource{
    34  	Name:       vpcRouterAPIName,
    35  	PathName:   vpcRouterAPIPathName,
    36  	PathSuffix: dsl.CloudAPISuffix,
    37  	Operations: dsl.Operations{
    38  		// find
    39  		ops.FindAppliance(vpcRouterAPIName, vpcRouterNakedType, findParameter, vpcRouterView),
    40  
    41  		// create
    42  		ops.CreateAppliance(vpcRouterAPIName, vpcRouterNakedType, vpcRouterCreateParam, vpcRouterView),
    43  
    44  		// read
    45  		ops.ReadAppliance(vpcRouterAPIName, vpcRouterNakedType, vpcRouterView),
    46  
    47  		// update
    48  		ops.UpdateAppliance(vpcRouterAPIName, vpcRouterNakedType, vpcRouterUpdateParam, vpcRouterView),
    49  		// updateSettings
    50  		ops.UpdateApplianceSettings(vpcRouterAPIName, vpcRouterUpdateSettingsNakedType, vpcRouterUpdateSettingsParam, vpcRouterView),
    51  
    52  		// delete
    53  		ops.Delete(vpcRouterAPIName),
    54  
    55  		// config
    56  		ops.Config(vpcRouterAPIName),
    57  
    58  		// power management(boot/shutdown/reset)
    59  		ops.Boot(vpcRouterAPIName),
    60  		ops.Shutdown(vpcRouterAPIName),
    61  		ops.Reset(vpcRouterAPIName),
    62  
    63  		// connect to switch
    64  		ops.WithIDAction(
    65  			vpcRouterAPIName, "ConnectToSwitch", http.MethodPut, "interface/{{.nicIndex}}/to/switch/{{.switchID}}",
    66  			&dsl.Argument{
    67  				Name: "nicIndex",
    68  				Type: meta.TypeInt,
    69  			},
    70  			&dsl.Argument{
    71  				Name: "switchID",
    72  				Type: meta.TypeID,
    73  			},
    74  		),
    75  
    76  		// disconnect from switch
    77  		ops.WithIDAction(
    78  			vpcRouterAPIName, "DisconnectFromSwitch", http.MethodDelete, "interface/{{.nicIndex}}/to/switch",
    79  			&dsl.Argument{
    80  				Name: "nicIndex",
    81  				Type: meta.TypeInt,
    82  			},
    83  		),
    84  
    85  		// monitor
    86  		ops.MonitorChild(vpcRouterAPIName, "CPU", "cpu",
    87  			monitorParameter, monitors.cpuTimeModel()),
    88  		ops.MonitorChildBy(vpcRouterAPIName, "Interface", "interface",
    89  			monitorParameter, monitors.interfaceModel()),
    90  
    91  		// status
    92  		{
    93  			ResourceName: vpcRouterAPIName,
    94  			Name:         "Status",
    95  			Arguments: dsl.Arguments{
    96  				dsl.ArgumentID,
    97  			},
    98  			PathFormat: dsl.IDAndSuffixPathFormat("status"),
    99  			Method:     http.MethodGet,
   100  			ResponseEnvelope: dsl.ResponseEnvelope(&dsl.EnvelopePayloadDesc{
   101  				Type: meta.Static(naked.VPCRouterStatus{}),
   102  				Name: "Router",
   103  			}),
   104  			Results: dsl.Results{
   105  				{
   106  					SourceField: "Router",
   107  					DestField:   vpcRouterStatusView.Name,
   108  					Model:       vpcRouterStatusView,
   109  				},
   110  			},
   111  		},
   112  	},
   113  }
   114  
   115  var (
   116  	vpcRouterNakedType               = meta.Static(naked.VPCRouter{})
   117  	vpcRouterUpdateSettingsNakedType = meta.Static(naked.VPCRouterSettingsUpdate{})
   118  
   119  	vpcRouterView = &dsl.Model{
   120  		Name:      vpcRouterAPIName,
   121  		NakedType: vpcRouterNakedType,
   122  		Fields: []*dsl.FieldDesc{
   123  			fields.ID(),
   124  			fields.Name(),
   125  			fields.Description(),
   126  			fields.Tags(),
   127  			fields.Availability(),
   128  			fields.Class(),
   129  			fields.IconID(),
   130  			fields.CreatedAt(),
   131  			// plan
   132  			fields.AppliancePlanID(),
   133  			// version
   134  			fields.ApplianceVPCRouterVersion(),
   135  			// settings
   136  			{
   137  				Name: "Settings",
   138  				Type: models.vpcRouterSetting(),
   139  				Tags: &dsl.FieldTags{
   140  					MapConv: ",omitempty,recursive",
   141  				},
   142  			},
   143  			fields.SettingsHash(),
   144  
   145  			// instance
   146  			fields.InstanceHostName(),
   147  			fields.InstanceHostInfoURL(),
   148  			fields.InstanceStatus(),
   149  			fields.InstanceStatusChangedAt(),
   150  			// interfaces
   151  			fields.VPCRouterInterfaces(),
   152  			fields.RemarkZoneID(),
   153  		},
   154  	}
   155  
   156  	vpcRouterCreateParam = &dsl.Model{
   157  		Name:      names.CreateParameterName(vpcRouterAPIName),
   158  		NakedType: vpcRouterNakedType,
   159  		ConstFields: []*dsl.ConstFieldDesc{
   160  			{
   161  				Name:  "Class",
   162  				Type:  meta.TypeString,
   163  				Value: `"vpcrouter"`,
   164  			},
   165  		},
   166  		Fields: []*dsl.FieldDesc{
   167  			fields.Name(),
   168  			fields.Description(),
   169  			fields.Tags(),
   170  			fields.IconID(),
   171  			fields.PlanID(),
   172  
   173  			// nic
   174  			{
   175  				Name: "Switch",
   176  				Type: &dsl.Model{
   177  					Name: "ApplianceConnectedSwitch",
   178  					Fields: []*dsl.FieldDesc{
   179  						fields.ID(),
   180  						fields.Scope(),
   181  					},
   182  					NakedType: meta.Static(naked.ConnectedSwitch{}),
   183  				},
   184  				Tags: &dsl.FieldTags{
   185  					JSON:    ",omitempty",
   186  					MapConv: "Remark.Switch,recursive",
   187  				},
   188  			},
   189  
   190  			// TODO remarkとsettings.Interfaces両方に設定する必要がある。うまい方法が思いつかないため当面は利用者側で両方に設定する方法としておく
   191  			fields.ApplianceIPAddresses(),
   192  
   193  			// version
   194  			fields.ApplianceVPCRouterVersion(),
   195  
   196  			{
   197  				Name: "Settings",
   198  				Type: models.vpcRouterSetting(),
   199  				Tags: &dsl.FieldTags{
   200  					MapConv: ",omitempty,recursive",
   201  				},
   202  			},
   203  		},
   204  	}
   205  
   206  	vpcRouterUpdateParam = &dsl.Model{
   207  		Name:      names.UpdateParameterName(vpcRouterAPIName),
   208  		NakedType: vpcRouterNakedType,
   209  		Fields: []*dsl.FieldDesc{
   210  			fields.Name(),
   211  			fields.Description(),
   212  			fields.Tags(),
   213  			fields.IconID(),
   214  			{
   215  				Name: "Settings",
   216  				Type: models.vpcRouterSetting(),
   217  				Tags: &dsl.FieldTags{
   218  					MapConv: ",omitempty,recursive",
   219  				},
   220  			},
   221  			// settings hash
   222  			fields.SettingsHash(),
   223  		},
   224  	}
   225  
   226  	vpcRouterUpdateSettingsParam = &dsl.Model{
   227  		Name:      names.UpdateSettingsParameterName(vpcRouterAPIName),
   228  		NakedType: vpcRouterNakedType,
   229  		Fields: []*dsl.FieldDesc{
   230  			{
   231  				Name: "Settings",
   232  				Type: models.vpcRouterSetting(),
   233  				Tags: &dsl.FieldTags{
   234  					MapConv: ",omitempty,recursive",
   235  				},
   236  			},
   237  			// settings hash
   238  			fields.SettingsHash(),
   239  		},
   240  	}
   241  
   242  	vpcRouterStatusView = &dsl.Model{
   243  		Name:      "VPCRouterStatus",
   244  		NakedType: meta.Static(naked.VPCRouterStatus{}),
   245  		Fields: []*dsl.FieldDesc{
   246  			fields.Def("FirewallReceiveLogs", meta.TypeStringSlice),
   247  			fields.Def("FirewallSendLogs", meta.TypeStringSlice),
   248  			fields.Def("VPNLogs", meta.TypeStringSlice),
   249  			fields.Def("SessionCount", meta.TypeInt),
   250  			fields.Def("PercentageOfMemoryFree", meta.Static([]types.StringNumber{})),
   251  			{
   252  				Name: "WireGuard",
   253  				Type: &dsl.Model{
   254  					Name: "WireGuardStatus",
   255  					Fields: []*dsl.FieldDesc{
   256  						fields.Def("PublicKey", meta.TypeString),
   257  					},
   258  				},
   259  			},
   260  			{
   261  				Name: "DHCPServerLeases",
   262  				Type: &dsl.Model{
   263  					Name:    "VPCRouterDHCPServerLease",
   264  					IsArray: true,
   265  					Fields: []*dsl.FieldDesc{
   266  						fields.Def("IPAddress", meta.TypeString),
   267  						fields.Def("MACAddress", meta.TypeString),
   268  					},
   269  				},
   270  				Tags: &dsl.FieldTags{
   271  					MapConv: "[]DHCPServerLeases,recursive",
   272  				},
   273  			},
   274  			{
   275  				Name: "L2TPIPsecServerSessions",
   276  				Type: &dsl.Model{
   277  					Name:    "VPCRouterL2TPIPsecServerSession",
   278  					IsArray: true,
   279  					Fields: []*dsl.FieldDesc{
   280  						fields.Def("User", meta.TypeString),
   281  						fields.Def("IPAddress", meta.TypeString),
   282  						fields.Def("TimeSec", meta.TypeInt),
   283  					},
   284  				},
   285  				Tags: &dsl.FieldTags{
   286  					MapConv: "[]L2TPIPsecServerSessions,recursive",
   287  				},
   288  			},
   289  			{
   290  				Name: "PPTPServerSessions",
   291  				Type: &dsl.Model{
   292  					Name:    "VPCRouterPPTPServerSession",
   293  					IsArray: true,
   294  					Fields: []*dsl.FieldDesc{
   295  						fields.Def("User", meta.TypeString),
   296  						fields.Def("IPAddress", meta.TypeString),
   297  						fields.Def("TimeSec", meta.TypeInt),
   298  					},
   299  				},
   300  				Tags: &dsl.FieldTags{
   301  					MapConv: "[]PPTPServerSessions,recursive",
   302  				},
   303  			},
   304  			{
   305  				Name: "SiteToSiteIPsecVPNPeers",
   306  				Type: &dsl.Model{
   307  					Name:    "VPCRouterSiteToSiteIPsecVPNPeer",
   308  					IsArray: true,
   309  					Fields: []*dsl.FieldDesc{
   310  						fields.Def("Status", meta.TypeString),
   311  						fields.Def("Peer", meta.TypeString),
   312  					},
   313  				},
   314  				Tags: &dsl.FieldTags{
   315  					MapConv: "[]SiteToSiteIPsecVPNPeers,recursive",
   316  				},
   317  			},
   318  			{
   319  				Name: "SessionAnalysis",
   320  				Type: &dsl.Model{
   321  					Name: "VPCRouterSessionAnalysis",
   322  					Fields: []*dsl.FieldDesc{
   323  						fields.Def("SourceAndDestination", models.vpcRouterSessionAnalyticsValue()),
   324  						fields.Def("DestinationAddress", models.vpcRouterSessionAnalyticsValue()),
   325  						fields.Def("DestinationPort", models.vpcRouterSessionAnalyticsValue()),
   326  						fields.Def("SourceAddress", models.vpcRouterSessionAnalyticsValue()),
   327  					},
   328  				},
   329  			},
   330  		},
   331  	}
   332  )