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 builder
16
17import (
18	"time"
19
20	"github.com/sacloud/libsacloud/api"
21	"github.com/sacloud/libsacloud/sacloud"
22	"github.com/sacloud/libsacloud/sacloud/ostype"
23)
24
25// APIClient represents SAKURA CLOUD api client
26type APIClient interface {
27	ServerNew() *sacloud.Server
28	ServerRead(serverID sacloud.ID) (*sacloud.Server, error)
29	ServerCreate(value *sacloud.Server) (*sacloud.Server, error)
30	ServerSleepUntilUp(serverID sacloud.ID, timeout time.Duration) error
31	ServerInsertCDROM(serverID sacloud.ID, cdromID sacloud.ID) (bool, error)
32	ServerBoot(serverID sacloud.ID) (bool, error)
33
34	SSHKeyNew() *sacloud.SSHKey
35	SSHKeyCreate(value *sacloud.SSHKey) (*sacloud.SSHKey, error)
36	SSHKeyDelete(sshKeyID sacloud.ID) (*sacloud.SSHKey, error)
37	SSHKeyGenerate(name string, passPhrase string, desc string) (*sacloud.SSHKeyGenerated, error)
38
39	NoteNew() *sacloud.Note
40	NoteCreate(value *sacloud.Note) (*sacloud.Note, error)
41	NoteDelete(noteID sacloud.ID) (*sacloud.Note, error)
42
43	DiskNew() *sacloud.Disk
44	DiskNewCondig() *sacloud.DiskEditValue
45	DiskCreate(value *sacloud.Disk) (*sacloud.Disk, error)
46	DiskCreateWithConfig(value *sacloud.Disk, config *sacloud.DiskEditValue, bootAtAvailable bool) (*sacloud.Disk, error)
47	DiskSleepWhileCopying(id sacloud.ID, timeout time.Duration) error
48	DiskConnectToServer(diskID sacloud.ID, serverID sacloud.ID) (bool, error)
49
50	InterfaceConnectToPacketFilter(interfaceID sacloud.ID, packetFilterID sacloud.ID) (bool, error)
51	InterfaceSetDisplayIPAddress(interfaceID sacloud.ID, ip string) (bool, error) // Interface
52
53	ServerPlanGetBySpec(core, memGB int, gen sacloud.PlanGenerations, commitment sacloud.ECommitment) (*sacloud.ProductServer, error)
54
55	ArchiveFindByOSType(os ostype.ArchiveOSTypes) (*sacloud.Archive, error)
56
57	GetTimeoutDuration() time.Duration
58}
59
60// NewAPIClient create new APICLient from *api.Client
61func NewAPIClient(client *api.Client) APIClient {
62	return &apiClient{client: client}
63}
64
65type apiClient struct {
66	client *api.Client
67}
68
69func (a *apiClient) ServerNew() *sacloud.Server {
70	return a.client.Server.New()
71}
72
73func (a *apiClient) ServerRead(serverID sacloud.ID) (*sacloud.Server, error) {
74	return a.client.Server.Read(serverID)
75}
76
77func (a *apiClient) ServerCreate(value *sacloud.Server) (*sacloud.Server, error) {
78	return a.client.Server.Create(value)
79}
80
81func (a *apiClient) ServerSleepUntilUp(serverID sacloud.ID, timeout time.Duration) error {
82	return a.client.Server.SleepUntilUp(serverID, timeout)
83}
84
85func (a *apiClient) ServerInsertCDROM(serverID sacloud.ID, cdromID sacloud.ID) (bool, error) {
86	return a.client.Server.InsertCDROM(serverID, cdromID)
87}
88
89func (a *apiClient) ServerBoot(serverID sacloud.ID) (bool, error) {
90	return a.client.Server.Boot(serverID)
91}
92
93func (a *apiClient) SSHKeyNew() *sacloud.SSHKey {
94	return a.client.SSHKey.New()
95}
96
97func (a *apiClient) SSHKeyCreate(value *sacloud.SSHKey) (*sacloud.SSHKey, error) {
98	return a.client.SSHKey.Create(value)
99}
100
101func (a *apiClient) SSHKeyDelete(sshKeyID sacloud.ID) (*sacloud.SSHKey, error) {
102	return a.client.SSHKey.Delete(sshKeyID)
103}
104
105func (a *apiClient) SSHKeyGenerate(name string, passPhrase string, desc string) (*sacloud.SSHKeyGenerated, error) {
106	return a.client.SSHKey.Generate(name, passPhrase, desc)
107}
108
109func (a *apiClient) NoteNew() *sacloud.Note {
110	return a.client.Note.New()
111}
112
113func (a *apiClient) NoteCreate(value *sacloud.Note) (*sacloud.Note, error) {
114	return a.client.Note.Create(value)
115}
116
117func (a *apiClient) NoteDelete(noteID sacloud.ID) (*sacloud.Note, error) {
118	return a.client.Note.Delete(noteID)
119}
120
121func (a *apiClient) DiskNew() *sacloud.Disk {
122	return a.client.Disk.New()
123}
124
125func (a *apiClient) DiskNewCondig() *sacloud.DiskEditValue {
126	return a.client.Disk.NewCondig()
127}
128
129func (a *apiClient) DiskCreate(value *sacloud.Disk) (*sacloud.Disk, error) {
130	return a.client.Disk.Create(value)
131}
132
133func (a *apiClient) DiskCreateWithConfig(
134	value *sacloud.Disk,
135	config *sacloud.DiskEditValue,
136	bootAtAvailable bool) (*sacloud.Disk, error) {
137	return a.client.Disk.CreateWithConfig(value, config, bootAtAvailable)
138}
139
140func (a *apiClient) DiskSleepWhileCopying(id sacloud.ID, timeout time.Duration) error {
141	return a.client.Disk.SleepWhileCopying(id, timeout)
142}
143
144func (a *apiClient) DiskConnectToServer(diskID sacloud.ID, serverID sacloud.ID) (bool, error) {
145	return a.client.Disk.ConnectToServer(diskID, serverID)
146}
147
148func (a *apiClient) InterfaceConnectToPacketFilter(interfaceID sacloud.ID, packetFilterID sacloud.ID) (bool, error) {
149	return a.client.Interface.ConnectToPacketFilter(interfaceID, packetFilterID)
150}
151
152func (a *apiClient) InterfaceSetDisplayIPAddress(interfaceID sacloud.ID, ip string) (bool, error) {
153	return a.client.Interface.SetDisplayIPAddress(interfaceID, ip)
154}
155
156func (a *apiClient) ServerPlanGetBySpec(core, memGB int, gen sacloud.PlanGenerations, commitment sacloud.ECommitment) (*sacloud.ProductServer, error) {
157	if string(commitment) == "" {
158		commitment = sacloud.ECommitmentStandard
159	}
160	return a.client.Product.Server.GetBySpecCommitment(core, memGB, gen, commitment)
161}
162
163func (a *apiClient) ArchiveFindByOSType(os ostype.ArchiveOSTypes) (*sacloud.Archive, error) {
164	return a.client.Archive.FindByOSType(os)
165}
166
167func (a *apiClient) GetTimeoutDuration() time.Duration {
168	return a.client.DefaultTimeoutDuration
169}
170