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