1// Copyright 2016-2020 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 15package sacloud 16 17import ( 18 "encoding/json" 19) 20 21// NFS NFS 22type NFS struct { 23 *Appliance // アプライアンス共通属性 24 25 Remark *NFSRemark `json:",omitempty"` // リマーク 26 Settings *NFSSettings `json:",omitempty"` // NFS設定 27} 28 29// NFSRemark リマーク 30type NFSRemark struct { 31 *ApplianceRemarkBase 32 Plan *struct { 33 ID json.Number `json:",omitempty"` 34 } `json:",omitempty"` // プラン 35 // TODO Zone 36 //Zone *Resource 37 //SourceAppliance *Resource // クローン元DB 38} 39 40// SetRemarkPlanID プランID設定 41func (n NFSRemark) SetRemarkPlanID(planID ID) { 42 if n.Plan == nil { 43 n.Plan = &struct { 44 ID json.Number `json:",omitempty"` 45 }{} 46 } 47 n.Plan.ID = json.Number(planID) 48} 49 50// NFSSettings NFS設定リスト 51type NFSSettings struct { 52} 53 54// NFSPlan プラン(HDD/SSD) 55type NFSPlan int 56 57var ( 58 // NFSPlanHDD 標準プラン(HDD) 59 NFSPlanHDD = NFSPlan(1) 60 // NFSPlanSSD SSHプラン 61 NFSPlanSSD = NFSPlan(2) 62) 63 64// String NFSプランの文字列表現 65func (p NFSPlan) String() string { 66 switch p { 67 case NFSPlanHDD: 68 return "HDD" 69 case NFSPlanSSD: 70 return "SSD" 71 default: 72 return "" 73 } 74} 75 76// NFSSize NFSサイズ 77type NFSSize int 78 79var ( 80 // NFSSize20G 20Gプラン 81 NFSSize20G = NFSSize(20) 82 // NFSSize100G 100Gプラン 83 NFSSize100G = NFSSize(100) 84 // NFSSize500G 500Gプラン 85 NFSSize500G = NFSSize(500) 86 // NFSSize1T 1T(1024GB)プラン 87 NFSSize1T = NFSSize(1024 * 1) 88 // NFSSize2T 2T(2048GB)プラン 89 NFSSize2T = NFSSize(1024 * 2) 90 // NFSSize4T 4T(4096GB)プラン 91 NFSSize4T = NFSSize(1024 * 4) 92 // NFSSize8T 8TBプラン 93 NFSSize8T = NFSSize(1024 * 8) 94 // NFSSize12T 12TBプラン 95 NFSSize12T = NFSSize(1024 * 12) 96) 97 98// AllowNFSNormalPlanSizes 指定可能なNFSサイズ(標準プラン) 99func AllowNFSNormalPlanSizes() []int { 100 return []int{ 101 int(NFSSize100G), 102 int(NFSSize500G), 103 int(NFSSize1T), 104 int(NFSSize2T), 105 int(NFSSize4T), 106 int(NFSSize8T), 107 int(NFSSize12T), 108 } 109} 110 111// AllowNFSSSDPlanSizes 指定可能なNFSサイズ(SSDプラン) 112func AllowNFSSSDPlanSizes() []int { 113 return []int{ 114 int(NFSSize20G), 115 int(NFSSize100G), 116 int(NFSSize500G), 117 int(NFSSize1T), 118 int(NFSSize2T), 119 int(NFSSize4T), 120 } 121} 122 123// AllowNFSAllPlanSizes 指定可能なNFSサイズ(HDD/SSD両方) 124// 125// ディスクプランによって選択できないサイズを含むため、利用する側で適切にバリデーションを行う必要がある 126func AllowNFSAllPlanSizes() []int { 127 return []int{ 128 int(NFSSize20G), 129 int(NFSSize100G), 130 int(NFSSize500G), 131 int(NFSSize1T), 132 int(NFSSize2T), 133 int(NFSSize4T), 134 int(NFSSize8T), 135 int(NFSSize12T), 136 } 137} 138 139// CreateNFSValue NFS作成用パラメーター 140type CreateNFSValue struct { 141 SwitchID ID // 接続先スイッチID 142 IPAddress string // IPアドレス 143 MaskLen int // ネットワークマスク長 144 DefaultRoute string // デフォルトルート 145 Name string // 名称 146 Description string // 説明 147 Tags []string // タグ 148 Icon *Resource // アイコン 149 SourceAppliance *Resource // クローン元NFS 150} 151 152// NewNFS NFS作成(冗長化なし) 153func NewNFS(values *CreateNFSValue) *NFS { 154 155 return &NFS{ 156 Appliance: &Appliance{ 157 Class: "nfs", 158 propName: propName{Name: values.Name}, 159 propDescription: propDescription{Description: values.Description}, 160 propTags: propTags{Tags: values.Tags}, 161 //propPlanID: propPlanID{Plan: &Resource{ID: int64(values.Plan)}}, 162 propIcon: propIcon{ 163 &Icon{ 164 Resource: values.Icon, 165 }, 166 }, 167 }, 168 Remark: &NFSRemark{ 169 ApplianceRemarkBase: &ApplianceRemarkBase{ 170 Switch: &ApplianceRemarkSwitch{ 171 ID: values.SwitchID, 172 }, 173 Network: &ApplianceRemarkNetwork{ 174 NetworkMaskLen: values.MaskLen, 175 DefaultRoute: values.DefaultRoute, 176 }, 177 Servers: []interface{}{ 178 map[string]interface{}{"IPAddress": values.IPAddress}, 179 }, 180 }, 181 //propPlanID: propPlanID{Plan: &Resource{ID: int64(values.Plan)}}, 182 }, 183 } 184 185} 186 187// IPAddress IPアドレスを取得 188func (n *NFS) IPAddress() string { 189 if len(n.Remark.Servers) < 1 { 190 return "" 191 } 192 193 v, ok := n.Remark.Servers[0].(map[string]interface{}) 194 if !ok { 195 return "" 196 } 197 198 if ip, ok := v["IPAddress"]; ok { 199 return ip.(string) 200 } 201 return "" 202} 203 204// NetworkMaskLen ネットワークマスク長を取得 205func (n *NFS) NetworkMaskLen() int { 206 if n.Remark.Network == nil { 207 return -1 208 } 209 return n.Remark.Network.NetworkMaskLen 210} 211 212// DefaultRoute デフォルトゲートウェイを取得 213func (n *NFS) DefaultRoute() string { 214 if n.Remark.Network == nil { 215 return "" 216 } 217 return n.Remark.Network.DefaultRoute 218} 219 220// NFSPlans NFSプラン 221type NFSPlans struct { 222 HDD []NFSPlanValue 223 SSD []NFSPlanValue 224} 225 226// FindPlanID プランとサイズからプランIDを取得 227func (p NFSPlans) FindPlanID(plan NFSPlan, size NFSSize) ID { 228 var plans []NFSPlanValue 229 switch plan { 230 case NFSPlanHDD: 231 plans = p.HDD 232 case NFSPlanSSD: 233 plans = p.SSD 234 default: 235 return -1 236 } 237 238 for _, plan := range plans { 239 if plan.Availability == "available" && plan.Size == int(size) { 240 return plan.PlanID 241 } 242 } 243 244 return -1 245} 246 247// FindByPlanID プランIDから該当プランを取得 248func (p NFSPlans) FindByPlanID(planID ID) (NFSPlan, *NFSPlanValue) { 249 250 for _, plan := range p.SSD { 251 id := plan.PlanID 252 if id == planID { 253 return NFSPlanSSD, &plan 254 } 255 } 256 257 for _, plan := range p.HDD { 258 id := plan.PlanID 259 if id == planID { 260 return NFSPlanHDD, &plan 261 } 262 } 263 return NFSPlan(-1), nil 264} 265 266// NFSPlanValue NFSプラン 267type NFSPlanValue struct { 268 Size int `json:"size"` 269 Availability string `json:"availability"` 270 PlanID ID `json:"planId"` 271} 272