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 )