github.com/sacloud/iaas-api-go@v1.12.0/naked/mobile_gateway.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 naked
    16  
    17  import (
    18  	"encoding/json"
    19  	"strings"
    20  	"time"
    21  
    22  	"github.com/sacloud/iaas-api-go/types"
    23  )
    24  
    25  // MobileGateway モバイルゲートウェイ
    26  type MobileGateway struct {
    27  	ID           types.ID                `json:",omitempty" yaml:"id,omitempty" structs:",omitempty"`
    28  	Class        string                  `json:",omitempty" yaml:"class,omitempty" structs:",omitempty"`
    29  	Name         string                  `json:",omitempty" yaml:"name,omitempty" structs:",omitempty"`
    30  	Tags         types.Tags              `yaml:"tags"`
    31  	Description  string                  `yaml:"description"`
    32  	Plan         *AppliancePlan          `json:",omitempty" yaml:"plan,omitempty" structs:",omitempty"`
    33  	Settings     *MobileGatewaySettings  `json:",omitempty" yaml:"settings,omitempty" structs:",omitempty"`
    34  	SettingsHash string                  `json:",omitempty" yaml:"settings_hash,omitempty" structs:",omitempty"`
    35  	Remark       *ApplianceRemark        `json:",omitempty" yaml:"remark,omitempty" structs:",omitempty"`
    36  	Availability types.EAvailability     `json:",omitempty" yaml:"availability,omitempty" structs:",omitempty"`
    37  	Instance     *Instance               `json:",omitempty" yaml:"instance,omitempty" structs:",omitempty"`
    38  	ServiceClass string                  `json:",omitempty" yaml:"service_class,omitempty" structs:",omitempty"`
    39  	CreatedAt    *time.Time              `json:",omitempty" yaml:"created_at,omitempty" structs:",omitempty"`
    40  	Icon         *Icon                   `json:",omitempty" yaml:"icon,omitempty" structs:",omitempty"`
    41  	Switch       *Switch                 `json:",omitempty" yaml:"switch,omitempty" structs:",omitempty"`
    42  	Interfaces   MobileGatewayInterfaces `json:",omitempty" yaml:"interfaces,omitempty" structs:",omitempty"`
    43  }
    44  
    45  // MobileGatewaySettingsUpdate モバイルゲートウェイ
    46  type MobileGatewaySettingsUpdate struct {
    47  	Settings     *MobileGatewaySettings `json:",omitempty" yaml:"settings,omitempty" structs:",omitempty"`
    48  	SettingsHash string                 `json:",omitempty" yaml:"settings_hash,omitempty" structs:",omitempty"`
    49  }
    50  
    51  // MobileGatewayInterfaces 要素がnullにことがある場合に対応するためのtype
    52  //
    53  // 例: モバイルゲートウェイ 作成時、eth0/eth1の2要素が返ってくるがeth1の分はnullとなっている。
    54  type MobileGatewayInterfaces []*Interface
    55  
    56  // UnmarshalJSON 配列中にnullが返ってくる(VPCルータなど)への対応
    57  func (i *MobileGatewayInterfaces) UnmarshalJSON(b []byte) error {
    58  	type alias MobileGatewayInterfaces
    59  	var a alias
    60  	if err := json.Unmarshal(b, &a); err != nil {
    61  		return err
    62  	}
    63  
    64  	var dest []*Interface
    65  	for i, v := range a {
    66  		if v != nil {
    67  			if v.Index == 0 {
    68  				v.Index = i
    69  			}
    70  			dest = append(dest, v)
    71  		}
    72  	}
    73  
    74  	*i = MobileGatewayInterfaces(dest)
    75  	return nil
    76  }
    77  
    78  // MobileGatewaySettings モバイルゲートウェイ セッティング
    79  type MobileGatewaySettings struct {
    80  	MobileGateway *MobileGatewaySetting `json:",omitempty" yaml:"mobile_gateway,omitempty" structs:",omitempty"`
    81  }
    82  
    83  // MobileGatewaySetting モバイルゲートウェイ セッティング
    84  type MobileGatewaySetting struct {
    85  	Interfaces               MobileGatewayInterfacesSettings        `json:",omitempty" yaml:"interfaces,omitempty" structs:",omitempty"`
    86  	InternetConnection       *MobileGatewayInternetConnection       `json:",omitempty" yaml:"internet_connection,omitempty" structs:",omitempty"`
    87  	StaticRoutes             []*MobileGatewayStaticRoute            `json:",omitempty" yaml:"static_routes,omitempty" structs:",omitempty"`
    88  	InterDeviceCommunication *MobileGatewayInterDeviceCommunication `json:",omitempty" yaml:"inter_device_communication,omitempty" structs:",omitempty"`
    89  }
    90  
    91  // MobileGatewayInterDeviceCommunication デバイス間通信
    92  type MobileGatewayInterDeviceCommunication struct {
    93  	Enabled types.StringFlag `yaml:"enabled"`
    94  }
    95  
    96  // MobileGatewayInternetConnection インターネット接続
    97  type MobileGatewayInternetConnection struct {
    98  	Enabled types.StringFlag `yaml:"enabled"`
    99  }
   100  
   101  // MobileGatewayStaticRoute スタティックルート
   102  type MobileGatewayStaticRoute struct {
   103  	Prefix  string `json:",omitempty" yaml:",omitempty" structs:",omitempty"`
   104  	NextHop string `json:",omitempty" yaml:",omitempty" structs:",omitempty"`
   105  }
   106  
   107  // MobileGatewayResolver DNS登録用パラメータ
   108  type MobileGatewayResolver struct {
   109  	SimGroup *MobileGatewaySIMGroup `json:"sim_group,omitempty" yaml:"sim_group,omitempty" structs:",omitempty"`
   110  }
   111  
   112  // MobileGatewaySIMGroup DNS登録用SIMグループ値
   113  type MobileGatewaySIMGroup struct {
   114  	DNS1 string `json:"dns_1,omitempty" yaml:"dns_1,omitempty" structs:",omitempty"`
   115  	DNS2 string `json:"dns_2,omitempty" yaml:"dns_2,omitempty" structs:",omitempty"`
   116  }
   117  
   118  // UnmarshalJSON JSONアンマーシャル(配列、オブジェクトが混在するためここで対応)
   119  func (m *MobileGatewaySIMGroup) UnmarshalJSON(data []byte) error {
   120  	targetData := strings.ReplaceAll(strings.ReplaceAll(string(data), " ", ""), "\n", "")
   121  	if targetData == `[]` {
   122  		return nil
   123  	}
   124  
   125  	type alias MobileGatewaySIMGroup
   126  	tmp := alias{}
   127  	if err := json.Unmarshal(data, &tmp); err != nil {
   128  		return err
   129  	}
   130  	*m = MobileGatewaySIMGroup(tmp)
   131  	return nil
   132  }
   133  
   134  // MobileGatewaySIMRoute SIMルート
   135  type MobileGatewaySIMRoute struct {
   136  	ICCID      string `json:"iccid,omitempty" yaml:"iccid,omitempty" structs:",omitempty"`
   137  	Prefix     string `json:"prefix,omitempty" yaml:"prefix,omitempty" structs:",omitempty"`
   138  	ResourceID string `json:"resource_id,omitempty" yaml:"resource_id,omitempty" structs:",omitempty"`
   139  }
   140  
   141  // MobileGatewaySIMRoutes SIMルート一覧
   142  type MobileGatewaySIMRoutes struct {
   143  	SIMRoutes []*MobileGatewaySIMRoute `json:"sim_routes" yaml:"sim_routes,omitempty" structs:",omitempty"`
   144  }
   145  
   146  // TrafficStatus トラフィックコントロール 当月通信量
   147  type TrafficStatus struct {
   148  	UplinkBytes    types.StringNumber `json:"uplink_bytes,omitempty" yaml:"uplink_bytes,omitempty" structs:",omitempty"`
   149  	DownlinkBytes  types.StringNumber `json:"downlink_bytes,omitempty" yaml:"downlink_bytes,omitempty" structs:",omitempty"`
   150  	TrafficShaping bool               `json:"traffic_shaping" yaml:"traffic_shaping"` // 帯域制限
   151  }
   152  
   153  // UnmarshalJSON JSONアンマーシャル(uint64文字列対応)
   154  func (s *TrafficStatus) UnmarshalJSON(data []byte) error {
   155  	type alias TrafficStatus
   156  	tmp := alias{}
   157  	if err := json.Unmarshal(data, &tmp); err != nil {
   158  		return err
   159  	}
   160  	*s = TrafficStatus(tmp)
   161  	return nil
   162  }
   163  
   164  // TrafficMonitoringConfig トラフィックコントロール 設定
   165  type TrafficMonitoringConfig struct {
   166  	TrafficQuotaInMB     int                          `json:"traffic_quota_in_mb" yaml:"traffic_quota_in_mb"`
   167  	BandWidthLimitInKbps int                          `json:"bandwidth_limit_in_kbps" yaml:"bandwidth_limit_in_kbps"`
   168  	EMailConfig          TrafficMonitoringNotifyEmail `json:"email_config" yaml:"email_config"`
   169  	SlackConfig          TrafficMonitoringNotifySlack `json:"slack_config" yaml:"slack_config"`
   170  	AutoTrafficShaping   bool                         `json:"auto_traffic_shaping" yaml:"auto_traffic_shaping"`
   171  }
   172  
   173  // TrafficMonitoringNotifyEmail トラフィックコントロール通知設定
   174  type TrafficMonitoringNotifyEmail struct {
   175  	Enabled bool `json:"enabled" yaml:"enabled"` // 有効/無効
   176  }
   177  
   178  // TrafficMonitoringNotifySlack トラフィックコントロール通知設定
   179  type TrafficMonitoringNotifySlack struct {
   180  	Enabled             bool   `json:"enabled" yaml:"enabled"`                         // 有効/無効
   181  	IncomingWebhooksURL string `json:"slack_url,omitempty" yaml:"slack_url,omitempty"` // Slack通知の場合のWebhook URL
   182  }
   183  
   184  // MobileGatewayInterface インターフェース
   185  type MobileGatewayInterface struct {
   186  	IPAddress      []string `json:",omitempty" yaml:",omitempty" structs:",omitempty"`
   187  	NetworkMaskLen int      `json:",omitempty" yaml:",omitempty" structs:",omitempty"`
   188  	// Index 仮想フィールド、VPCルータなどでInterfaces(実体は[]*Interface)を扱う場合にUnmarshalJSONの中で設定される
   189  	//
   190  	// Findした際のAPIからの応答にも同名のフィールドが含まれるが無関係。
   191  	Index int
   192  }
   193  
   194  // MobileGatewayInterfacesSettings Interface配列
   195  //
   196  // 配列中にnullが返ってくる(VPCルータなど)への対応のためのtype
   197  type MobileGatewayInterfacesSettings []*MobileGatewayInterface
   198  
   199  // UnmarshalJSON 配列中にnullが返ってくる(VPCルータなど)への対応
   200  func (i *MobileGatewayInterfacesSettings) UnmarshalJSON(b []byte) error {
   201  	type alias MobileGatewayInterfacesSettings
   202  	var a alias
   203  	if err := json.Unmarshal(b, &a); err != nil {
   204  		return err
   205  	}
   206  
   207  	var dest []*MobileGatewayInterface
   208  	for i, v := range a {
   209  		if v != nil {
   210  			if v.Index == 0 {
   211  				v.Index = i
   212  			}
   213  			dest = append(dest, v)
   214  		}
   215  	}
   216  
   217  	*i = MobileGatewayInterfacesSettings(dest)
   218  	return nil
   219  }
   220  
   221  // MarshalJSON 配列中にnullが入る場合(VPCルータなど)への対応
   222  func (i MobileGatewayInterfacesSettings) MarshalJSON() ([]byte, error) {
   223  	max := 0
   224  	for _, iface := range i {
   225  		if max < iface.Index {
   226  			max = iface.Index
   227  		}
   228  	}
   229  
   230  	var dest = make([]*MobileGatewayInterface, max+1)
   231  	for _, iface := range i {
   232  		dest[iface.Index] = iface
   233  	}
   234  
   235  	return json.Marshal(dest)
   236  }
   237  
   238  // MarshalJSON JSON
   239  func (i *MobileGatewayInterface) MarshalJSON() ([]byte, error) {
   240  	type alias struct {
   241  		IPAddress      []string `json:",omitempty" yaml:",omitempty" structs:",omitempty"`
   242  		NetworkMaskLen int      `json:",omitempty" yaml:",omitempty" structs:",omitempty"`
   243  	}
   244  
   245  	tmp := alias{
   246  		IPAddress:      i.IPAddress,
   247  		NetworkMaskLen: i.NetworkMaskLen,
   248  	}
   249  	return json.Marshal(tmp)
   250  }