traefik/vendor/github.com/sacloud/libsacloud/sacloud/vpc_router.go
Ludovic Fernandez 139f280f35 ACME TLS ALPN
2018-07-03 12:44:04 +02:00

238 lines
6.6 KiB
Go

package sacloud
import (
"fmt"
"net"
)
// VPCRouter VPCルーター
type VPCRouter struct {
*Appliance // アプライアンス共通属性
Remark *VPCRouterRemark `json:",omitempty"` // リマーク
Settings *VPCRouterSettings `json:",omitempty"` // VPCルーター設定リスト
}
// VPCRouterRemark リマーク
type VPCRouterRemark struct {
*ApplianceRemarkBase
// TODO Zone
//Zone *Resource
}
// VPCRouterSettings VPCルーター設定リスト
type VPCRouterSettings struct {
Router *VPCRouterSetting `json:",omitempty"` // VPCルーター設定
}
// CreateNewVPCRouter VPCルーター作成
func CreateNewVPCRouter() *VPCRouter {
return &VPCRouter{
Appliance: &Appliance{
Class: "vpcrouter",
propPlanID: propPlanID{Plan: &Resource{}},
},
Remark: &VPCRouterRemark{
ApplianceRemarkBase: &ApplianceRemarkBase{
Servers: []interface{}{""},
Switch: &ApplianceRemarkSwitch{},
},
},
Settings: &VPCRouterSettings{
Router: &VPCRouterSetting{},
},
}
}
// InitVPCRouterSetting VPCルーター設定初期化
func (v *VPCRouter) InitVPCRouterSetting() {
settings := &VPCRouterSettings{
Router: &VPCRouterSetting{},
}
if v.Settings != nil && v.Settings.Router != nil && v.Settings.Router.Interfaces != nil {
settings.Router.Interfaces = v.Settings.Router.Interfaces
}
if v.Settings != nil && v.Settings.Router != nil && v.Settings.Router.VRID != nil {
settings.Router.VRID = v.Settings.Router.VRID
}
v.Settings = settings
}
// IsStandardPlan スタンダードプランか判定
func (v *VPCRouter) IsStandardPlan() bool {
return v.Plan.ID == 1
}
// IsPremiumPlan プレミアムプランか判定
func (v *VPCRouter) IsPremiumPlan() bool {
return v.Plan.ID == 2
}
// IsHighSpecPlan ハイスペックプランか判定
func (v *VPCRouter) IsHighSpecPlan() bool {
return v.Plan.ID == 3
}
// SetStandardPlan スタンダードプランへ設定
func (v *VPCRouter) SetStandardPlan() {
v.Plan.SetID(1)
v.Remark.Switch = &ApplianceRemarkSwitch{
// Scope
propScope: propScope{Scope: "shared"},
}
v.Settings = nil
}
// SetPremiumPlan プレミアムプランへ設定
func (v *VPCRouter) SetPremiumPlan(switchID string, virtualIPAddress string, ipAddress1 string, ipAddress2 string, vrid int, ipAliases []string) {
v.Plan.SetID(2)
v.setPremiumServices(switchID, virtualIPAddress, ipAddress1, ipAddress2, vrid, ipAliases)
}
// SetHighSpecPlan ハイスペックプランへ設定
func (v *VPCRouter) SetHighSpecPlan(switchID string, virtualIPAddress string, ipAddress1 string, ipAddress2 string, vrid int, ipAliases []string) {
v.Plan.SetID(3)
v.setPremiumServices(switchID, virtualIPAddress, ipAddress1, ipAddress2, vrid, ipAliases)
}
func (v *VPCRouter) setPremiumServices(switchID string, virtualIPAddress string, ipAddress1 string, ipAddress2 string, vrid int, ipAliases []string) {
v.Remark.Switch = &ApplianceRemarkSwitch{
ID: switchID,
}
v.Remark.Servers = []interface{}{
map[string]string{"IPAddress": ipAddress1},
map[string]string{"IPAddress": ipAddress2},
}
v.Settings = &VPCRouterSettings{
Router: &VPCRouterSetting{
Interfaces: []*VPCRouterInterface{
{
IPAddress: []string{
ipAddress1,
ipAddress2,
},
VirtualIPAddress: virtualIPAddress,
IPAliases: ipAliases,
},
},
VRID: &vrid,
},
}
}
// HasSetting VPCルータ設定を保持しているか
func (v *VPCRouter) HasSetting() bool {
return v.Settings != nil && v.Settings.Router != nil
}
// HasInterfaces NIC設定を保持しているか
func (v *VPCRouter) HasInterfaces() bool {
return v.HasSetting() && v.Settings.Router.HasInterfaces()
}
// HasStaticNAT スタティックNAT設定を保持しているか
func (v *VPCRouter) HasStaticNAT() bool {
return v.HasSetting() && v.Settings.Router.HasStaticNAT()
}
// HasPortForwarding ポートフォワーディング設定を保持しているか
func (v *VPCRouter) HasPortForwarding() bool {
return v.HasSetting() && v.Settings.Router.HasPortForwarding()
}
// HasFirewall ファイアウォール設定を保持しているか
func (v *VPCRouter) HasFirewall() bool {
return v.HasSetting() && v.Settings.Router.HasFirewall()
}
// HasDHCPServer DHCPサーバー設定を保持しているか
func (v *VPCRouter) HasDHCPServer() bool {
return v.HasSetting() && v.Settings.Router.HasDHCPServer()
}
// HasDHCPStaticMapping DHCPスタティックマッピング設定を保持しているか
func (v *VPCRouter) HasDHCPStaticMapping() bool {
return v.HasSetting() && v.Settings.Router.HasDHCPStaticMapping()
}
// HasL2TPIPsecServer L2TP/IPSecサーバを保持しているか
func (v *VPCRouter) HasL2TPIPsecServer() bool {
return v.HasSetting() && v.Settings.Router.HasL2TPIPsecServer()
}
// HasPPTPServer PPTPサーバを保持しているか
func (v *VPCRouter) HasPPTPServer() bool {
return v.HasSetting() && v.Settings.Router.HasPPTPServer()
}
// HasRemoteAccessUsers リモートアクセスユーザー設定を保持しているか
func (v *VPCRouter) HasRemoteAccessUsers() bool {
return v.HasSetting() && v.Settings.Router.HasRemoteAccessUsers()
}
// HasSiteToSiteIPsecVPN サイト間VPN設定を保持しているか
func (v *VPCRouter) HasSiteToSiteIPsecVPN() bool {
return v.HasSetting() && v.Settings.Router.HasSiteToSiteIPsecVPN()
}
// HasStaticRoutes スタティックルートを保持しているか
func (v *VPCRouter) HasStaticRoutes() bool {
return v.HasSetting() && v.Settings.Router.HasStaticRoutes()
}
// RealIPAddress プランに応じて外部向けIPアドレスを返す
//
// Standard: IPAddress1
// Other: VirtualIPAddress
func (v *VPCRouter) RealIPAddress(index int) (string, int) {
if !v.HasInterfaces() {
return "", -1
}
for i, nic := range v.Settings.Router.Interfaces {
if i == index {
if index > 0 && nic == nil {
return "", -1
}
if index == 0 && v.IsStandardPlan() {
return v.Interfaces[0].IPAddress, v.Interfaces[0].Switch.Subnet.NetworkMaskLen
}
nwMask := nic.NetworkMaskLen
if index == 0 {
nwMask = v.Interfaces[0].Switch.Subnet.NetworkMaskLen
}
if v.IsStandardPlan() {
return nic.IPAddress[0], nwMask
}
return nic.VirtualIPAddress, nwMask
}
}
return "", -1
}
// FindBelongsInterface 指定のIPアドレスが所属するIPレンジを持つインターフェースを取得
func (v *VPCRouter) FindBelongsInterface(ip net.IP) (int, *VPCRouterInterface) {
if !v.HasInterfaces() {
return -1, nil
}
for i, nic := range v.Settings.Router.Interfaces {
nicIP, maskLen := v.RealIPAddress(i)
if nicIP != "" {
_, ipv4Net, err := net.ParseCIDR(fmt.Sprintf("%s/%d", nicIP, maskLen))
if err != nil {
return -1, nil
}
if ipv4Net.Contains(ip) {
return i, nic
}
}
}
return -1, nil
}