diff --git a/Gopkg.lock b/Gopkg.lock index c23689b3..355b7c43 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -226,6 +226,17 @@ packages = ["."] revision = "1031fa0ce2f20c1c0e1e1b51951d8ea02c84fa05" +[[projects]] + branch = "master" + name = "github.com/sacloud/libsacloud" + packages = [ + ".", + "api", + "sacloud", + "sacloud/ostype" + ] + revision = "178aa57136e8c6e3882b6b5ef37a48f0e7cf836f" + [[projects]] name = "github.com/sirupsen/logrus" packages = ["."] @@ -363,6 +374,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "6b701827736620696c106773b62665f722b691a3025b851fe1a5d3c321d77d21" + inputs-digest = "d93e6f0825f1f7c1c3c2ccd421af4d99b77b390f3346ca751968af0609119c96" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index cd0dfab6..e323e0ed 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -24,6 +24,11 @@ # go-tests = true # unused-packages = true +[prune] + non-go = true + go-tests = true + unused-packages = true + [[constraint]] branch = "master" name = "github.com/decker502/dnspod-go" @@ -68,7 +73,6 @@ branch = "v2" name = "gopkg.in/ns1/ns1-go.v2" -[prune] - non-go = true - go-tests = true - unused-packages = true +[[constraint]] + branch = "master" + name = "github.com/sacloud/libsacloud" diff --git a/cli.go b/cli.go index 68e0506e..a499dc76 100644 --- a/cli.go +++ b/cli.go @@ -226,6 +226,7 @@ Here is an example bash command using the CloudFlare DNS provider: fmt.Fprintln(w, "\tpdns:\tPDNS_API_KEY, PDNS_API_URL") fmt.Fprintln(w, "\tdnspod:\tDNSPOD_API_KEY") fmt.Fprintln(w, "\totc:\tOTC_USER_NAME, OTC_PASSWORD, OTC_PROJECT_NAME, OTC_DOMAIN_NAME, OTC_IDENTITY_ENDPOINT") + fmt.Fprintln(w, "\tsakuracloud:\tSAKURACLOUD_ACCESS_TOKEN, SAKURACLOUD_ACCESS_TOKEN_SECRET") fmt.Fprintln(w, "\texec:\tEXEC_PATH") w.Flush() diff --git a/providers/dns/dns_providers.go b/providers/dns/dns_providers.go index 0f54c27f..2a4c80e3 100644 --- a/providers/dns/dns_providers.go +++ b/providers/dns/dns_providers.go @@ -34,6 +34,7 @@ import ( "github.com/xenolf/lego/providers/dns/rackspace" "github.com/xenolf/lego/providers/dns/rfc2136" "github.com/xenolf/lego/providers/dns/route53" + "github.com/xenolf/lego/providers/dns/sakuracloud" "github.com/xenolf/lego/providers/dns/vultr" ) @@ -92,6 +93,8 @@ func NewDNSChallengeProviderByName(name string) (acme.ChallengeProvider, error) return route53.NewDNSProvider() case "rfc2136": return rfc2136.NewDNSProvider() + case "sakuracloud": + return sakuracloud.NewDNSProvider() case "vultr": return vultr.NewDNSProvider() case "ovh": diff --git a/providers/dns/sakuracloud/sakuracloud.go b/providers/dns/sakuracloud/sakuracloud.go new file mode 100644 index 00000000..17ca694a --- /dev/null +++ b/providers/dns/sakuracloud/sakuracloud.go @@ -0,0 +1,144 @@ +// Package sakuracloud implements a DNS provider for solving the DNS-01 challenge +// using sakuracloud DNS. +package sakuracloud + +import ( + "errors" + "fmt" + "net/http" + "strings" + + "github.com/sacloud/libsacloud/api" + "github.com/sacloud/libsacloud/sacloud" + "github.com/xenolf/lego/acme" + "github.com/xenolf/lego/platform/config/env" +) + +// DNSProvider is an implementation of the acme.ChallengeProvider interface. +type DNSProvider struct { + client *api.Client +} + +// NewDNSProvider returns a DNSProvider instance configured for sakuracloud. +// Credentials must be passed in the environment variables: SAKURACLOUD_ACCESS_TOKEN & SAKURACLOUD_ACCESS_TOKEN_SECRET +func NewDNSProvider() (*DNSProvider, error) { + values, err := env.Get("SAKURACLOUD_ACCESS_TOKEN", "SAKURACLOUD_ACCESS_TOKEN_SECRET") + if err != nil { + return nil, fmt.Errorf("SakuraCloud: %v", err) + } + + return NewDNSProviderCredentials(values["SAKURACLOUD_ACCESS_TOKEN"], values["SAKURACLOUD_ACCESS_TOKEN_SECRET"]) +} + +// NewDNSProviderCredentials uses the supplied credentials to return a +// DNSProvider instance configured for sakuracloud. +func NewDNSProviderCredentials(token, secret string) (*DNSProvider, error) { + if token == "" { + return nil, errors.New("SakuraCloud AccessToken is missing") + } + if secret == "" { + return nil, errors.New("SakuraCloud AccessSecret is missing") + } + + client := api.NewClient(token, secret, "tk1a") + client.UserAgent = acme.UserAgent + + return &DNSProvider{client: client}, nil +} + +// Present creates a TXT record to fulfil the dns-01 challenge. +func (d *DNSProvider) Present(domain, token, keyAuth string) error { + fqdn, value, ttl := acme.DNS01Record(domain, keyAuth) + + zone, err := d.getHostedZone(domain) + if err != nil { + return err + } + + name := d.extractRecordName(fqdn, zone.Name) + + zone.AddRecord(zone.CreateNewRecord(name, "TXT", value, ttl)) + _, err = d.client.GetDNSAPI().Update(zone.ID, zone) + if err != nil { + return fmt.Errorf("SakuraCloud API call failed: %v", err) + } + + return nil +} + +// CleanUp removes the TXT record matching the specified parameters. +func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error { + fqdn, _, _ := acme.DNS01Record(domain, keyAuth) + + zone, err := d.getHostedZone(domain) + if err != nil { + return err + } + + records, err := d.findTxtRecords(fqdn, zone) + if err != nil { + return err + } + + for _, record := range records { + var updRecords []sacloud.DNSRecordSet + for _, r := range zone.Settings.DNS.ResourceRecordSets { + if !(r.Name == record.Name && r.Type == record.Type && r.RData == record.RData) { + updRecords = append(updRecords, r) + } + } + zone.Settings.DNS.ResourceRecordSets = updRecords + } + + _, err = d.client.GetDNSAPI().Update(zone.ID, zone) + if err != nil { + return fmt.Errorf("SakuraCloud API call failed: %v", err) + } + + return nil +} + +func (d *DNSProvider) getHostedZone(domain string) (*sacloud.DNS, error) { + authZone, err := acme.FindZoneByFqdn(acme.ToFqdn(domain), acme.RecursiveNameservers) + if err != nil { + return nil, err + } + + zoneName := acme.UnFqdn(authZone) + + res, err := d.client.GetDNSAPI().WithNameLike(zoneName).Find() + if err != nil { + if notFound, ok := err.(api.Error); ok && notFound.ResponseCode() == http.StatusNotFound { + return nil, fmt.Errorf("zone %s not found on SakuraCloud DNS: %v", zoneName, err) + } + return nil, fmt.Errorf("SakuraCloud API call failed: %v", err) + } + + for _, zone := range res.CommonServiceDNSItems { + if zone.Name == zoneName { + return &zone, nil + } + } + + return nil, fmt.Errorf("zone %s not found on SakuraCloud DNS", zoneName) +} + +func (d *DNSProvider) findTxtRecords(fqdn string, zone *sacloud.DNS) ([]sacloud.DNSRecordSet, error) { + recordName := d.extractRecordName(fqdn, zone.Name) + + var res []sacloud.DNSRecordSet + for _, record := range zone.Settings.DNS.ResourceRecordSets { + if record.Name == recordName && record.Type == "TXT" { + res = append(res, record) + } + } + return res, nil +} + +func (d *DNSProvider) extractRecordName(fqdn, domain string) string { + name := acme.UnFqdn(fqdn) + if idx := strings.Index(name, "."+domain); idx != -1 { + return name[:idx] + } + return name +} diff --git a/providers/dns/sakuracloud/sakuracloud_test.go b/providers/dns/sakuracloud/sakuracloud_test.go new file mode 100644 index 00000000..5ca055c4 --- /dev/null +++ b/providers/dns/sakuracloud/sakuracloud_test.go @@ -0,0 +1,111 @@ +package sakuracloud + +import ( + "os" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/xenolf/lego/acme" +) + +var ( + sakuracloudLiveTest bool + sakuracloudAccessToken string + sakuracloudAccessSecret string + sakuracloudDomain string +) + +func init() { + sakuracloudAccessToken = os.Getenv("SAKURACLOUD_ACCESS_TOKEN") + sakuracloudAccessSecret = os.Getenv("SAKURACLOUD_ACCESS_TOKEN_SECRET") + sakuracloudDomain = os.Getenv("SAKURACLOUD_DOMAIN") + + if len(sakuracloudAccessToken) > 0 && len(sakuracloudAccessSecret) > 0 && len(sakuracloudDomain) > 0 { + sakuracloudLiveTest = true + } +} + +func restoreEnv() { + os.Setenv("SAKURACLOUD_ACCESS_TOKEN", sakuracloudAccessToken) + os.Setenv("SAKURACLOUD_ACCESS_TOKEN_SECRET", sakuracloudAccessSecret) +} + +// +// NewDNSProvider +// + +func TestNewDNSProviderValid(t *testing.T) { + defer restoreEnv() + + os.Setenv("SAKURACLOUD_ACCESS_TOKEN", "123") + os.Setenv("SAKURACLOUD_ACCESS_TOKEN_SECRET", "456") + provider, err := NewDNSProvider() + + assert.NotNil(t, provider) + assert.Equal(t, acme.UserAgent, provider.client.UserAgent) + assert.NoError(t, err) +} + +func TestNewDNSProviderInvalidWithMissingAccessToken(t *testing.T) { + defer restoreEnv() + + os.Setenv("SAKURACLOUD_ACCESS_TOKEN", "") + provider, err := NewDNSProvider() + + assert.Nil(t, provider) + assert.EqualError(t, err, "SakuraCloud: some credentials information are missing: SAKURACLOUD_ACCESS_TOKEN,SAKURACLOUD_ACCESS_TOKEN_SECRET") +} + +// +// NewDNSProviderCredentials +// + +func TestNewDNSProviderCredentialsValid(t *testing.T) { + provider, err := NewDNSProviderCredentials("123", "456") + + assert.NotNil(t, provider) + assert.Equal(t, acme.UserAgent, provider.client.UserAgent) + assert.NoError(t, err) +} + +func TestNewDNSProviderCredentialsInvalidWithMissingAccessToken(t *testing.T) { + provider, err := NewDNSProviderCredentials("", "") + + assert.Nil(t, provider) + assert.EqualError(t, err, "SakuraCloud AccessToken is missing") +} + +// +// Present +// + +func TestLiveSakuraCloudPresent(t *testing.T) { + if !sakuracloudLiveTest { + t.Skip("skipping live test") + } + + provider, err := NewDNSProviderCredentials(sakuracloudAccessToken, sakuracloudAccessSecret) + assert.NoError(t, err) + + err = provider.Present(sakuracloudDomain, "", "123d==") + assert.NoError(t, err) +} + +// +// Cleanup +// + +func TestLiveSakuraCloudCleanUp(t *testing.T) { + if !sakuracloudLiveTest { + t.Skip("skipping live test") + } + + time.Sleep(time.Second * 1) + + provider, err := NewDNSProviderCredentials(sakuracloudAccessToken, sakuracloudAccessSecret) + assert.NoError(t, err) + + err = provider.CleanUp(sakuracloudDomain, "", "123d==") + assert.NoError(t, err) +} diff --git a/vendor/github.com/sacloud/libsacloud/LICENSE.txt b/vendor/github.com/sacloud/libsacloud/LICENSE.txt new file mode 100644 index 00000000..67fd81f5 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/LICENSE.txt @@ -0,0 +1,207 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +================================================================================ + + Copyright 2015-2018 Kazumichi Yamamoto. + diff --git a/vendor/github.com/sacloud/libsacloud/api/archive.go b/vendor/github.com/sacloud/libsacloud/api/archive.go new file mode 100644 index 00000000..c752adb6 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/archive.go @@ -0,0 +1,344 @@ +package api + +import ( + "fmt" + "github.com/sacloud/libsacloud/sacloud" + "github.com/sacloud/libsacloud/sacloud/ostype" + "strings" + "time" +) + +// ArchiveAPI アーカイブAPI +type ArchiveAPI struct { + *baseAPI + findFuncMapPerOSType map[ostype.ArchiveOSTypes]func() (*sacloud.Archive, error) +} + +var ( + archiveLatestStableCentOSTags = []string{"current-stable", "distro-centos"} + archiveLatestStableCentOS6Tags = []string{"distro-centos", "distro-ver-6.9"} + archiveLatestStableUbuntuTags = []string{"current-stable", "distro-ubuntu"} + archiveLatestStableDebianTags = []string{"current-stable", "distro-debian"} + archiveLatestStableVyOSTags = []string{"current-stable", "distro-vyos"} + archiveLatestStableCoreOSTags = []string{"current-stable", "distro-coreos"} + archiveLatestStableRancherOSTags = []string{"current-stable", "distro-rancheros"} + archiveLatestStableKusanagiTags = []string{"current-stable", "pkg-kusanagi"} + archiveLatestStableSophosUTMTags = []string{"current-stable", "pkg-sophosutm"} + archiveLatestStableFreeBSDTags = []string{"current-stable", "distro-freebsd"} + archiveLatestStableWindows2012Tags = []string{"os-windows", "distro-ver-2012.2"} + archiveLatestStableWindows2012RDSTags = []string{"os-windows", "distro-ver-2012.2", "windows-rds"} + archiveLatestStableWindows2012RDSOfficeTags = []string{"os-windows", "distro-ver-2012.2", "windows-rds", "with-office"} + archiveLatestStableWindows2016Tags = []string{"os-windows", "distro-ver-2016"} + archiveLatestStableWindows2016RDSTags = []string{"os-windows", "distro-ver-2016", "windows-rds"} + archiveLatestStableWindows2016RDSOfficeTags = []string{"os-windows", "distro-ver-2016", "windows-rds", "with-office"} + archiveLatestStableWindows2016SQLServerWeb = []string{"os-windows", "distro-ver-2016", "windows-sqlserver", "sqlserver-2016", "edition-web"} + archiveLatestStableWindows2016SQLServerStandard = []string{"os-windows", "distro-ver-2016", "windows-sqlserver", "sqlserver-2016", "edition-standard"} + archiveLatestStableWindows2016SQLServerStandardAll = []string{"os-windows", "distro-ver-2016", "windows-sqlserver", "sqlserver-2016", "edition-standard", "windows-rds", "with-office"} +) + +// NewArchiveAPI アーカイブAPI作成 +func NewArchiveAPI(client *Client) *ArchiveAPI { + api := &ArchiveAPI{ + baseAPI: &baseAPI{ + client: client, + FuncGetResourceURL: func() string { + return "archive" + }, + }, + } + + api.findFuncMapPerOSType = map[ostype.ArchiveOSTypes]func() (*sacloud.Archive, error){ + ostype.CentOS: api.FindLatestStableCentOS, + ostype.CentOS6: api.FindLatestStableCentOS6, + ostype.Ubuntu: api.FindLatestStableUbuntu, + ostype.Debian: api.FindLatestStableDebian, + ostype.VyOS: api.FindLatestStableVyOS, + ostype.CoreOS: api.FindLatestStableCoreOS, + ostype.RancherOS: api.FindLatestStableRancherOS, + ostype.Kusanagi: api.FindLatestStableKusanagi, + ostype.SophosUTM: api.FindLatestStableSophosUTM, + ostype.FreeBSD: api.FindLatestStableFreeBSD, + ostype.Windows2012: api.FindLatestStableWindows2012, + ostype.Windows2012RDS: api.FindLatestStableWindows2012RDS, + ostype.Windows2012RDSOffice: api.FindLatestStableWindows2012RDSOffice, + ostype.Windows2016: api.FindLatestStableWindows2016, + ostype.Windows2016RDS: api.FindLatestStableWindows2016RDS, + ostype.Windows2016RDSOffice: api.FindLatestStableWindows2016RDSOffice, + ostype.Windows2016SQLServerWeb: api.FindLatestStableWindows2016SQLServerWeb, + ostype.Windows2016SQLServerStandard: api.FindLatestStableWindows2016SQLServerStandard, + ostype.Windows2016SQLServerStandardAll: api.FindLatestStableWindows2016SQLServerStandardAll, + } + + return api +} + +// OpenFTP FTP接続開始 +func (api *ArchiveAPI) OpenFTP(id int64) (*sacloud.FTPServer, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/ftp", api.getResourceURL(), id) + //body = map[string]bool{"ChangePassword": reset} + res = &sacloud.Response{} + ) + + result, err := api.action(method, uri, nil, res) + if !result || err != nil { + return nil, err + } + + return res.FTPServer, nil +} + +// CloseFTP FTP接続終了 +func (api *ArchiveAPI) CloseFTP(id int64) (bool, error) { + var ( + method = "DELETE" + uri = fmt.Sprintf("%s/%d/ftp", api.getResourceURL(), id) + ) + return api.modify(method, uri, nil) + +} + +// SleepWhileCopying コピー終了まで待機 +func (api *ArchiveAPI) SleepWhileCopying(id int64, timeout time.Duration) error { + handler := waitingForAvailableFunc(func() (hasAvailable, error) { + return api.Read(id) + }, 0) + return blockingPoll(handler, timeout) +} + +// AsyncSleepWhileCopying コピー終了まで待機(非同期) +func (api *ArchiveAPI) AsyncSleepWhileCopying(id int64, timeout time.Duration) (chan (interface{}), chan (interface{}), chan (error)) { + handler := waitingForAvailableFunc(func() (hasAvailable, error) { + return api.Read(id) + }, 0) + return poll(handler, timeout) +} + +// CanEditDisk ディスクの修正が可能か判定 +func (api *ArchiveAPI) CanEditDisk(id int64) (bool, error) { + + archive, err := api.Read(id) + if err != nil { + return false, err + } + + if archive == nil { + return false, nil + } + + // BundleInfoがあれば編集不可 + if archive.BundleInfo != nil && archive.BundleInfo.HostClass == bundleInfoWindowsHostClass { + // Windows + return false, nil + } + + // SophosUTMであれば編集不可 + if archive.HasTag("pkg-sophosutm") || archive.IsSophosUTM() { + return false, nil + } + + for _, t := range allowDiskEditTags { + if archive.HasTag(t) { + // 対応OSインストール済みディスク + return true, nil + } + } + + // ここまできても判定できないならソースに投げる + if archive.SourceDisk != nil && archive.SourceDisk.Availability != "discontinued" { + return api.client.Disk.CanEditDisk(archive.SourceDisk.ID) + } + if archive.SourceArchive != nil && archive.SourceArchive.Availability != "discontinued" { + return api.client.Archive.CanEditDisk(archive.SourceArchive.ID) + } + return false, nil + +} + +// GetPublicArchiveIDFromAncestors 祖先の中からパブリックアーカイブのIDを検索 +func (api *ArchiveAPI) GetPublicArchiveIDFromAncestors(id int64) (int64, bool) { + + emptyID := int64(0) + + archive, err := api.Read(id) + if err != nil { + return emptyID, false + } + + if archive == nil { + return emptyID, false + } + + // BundleInfoがあれば編集不可 + if archive.BundleInfo != nil && archive.BundleInfo.HostClass == bundleInfoWindowsHostClass { + // Windows + return emptyID, false + } + + // SophosUTMであれば編集不可 + if archive.HasTag("pkg-sophosutm") || archive.IsSophosUTM() { + return emptyID, false + } + + for _, t := range allowDiskEditTags { + if archive.HasTag(t) { + // 対応OSインストール済みディスク + return archive.ID, true + } + } + + // ここまできても判定できないならソースに投げる + if archive.SourceDisk != nil && archive.SourceDisk.Availability != "discontinued" { + return api.client.Disk.GetPublicArchiveIDFromAncestors(archive.SourceDisk.ID) + } + if archive.SourceArchive != nil && archive.SourceArchive.Availability != "discontinued" { + return api.client.Archive.GetPublicArchiveIDFromAncestors(archive.SourceArchive.ID) + } + return emptyID, false + +} + +// FindLatestStableCentOS 安定版最新のCentOSパブリックアーカイブを取得 +func (api *ArchiveAPI) FindLatestStableCentOS() (*sacloud.Archive, error) { + return api.findByOSTags(archiveLatestStableCentOSTags) +} + +// FindLatestStableCentOS6 安定版最新のCentOS6パブリックアーカイブを取得 +func (api *ArchiveAPI) FindLatestStableCentOS6() (*sacloud.Archive, error) { + return api.findByOSTags(archiveLatestStableCentOS6Tags) +} + +// FindLatestStableDebian 安定版最新のDebianパブリックアーカイブを取得 +func (api *ArchiveAPI) FindLatestStableDebian() (*sacloud.Archive, error) { + return api.findByOSTags(archiveLatestStableDebianTags) +} + +// FindLatestStableUbuntu 安定版最新のUbuntuパブリックアーカイブを取得 +func (api *ArchiveAPI) FindLatestStableUbuntu() (*sacloud.Archive, error) { + return api.findByOSTags(archiveLatestStableUbuntuTags) +} + +// FindLatestStableVyOS 安定版最新のVyOSパブリックアーカイブを取得 +func (api *ArchiveAPI) FindLatestStableVyOS() (*sacloud.Archive, error) { + return api.findByOSTags(archiveLatestStableVyOSTags) +} + +// FindLatestStableCoreOS 安定版最新のCoreOSパブリックアーカイブを取得 +func (api *ArchiveAPI) FindLatestStableCoreOS() (*sacloud.Archive, error) { + return api.findByOSTags(archiveLatestStableCoreOSTags) +} + +// FindLatestStableRancherOS 安定版最新のRancherOSパブリックアーカイブを取得 +func (api *ArchiveAPI) FindLatestStableRancherOS() (*sacloud.Archive, error) { + return api.findByOSTags(archiveLatestStableRancherOSTags) +} + +// FindLatestStableKusanagi 安定版最新のKusanagiパブリックアーカイブを取得 +func (api *ArchiveAPI) FindLatestStableKusanagi() (*sacloud.Archive, error) { + return api.findByOSTags(archiveLatestStableKusanagiTags) +} + +// FindLatestStableSophosUTM 安定板最新のSophosUTMパブリックアーカイブを取得 +func (api *ArchiveAPI) FindLatestStableSophosUTM() (*sacloud.Archive, error) { + return api.findByOSTags(archiveLatestStableSophosUTMTags) +} + +// FindLatestStableFreeBSD 安定版最新のFreeBSDパブリックアーカイブを取得 +func (api *ArchiveAPI) FindLatestStableFreeBSD() (*sacloud.Archive, error) { + return api.findByOSTags(archiveLatestStableFreeBSDTags) +} + +// FindLatestStableWindows2012 安定版最新のWindows2012パブリックアーカイブを取得 +func (api *ArchiveAPI) FindLatestStableWindows2012() (*sacloud.Archive, error) { + return api.findByOSTags(archiveLatestStableWindows2012Tags, map[string]interface{}{ + "Name": "Windows Server 2012 R2 Datacenter Edition", + }) +} + +// FindLatestStableWindows2012RDS 安定版最新のWindows2012RDSパブリックアーカイブを取得 +func (api *ArchiveAPI) FindLatestStableWindows2012RDS() (*sacloud.Archive, error) { + return api.findByOSTags(archiveLatestStableWindows2012RDSTags, map[string]interface{}{ + "Name": "Windows Server 2012 R2 for RDS", + }) +} + +// FindLatestStableWindows2012RDSOffice 安定版最新のWindows2012RDS(Office)パブリックアーカイブを取得 +func (api *ArchiveAPI) FindLatestStableWindows2012RDSOffice() (*sacloud.Archive, error) { + return api.findByOSTags(archiveLatestStableWindows2012RDSOfficeTags, map[string]interface{}{ + "Name": "Windows Server 2012 R2 for RDS(MS Office付)", + }) +} + +// FindLatestStableWindows2016 安定版最新のWindows2016パブリックアーカイブを取得 +func (api *ArchiveAPI) FindLatestStableWindows2016() (*sacloud.Archive, error) { + return api.findByOSTags(archiveLatestStableWindows2016Tags, map[string]interface{}{ + "Name": "Windows Server 2016 Datacenter Edition", + }) +} + +// FindLatestStableWindows2016RDS 安定版最新のWindows2016RDSパブリックアーカイブを取得 +func (api *ArchiveAPI) FindLatestStableWindows2016RDS() (*sacloud.Archive, error) { + return api.findByOSTags(archiveLatestStableWindows2016RDSTags, map[string]interface{}{ + "Name": "Windows Server 2016 for RDS", + }) +} + +// FindLatestStableWindows2016RDSOffice 安定版最新のWindows2016RDS(Office)パブリックアーカイブを取得 +func (api *ArchiveAPI) FindLatestStableWindows2016RDSOffice() (*sacloud.Archive, error) { + return api.findByOSTags(archiveLatestStableWindows2016RDSOfficeTags, map[string]interface{}{ + "Name": "Windows Server 2016 for RDS(MS Office付)", + }) +} + +// FindLatestStableWindows2016SQLServerWeb 安定版最新のWindows2016 SQLServer(Web) パブリックアーカイブを取得 +func (api *ArchiveAPI) FindLatestStableWindows2016SQLServerWeb() (*sacloud.Archive, error) { + return api.findByOSTags(archiveLatestStableWindows2016SQLServerWeb, map[string]interface{}{ + "Name": "Windows Server 2016 for MS SQL 2016(Web)", + }) +} + +// FindLatestStableWindows2016SQLServerStandard 安定版最新のWindows2016 SQLServer(Standard) パブリックアーカイブを取得 +func (api *ArchiveAPI) FindLatestStableWindows2016SQLServerStandard() (*sacloud.Archive, error) { + return api.findByOSTags(archiveLatestStableWindows2016SQLServerStandard, map[string]interface{}{ + "Name": "Windows Server 2016 for MS SQL 2016(Standard)", + }) +} + +// FindLatestStableWindows2016SQLServerStandardAll 安定版最新のWindows2016 SQLServer(RDS+Office) パブリックアーカイブを取得 +func (api *ArchiveAPI) FindLatestStableWindows2016SQLServerStandardAll() (*sacloud.Archive, error) { + return api.findByOSTags(archiveLatestStableWindows2016SQLServerStandard, map[string]interface{}{ + "Name": "Windows Server 2016 for MS SQL 2016(Std) with RDS / MS Office", + }) +} + +// FindByOSType 指定のOS種別の安定版最新のパブリックアーカイブを取得 +func (api *ArchiveAPI) FindByOSType(os ostype.ArchiveOSTypes) (*sacloud.Archive, error) { + if f, ok := api.findFuncMapPerOSType[os]; ok { + return f() + } + + return nil, fmt.Errorf("OSType [%s] is invalid", os) +} + +func (api *ArchiveAPI) findByOSTags(tags []string, filterMap ...map[string]interface{}) (*sacloud.Archive, error) { + + api.Reset().WithTags(tags) + + for _, filters := range filterMap { + for key, filter := range filters { + api.FilterMultiBy(key, filter) + } + } + res, err := api.Find() + if err != nil { + return nil, fmt.Errorf("Archive [%s] error : %s", strings.Join(tags, ","), err) + } + + if len(res.Archives) == 0 { + return nil, fmt.Errorf("Archive [%s] Not Found", strings.Join(tags, ",")) + } + + return &res.Archives[0], nil + +} diff --git a/vendor/github.com/sacloud/libsacloud/api/archive_gen.go b/vendor/github.com/sacloud/libsacloud/api/archive_gen.go new file mode 100644 index 00000000..57af0a08 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/archive_gen.go @@ -0,0 +1,251 @@ +package api + +/************************************************ + generated by IDE. for [ArchiveAPI] +************************************************/ + +import ( + "github.com/sacloud/libsacloud/sacloud" +) + +/************************************************ + To support fluent interface for Find() +************************************************/ + +// Reset 検索条件リセット +func (api *ArchiveAPI) Reset() *ArchiveAPI { + api.reset() + return api +} + +// Offset オフセット +func (api *ArchiveAPI) Offset(offset int) *ArchiveAPI { + api.offset(offset) + return api +} + +// Limit リミット +func (api *ArchiveAPI) Limit(limit int) *ArchiveAPI { + api.limit(limit) + return api +} + +// Include 取得する項目 +func (api *ArchiveAPI) Include(key string) *ArchiveAPI { + api.include(key) + return api +} + +// Exclude 除外する項目 +func (api *ArchiveAPI) Exclude(key string) *ArchiveAPI { + api.exclude(key) + return api +} + +// FilterBy 任意項目でのフィルタ(部分一致) +func (api *ArchiveAPI) FilterBy(key string, value interface{}) *ArchiveAPI { + api.filterBy(key, value, false) + return api +} + +// FilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *ArchiveAPI) FilterMultiBy(key string, value interface{}) *ArchiveAPI { + api.filterBy(key, value, true) + return api +} + +// WithNameLike 名称条件 +func (api *ArchiveAPI) WithNameLike(name string) *ArchiveAPI { + return api.FilterBy("Name", name) +} + +// WithTag タグ条件 +func (api *ArchiveAPI) WithTag(tag string) *ArchiveAPI { + return api.FilterBy("Tags.Name", tag) +} + +// WithTags タグ(複数)条件 +func (api *ArchiveAPI) WithTags(tags []string) *ArchiveAPI { + return api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// WithSizeGib アーカイブサイズ条件 +func (api *ArchiveAPI) WithSizeGib(size int) *ArchiveAPI { + api.FilterBy("SizeMB", size*1024) + return api +} + +// WithSharedScope 共有スコープ条件 +func (api *ArchiveAPI) WithSharedScope() *ArchiveAPI { + api.FilterBy("Scope", "shared") + return api +} + +// WithUserScope ユーザースコープ条件 +func (api *ArchiveAPI) WithUserScope() *ArchiveAPI { + api.FilterBy("Scope", "user") + return api +} + +// SortBy 任意項目でのソート指定 +func (api *ArchiveAPI) SortBy(key string, reverse bool) *ArchiveAPI { + api.sortBy(key, reverse) + return api +} + +// SortByName 名称でのソート +func (api *ArchiveAPI) SortByName(reverse bool) *ArchiveAPI { + api.sortByName(reverse) + return api +} + +// SortBySize サイズでのソート +func (api *ArchiveAPI) SortBySize(reverse bool) *ArchiveAPI { + api.sortBy("SizeMB", reverse) + return api +} + +/************************************************ + To support Setxxx interfaces for Find() +************************************************/ + +// SetEmpty 検索条件リセット +func (api *ArchiveAPI) SetEmpty() { + api.reset() +} + +// SetOffset オフセット +func (api *ArchiveAPI) SetOffset(offset int) { + api.offset(offset) +} + +// SetLimit リミット +func (api *ArchiveAPI) SetLimit(limit int) { + api.limit(limit) +} + +// SetInclude 取得する項目 +func (api *ArchiveAPI) SetInclude(key string) { + api.include(key) +} + +// SetExclude 除外する項目 +func (api *ArchiveAPI) SetExclude(key string) { + api.exclude(key) +} + +// SetFilterBy 任意項目でのフィルタ(部分一致) +func (api *ArchiveAPI) SetFilterBy(key string, value interface{}) { + api.filterBy(key, value, false) +} + +// SetFilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *ArchiveAPI) SetFilterMultiBy(key string, value interface{}) { + api.filterBy(key, value, true) +} + +// SetNameLike 名称条件 +func (api *ArchiveAPI) SetNameLike(name string) { + api.FilterBy("Name", name) +} + +// SetTag タグ条件 +func (api *ArchiveAPI) SetTag(tag string) { + api.FilterBy("Tags.Name", tag) +} + +// SetTags タグ(複数)条件 +func (api *ArchiveAPI) SetTags(tags []string) { + api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// SetSizeGib アーカイブサイズ条件 +func (api *ArchiveAPI) SetSizeGib(size int) { + api.FilterBy("SizeMB", size*1024) +} + +// SetSharedScope 共有スコープ条件 +func (api *ArchiveAPI) SetSharedScope() { + api.FilterBy("Scope", "shared") +} + +// SetUserScope ユーザースコープ条件 +func (api *ArchiveAPI) SetUserScope() { + api.FilterBy("Scope", "user") +} + +// SetSortBy 任意項目でのソート指定 +func (api *ArchiveAPI) SetSortBy(key string, reverse bool) { + api.sortBy(key, reverse) +} + +// SetSortByName 名称でのソート +func (api *ArchiveAPI) SetSortByName(reverse bool) { + api.sortByName(reverse) +} + +// SetSortBySize サイズでのソート +func (api *ArchiveAPI) SetSortBySize(reverse bool) { + api.sortBy("SizeMB", reverse) +} + +/************************************************ + To support CRUD(Create/Read/Update/Delete) +************************************************/ + +// Create 新規作成 +func (api *ArchiveAPI) Create(value *sacloud.Archive) (*sacloud.Archive, error) { + return api.request(func(res *sacloud.Response) error { + return api.create(api.createRequest(value), res) + }) +} + +// Read 読み取り +func (api *ArchiveAPI) Read(id int64) (*sacloud.Archive, error) { + return api.request(func(res *sacloud.Response) error { + return api.read(id, nil, res) + }) +} + +// Update 更新 +func (api *ArchiveAPI) Update(id int64, value *sacloud.Archive) (*sacloud.Archive, error) { + return api.request(func(res *sacloud.Response) error { + return api.update(id, api.createRequest(value), res) + }) +} + +// Delete 削除 +func (api *ArchiveAPI) Delete(id int64) (*sacloud.Archive, error) { + return api.request(func(res *sacloud.Response) error { + return api.delete(id, nil, res) + }) +} + +// New 作成用パラメータ作成 +func (api *ArchiveAPI) New() *sacloud.Archive { + return &sacloud.Archive{} +} + +/************************************************ + Inner functions +************************************************/ + +func (api *ArchiveAPI) setStateValue(setFunc func(*sacloud.Request)) *ArchiveAPI { + api.baseAPI.setStateValue(setFunc) + return api +} + +func (api *ArchiveAPI) request(f func(*sacloud.Response) error) (*sacloud.Archive, error) { + res := &sacloud.Response{} + err := f(res) + if err != nil { + return nil, err + } + return res.Archive, nil +} + +func (api *ArchiveAPI) createRequest(value *sacloud.Archive) *sacloud.Request { + req := &sacloud.Request{} + req.Archive = value + return req +} diff --git a/vendor/github.com/sacloud/libsacloud/api/auth_status.go b/vendor/github.com/sacloud/libsacloud/api/auth_status.go new file mode 100644 index 00000000..d9fd2c73 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/auth_status.go @@ -0,0 +1,42 @@ +package api + +import ( + "encoding/json" + "github.com/sacloud/libsacloud/sacloud" +) + +// AuthStatusAPI 認証状態API +type AuthStatusAPI struct { + *baseAPI +} + +// NewAuthStatusAPI 認証状態API作成 +func NewAuthStatusAPI(client *Client) *AuthStatusAPI { + return &AuthStatusAPI{ + &baseAPI{ + client: client, + FuncGetResourceURL: func() string { + return "auth-status" + }, + }, + } +} + +// Read 読み取り +func (api *AuthStatusAPI) Read() (*sacloud.AuthStatus, error) { + + data, err := api.client.newRequest("GET", api.getResourceURL(), nil) + if err != nil { + return nil, err + } + var res sacloud.AuthStatus + if err := json.Unmarshal(data, &res); err != nil { + return nil, err + } + return &res, nil +} + +// Find 検索 +func (api *AuthStatusAPI) Find() (*sacloud.AuthStatus, error) { + return api.Read() +} diff --git a/vendor/github.com/sacloud/libsacloud/api/auto_backup.go b/vendor/github.com/sacloud/libsacloud/api/auto_backup.go new file mode 100644 index 00000000..d9944e09 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/auto_backup.go @@ -0,0 +1,116 @@ +package api + +import ( + "encoding/json" + // "strings" + "github.com/sacloud/libsacloud/sacloud" +) + +// SearchAutoBackupResponse 自動バックアップ 検索レスポンス +type SearchAutoBackupResponse struct { + // Total 総件数 + Total int `json:",omitempty"` + // From ページング開始位置 + From int `json:",omitempty"` + // Count 件数 + Count int `json:",omitempty"` + // CommonServiceAutoBackupItems 自動バックアップ リスト + CommonServiceAutoBackupItems []sacloud.AutoBackup `json:"CommonServiceItems,omitempty"` +} + +type autoBackupRequest struct { + CommonServiceAutoBackupItem *sacloud.AutoBackup `json:"CommonServiceItem,omitempty"` + From int `json:",omitempty"` + Count int `json:",omitempty"` + Sort []string `json:",omitempty"` + Filter map[string]interface{} `json:",omitempty"` + Exclude []string `json:",omitempty"` + Include []string `json:",omitempty"` +} + +type autoBackupResponse struct { + *sacloud.ResultFlagValue + *sacloud.AutoBackup `json:"CommonServiceItem,omitempty"` +} + +// AutoBackupAPI 自動バックアップAPI +type AutoBackupAPI struct { + *baseAPI +} + +// NewAutoBackupAPI 自動バックアップAPI作成 +func NewAutoBackupAPI(client *Client) *AutoBackupAPI { + return &AutoBackupAPI{ + &baseAPI{ + client: client, + FuncGetResourceURL: func() string { + return "commonserviceitem" + }, + FuncBaseSearchCondition: func() *sacloud.Request { + res := &sacloud.Request{} + res.AddFilter("Provider.Class", "autobackup") + return res + }, + }, + } +} + +// Find 検索 +func (api *AutoBackupAPI) Find() (*SearchAutoBackupResponse, error) { + + data, err := api.client.newRequest("GET", api.getResourceURL(), api.getSearchState()) + if err != nil { + return nil, err + } + var res SearchAutoBackupResponse + if err := json.Unmarshal(data, &res); err != nil { + return nil, err + } + return &res, nil +} + +func (api *AutoBackupAPI) request(f func(*autoBackupResponse) error) (*sacloud.AutoBackup, error) { + res := &autoBackupResponse{} + err := f(res) + if err != nil { + return nil, err + } + return res.AutoBackup, nil +} + +func (api *AutoBackupAPI) createRequest(value *sacloud.AutoBackup) *autoBackupResponse { + return &autoBackupResponse{AutoBackup: value} +} + +// New 新規作成用パラメーター作成 +func (api *AutoBackupAPI) New(name string, diskID int64) *sacloud.AutoBackup { + return sacloud.CreateNewAutoBackup(name, diskID) +} + +// Create 新規作成 +func (api *AutoBackupAPI) Create(value *sacloud.AutoBackup) (*sacloud.AutoBackup, error) { + return api.request(func(res *autoBackupResponse) error { + return api.create(api.createRequest(value), res) + }) +} + +// Read 読み取り +func (api *AutoBackupAPI) Read(id int64) (*sacloud.AutoBackup, error) { + return api.request(func(res *autoBackupResponse) error { + return api.read(id, nil, res) + }) +} + +// Update 更新 +func (api *AutoBackupAPI) Update(id int64, value *sacloud.AutoBackup) (*sacloud.AutoBackup, error) { + return api.request(func(res *autoBackupResponse) error { + return api.update(id, api.createRequest(value), res) + }) +} + +// Delete 削除 +func (api *AutoBackupAPI) Delete(id int64) (*sacloud.AutoBackup, error) { + return api.request(func(res *autoBackupResponse) error { + return api.delete(id, nil, res) + }) +} diff --git a/vendor/github.com/sacloud/libsacloud/api/auto_backup_gen.go b/vendor/github.com/sacloud/libsacloud/api/auto_backup_gen.go new file mode 100644 index 00000000..4d6f8ac1 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/auto_backup_gen.go @@ -0,0 +1,239 @@ +package api + +/************************************************ + generated by IDE. for [AutoBackupAPI] +************************************************/ + +import ( + "github.com/sacloud/libsacloud/sacloud" +) + +/************************************************ + To support fluent interface for Find() +************************************************/ + +// Reset 検索条件リセット +func (api *AutoBackupAPI) Reset() *AutoBackupAPI { + api.reset() + return api +} + +// Offset オフセット +func (api *AutoBackupAPI) Offset(offset int) *AutoBackupAPI { + api.offset(offset) + return api +} + +// Limit リミット +func (api *AutoBackupAPI) Limit(limit int) *AutoBackupAPI { + api.limit(limit) + return api +} + +// Include 取得する項目 +func (api *AutoBackupAPI) Include(key string) *AutoBackupAPI { + api.include(key) + return api +} + +// Exclude 除外する項目 +func (api *AutoBackupAPI) Exclude(key string) *AutoBackupAPI { + api.exclude(key) + return api +} + +// FilterBy 指定キーでのフィルタ +func (api *AutoBackupAPI) FilterBy(key string, value interface{}) *AutoBackupAPI { + api.filterBy(key, value, false) + return api +} + +// FilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *AutoBackupAPI) FilterMultiBy(key string, value interface{}) *AutoBackupAPI { + api.filterBy(key, value, true) + return api +} + +// WithNameLike 名称条件 +func (api *AutoBackupAPI) WithNameLike(name string) *AutoBackupAPI { + return api.FilterBy("Name", name) +} + +// WithTag タグ条件 +func (api *AutoBackupAPI) WithTag(tag string) *AutoBackupAPI { + return api.FilterBy("Tags.Name", tag) +} + +// WithTags タグ(複数)条件 +func (api *AutoBackupAPI) WithTags(tags []string) *AutoBackupAPI { + return api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *AutoBackupAPI) WithSizeGib(size int) *AutoBackupAPI { +// api.FilterBy("SizeMB", size*1024) +// return api +// } + +// func (api *AutoBackupAPI) WithSharedScope() *AutoBackupAPI { +// api.FilterBy("Scope", "shared") +// return api +// } + +// func (api *AutoBackupAPI) WithUserScope() *AutoBackupAPI { +// api.FilterBy("Scope", "user") +// return api +// } + +// SortBy 指定キーでのソート +func (api *AutoBackupAPI) SortBy(key string, reverse bool) *AutoBackupAPI { + api.sortBy(key, reverse) + return api +} + +// SortByName 名前でのソート +func (api *AutoBackupAPI) SortByName(reverse bool) *AutoBackupAPI { + api.sortByName(reverse) + return api +} + +// func (api *AutoBackupAPI) SortBySize(reverse bool) *AutoBackupAPI { +// api.sortBy("SizeMB", reverse) +// return api +// } + +/************************************************ + To support Setxxx interface for Find() +************************************************/ + +// SetEmpty 検索条件リセット +func (api *AutoBackupAPI) SetEmpty() { + api.reset() +} + +// SetOffset オフセット +func (api *AutoBackupAPI) SetOffset(offset int) { + api.offset(offset) +} + +// SetLimit リミット +func (api *AutoBackupAPI) SetLimit(limit int) { + api.limit(limit) +} + +// SetInclude 取得する項目 +func (api *AutoBackupAPI) SetInclude(key string) { + api.include(key) +} + +// SetExclude 除外する項目 +func (api *AutoBackupAPI) SetExclude(key string) { + api.exclude(key) +} + +// SetFilterBy 指定キーでのフィルタ +func (api *AutoBackupAPI) SetFilterBy(key string, value interface{}) { + api.filterBy(key, value, false) +} + +// SetFilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *AutoBackupAPI) SetFilterMultiBy(key string, value interface{}) { + api.filterBy(key, value, true) +} + +// SetNameLike 名称条件 +func (api *AutoBackupAPI) SetNameLike(name string) { + api.FilterBy("Name", name) +} + +// SetTag タグ条件 +func (api *AutoBackupAPI) SetTag(tag string) { + api.FilterBy("Tags.Name", tag) +} + +// SetTags タグ(複数)条件 +func (api *AutoBackupAPI) SetTags(tags []string) { + api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *AutoBackupAPI) SetSizeGib(size int) { +// api.FilterBy("SizeMB", size*1024) +// } + +// func (api *AutoBackupAPI) SetSharedScope() { +// api.FilterBy("Scope", "shared") +// } + +// func (api *AutoBackupAPI) SetUserScope() { +// api.FilterBy("Scope", "user") +// } + +// SetSortBy 指定キーでのソート +func (api *AutoBackupAPI) SetSortBy(key string, reverse bool) { + api.sortBy(key, reverse) +} + +// SetSortByName 名前でのソート +func (api *AutoBackupAPI) SetSortByName(reverse bool) { + api.sortByName(reverse) +} + +// func (api *AutoBackupAPI) SortBySize(reverse bool) *AutoBackupAPI { +// api.sortBy("SizeMB", reverse) +// return api +// } + +/************************************************ + To support CRUD(Create/Read/Update/Delete) +************************************************/ + +// func (api *AutoBackupAPI) New() *sacloud.AutoBackup { +// return &sacloud.AutoBackup{} +// } + +// func (api *AutoBackupAPI) Create(value *sacloud.AutoBackup) (*sacloud.AutoBackup, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.create(api.createRequest(value), res) +// }) +// } + +// func (api *AutoBackupAPI) Read(id string) (*sacloud.AutoBackup, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.read(id, nil, res) +// }) +// } + +// func (api *AutoBackupAPI) Update(id string, value *sacloud.AutoBackup) (*sacloud.AutoBackup, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.update(id, api.createRequest(value), res) +// }) +// } + +// func (api *AutoBackupAPI) Delete(id string) (*sacloud.AutoBackup, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.delete(id, nil, res) +// }) +// } + +/************************************************ + Inner functions +************************************************/ + +func (api *AutoBackupAPI) setStateValue(setFunc func(*sacloud.Request)) *AutoBackupAPI { + api.baseAPI.setStateValue(setFunc) + return api +} + +//func (api *AutoBackupAPI) request(f func(*sacloud.Response) error) (*sacloud.AutoBackup, error) { +// res := &sacloud.Response{} +// err := f(res) +// if err != nil { +// return nil, err +// } +// return res.AutoBackup, nil +//} +// +//func (api *AutoBackupAPI) createRequest(value *sacloud.AutoBackup) *sacloud.Request { +// req := &sacloud.Request{} +// req.AutoBackup = value +// return req +//} diff --git a/vendor/github.com/sacloud/libsacloud/api/base_api.go b/vendor/github.com/sacloud/libsacloud/api/base_api.go new file mode 100644 index 00000000..a071869c --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/base_api.go @@ -0,0 +1,277 @@ +package api + +import ( + "encoding/json" + "fmt" + "github.com/sacloud/libsacloud/sacloud" + "net/url" +) + +type baseAPI struct { + client *Client + FuncGetResourceURL func() string + FuncBaseSearchCondition func() *sacloud.Request + state *sacloud.Request + apiRootSuffix string +} + +var ( + sakuraCloudAPIRootSuffix = "api/cloud/1.1" + sakuraBillingAPIRootSuffix = "api/system/1.0" + sakuraWebAccelAPIRootSuffix = "api/webaccel/1.0" +) + +func (api *baseAPI) getResourceURL() string { + + suffix := api.apiRootSuffix + //デフォルト : クラウドAPI + if suffix == "" { + suffix = sakuraCloudAPIRootSuffix + } + + url := "" + if api.FuncGetResourceURL != nil { + url = api.FuncGetResourceURL() + } + + if suffix == "" { + return url + } + if url == "" { + return suffix + } + + return fmt.Sprintf("%s/%s", suffix, url) +} + +func (api *baseAPI) getSearchState() *sacloud.Request { + if api.state == nil { + api.reset() + } + return api.state +} +func (api *baseAPI) sortBy(key string, reverse bool) *baseAPI { + return api.setStateValue(func(state *sacloud.Request) { + if state.Sort == nil { + state.Sort = []string{} + } + + col := key + if reverse { + col = "-" + col + } + state.Sort = append(state.Sort, col) + + }) + +} + +func (api *baseAPI) reset() *baseAPI { + if api.FuncBaseSearchCondition == nil { + api.state = &sacloud.Request{} + } else { + api.state = api.FuncBaseSearchCondition() + } + return api +} + +func (api *baseAPI) setStateValue(setFunc func(*sacloud.Request)) *baseAPI { + state := api.getSearchState() + setFunc(state) + return api + +} + +func (api *baseAPI) offset(offset int) *baseAPI { + return api.setStateValue(func(state *sacloud.Request) { + state.From = offset + }) +} + +func (api *baseAPI) limit(limit int) *baseAPI { + return api.setStateValue(func(state *sacloud.Request) { + state.Count = limit + }) +} + +func (api *baseAPI) include(key string) *baseAPI { + return api.setStateValue(func(state *sacloud.Request) { + if state.Include == nil { + state.Include = []string{} + } + state.Include = append(state.Include, key) + }) +} + +func (api *baseAPI) exclude(key string) *baseAPI { + return api.setStateValue(func(state *sacloud.Request) { + if state.Exclude == nil { + state.Exclude = []string{} + } + state.Exclude = append(state.Exclude, key) + }) +} + +func (api *baseAPI) filterBy(key string, value interface{}, multiple bool) *baseAPI { + return api.setStateValue(func(state *sacloud.Request) { + + //HACK さくらのクラウド側でqueryStringでの+エスケープに対応していないため、 + // %20にエスケープされるurl.Pathを利用する。 + // http://qiita.com/shibukawa/items/c0730092371c0e243f62 + if strValue, ok := value.(string); ok { + u := &url.URL{Path: strValue} + value = u.String() + } + + if state.Filter == nil { + state.Filter = map[string]interface{}{} + } + if multiple { + if state.Filter[key] == nil { + state.Filter[key] = []interface{}{} + } + + state.Filter[key] = append(state.Filter[key].([]interface{}), value) + } else { + // どちらもstring型の場合はスペース区切りで繋げる + if f, ok := state.Filter[key]; ok { + if s, ok := f.(string); ok && s != "" { + if v, ok := value.(string); ok { + state.Filter[key] = fmt.Sprintf("%s %s", s, v) + return + } + } + } + state.Filter[key] = value + + } + }) +} + +func (api *baseAPI) withNameLike(name string) *baseAPI { + return api.filterBy("Name", name, false) +} + +func (api *baseAPI) withTag(tag string) *baseAPI { + return api.filterBy("Tags.Name", tag, false) +} + +func (api *baseAPI) withTags(tags []string) *baseAPI { + return api.filterBy("Tags.Name", tags, false) +} + +func (api *baseAPI) sortByName(reverse bool) *baseAPI { + return api.sortBy("Name", reverse) +} + +func (api *baseAPI) Find() (*sacloud.SearchResponse, error) { + + data, err := api.client.newRequest("GET", api.getResourceURL(), api.getSearchState()) + if err != nil { + return nil, err + } + var res sacloud.SearchResponse + if err := json.Unmarshal(data, &res); err != nil { + return nil, err + } + return &res, nil +} + +func (api *baseAPI) request(method string, uri string, body interface{}, res interface{}) error { + data, err := api.client.newRequest(method, uri, body) + if err != nil { + return err + } + + if res != nil { + if err := json.Unmarshal(data, &res); err != nil { + return err + } + } + return nil +} + +func (api *baseAPI) create(body interface{}, res interface{}) error { + var ( + method = "POST" + uri = api.getResourceURL() + ) + + return api.request(method, uri, body, res) +} + +func (api *baseAPI) read(id int64, body interface{}, res interface{}) error { + var ( + method = "GET" + uri = fmt.Sprintf("%s/%d", api.getResourceURL(), id) + ) + + return api.request(method, uri, body, res) +} + +func (api *baseAPI) update(id int64, body interface{}, res interface{}) error { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d", api.getResourceURL(), id) + ) + return api.request(method, uri, body, res) +} + +func (api *baseAPI) delete(id int64, body interface{}, res interface{}) error { + var ( + method = "DELETE" + uri = fmt.Sprintf("%s/%d", api.getResourceURL(), id) + ) + return api.request(method, uri, body, res) +} + +func (api *baseAPI) modify(method string, uri string, body interface{}) (bool, error) { + res := &sacloud.ResultFlagValue{} + err := api.request(method, uri, body, res) + if err != nil { + return false, err + } + return res.IsOk, nil +} + +func (api *baseAPI) action(method string, uri string, body interface{}, res interface{}) (bool, error) { + err := api.request(method, uri, body, res) + if err != nil { + return false, err + } + return true, nil +} + +func (api *baseAPI) monitor(id int64, body *sacloud.ResourceMonitorRequest) (*sacloud.MonitorValues, error) { + var ( + method = "GET" + uri = fmt.Sprintf("%s/%d/monitor", api.getResourceURL(), id) + ) + res := &sacloud.ResourceMonitorResponse{} + err := api.request(method, uri, body, res) + if err != nil { + return nil, err + } + return res.Data, nil +} + +func (api *baseAPI) applianceMonitorBy(id int64, target string, nicIndex int, body *sacloud.ResourceMonitorRequest) (*sacloud.MonitorValues, error) { + var ( + method = "GET" + uri = fmt.Sprintf("%s/%d/%s/%d/monitor", api.getResourceURL(), id, target, nicIndex) + ) + if nicIndex == 0 { + uri = fmt.Sprintf("%s/%d/%s/monitor", api.getResourceURL(), id, target) + } + + res := &sacloud.ResourceMonitorResponse{} + err := api.request(method, uri, body, res) + if err != nil { + return nil, err + } + return res.Data, nil +} + +func (api *baseAPI) NewResourceMonitorRequest() *sacloud.ResourceMonitorRequest { + return &sacloud.ResourceMonitorRequest{} +} diff --git a/vendor/github.com/sacloud/libsacloud/api/bill.go b/vendor/github.com/sacloud/libsacloud/api/bill.go new file mode 100644 index 00000000..2caba0b2 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/bill.go @@ -0,0 +1,185 @@ +package api + +import ( + "encoding/csv" + "encoding/json" + "fmt" + "github.com/sacloud/libsacloud/sacloud" + "io" + "strings" + "time" +) + +// BillAPI 請求情報API +type BillAPI struct { + *baseAPI +} + +// NewBillAPI 請求情報API作成 +func NewBillAPI(client *Client) *BillAPI { + return &BillAPI{ + &baseAPI{ + client: client, + apiRootSuffix: sakuraBillingAPIRootSuffix, + FuncGetResourceURL: func() string { + return "bill" + }, + }, + } +} + +// BillResponse 請求情報レスポンス +type BillResponse struct { + *sacloud.ResultFlagValue + // Count 件数 + Count int `json:",omitempty"` + // ResponsedAt 応答日時 + ResponsedAt *time.Time `json:",omitempty"` + // Bills 請求情報 リスト + Bills []*sacloud.Bill +} + +// BillDetailResponse 請求明細レスポンス +type BillDetailResponse struct { + *sacloud.ResultFlagValue + // Count 件数 + Count int `json:",omitempty"` + // ResponsedAt 応答日時 + ResponsedAt *time.Time `json:",omitempty"` + // BillDetails 請求明細 リスト + BillDetails []*sacloud.BillDetail +} + +// BillDetailCSVResponse 請求明細CSVレスポンス +type BillDetailCSVResponse struct { + *sacloud.ResultFlagValue + // Count 件数 + Count int `json:",omitempty"` + // ResponsedAt 応答日時 + ResponsedAt *time.Time `json:",omitempty"` + // Filename ファイル名 + Filename string `json:",omitempty"` + // RawBody ボディ(未加工) + RawBody string `json:"Body,omitempty"` + // HeaderRow ヘッダ行 + HeaderRow []string + // BodyRows ボディ(各行/各列での配列) + BodyRows [][]string +} + +func (res *BillDetailCSVResponse) buildCSVBody() { + + if res == nil || res.RawBody == "" { + return + } + + //CSV分割(先頭行/それ以降)、 + reader := csv.NewReader(strings.NewReader(res.RawBody)) + reader.LazyQuotes = true + + isFirst := true + res.BodyRows = [][]string{} + for { + record, err := reader.Read() + if err == io.EOF { + break + } else if err != nil { + panic(err) + } + + if isFirst { + res.HeaderRow = record + isFirst = false + } else { + res.BodyRows = append(res.BodyRows, record) + } + } +} + +// ByContract アカウントIDごとの請求取得 +func (api *BillAPI) ByContract(accountID int64) (*BillResponse, error) { + + uri := fmt.Sprintf("%s/by-contract/%d", api.getResourceURL(), accountID) + return api.getContract(uri) +} + +// ByContractYear 年指定での請求取得 +func (api *BillAPI) ByContractYear(accountID int64, year int) (*BillResponse, error) { + uri := fmt.Sprintf("%s/by-contract/%d/%d", api.getResourceURL(), accountID, year) + return api.getContract(uri) +} + +// ByContractYearMonth 年月指定での請求指定 +func (api *BillAPI) ByContractYearMonth(accountID int64, year int, month int) (*BillResponse, error) { + uri := fmt.Sprintf("%s/by-contract/%d/%d/%d", api.getResourceURL(), accountID, year, month) + return api.getContract(uri) +} + +// Read 読み取り +func (api *BillAPI) Read(billNo int64) (*BillResponse, error) { + uri := fmt.Sprintf("%s/id/%d/", api.getResourceURL(), billNo) + return api.getContract(uri) + +} + +func (api *BillAPI) getContract(uri string) (*BillResponse, error) { + + data, err := api.client.newRequest("GET", uri, nil) + if err != nil { + return nil, err + } + var res BillResponse + if err := json.Unmarshal(data, &res); err != nil { + return nil, err + } + return &res, nil + +} + +// GetDetail 請求明細取得 +func (api *BillAPI) GetDetail(memberCD string, billNo int64) (*BillDetailResponse, error) { + + oldFunc := api.FuncGetResourceURL + defer func() { api.FuncGetResourceURL = oldFunc }() + api.FuncGetResourceURL = func() string { + return "billdetail" + } + + uri := fmt.Sprintf("%s/%s/%d", api.getResourceURL(), memberCD, billNo) + data, err := api.client.newRequest("GET", uri, nil) + if err != nil { + return nil, err + } + var res BillDetailResponse + if err := json.Unmarshal(data, &res); err != nil { + return nil, err + } + return &res, nil + +} + +// GetDetailCSV 請求明細CSV取得 +func (api *BillAPI) GetDetailCSV(memberCD string, billNo int64) (*BillDetailCSVResponse, error) { + + oldFunc := api.FuncGetResourceURL + defer func() { api.FuncGetResourceURL = oldFunc }() + api.FuncGetResourceURL = func() string { + return "billdetail" + } + + uri := fmt.Sprintf("%s/%s/%d/csv", api.getResourceURL(), memberCD, billNo) + data, err := api.client.newRequest("GET", uri, nil) + if err != nil { + return nil, err + } + var res BillDetailCSVResponse + if err := json.Unmarshal(data, &res); err != nil { + return nil, err + } + + // build HeaderRow and BodyRows from RawBody + res.buildCSVBody() + + return &res, nil + +} diff --git a/vendor/github.com/sacloud/libsacloud/api/bridge.go b/vendor/github.com/sacloud/libsacloud/api/bridge.go new file mode 100644 index 00000000..d5ab003a --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/bridge.go @@ -0,0 +1,18 @@ +package api + +// BridgeAPI ブリッジAPI +type BridgeAPI struct { + *baseAPI +} + +// NewBridgeAPI ブリッジAPI作成 +func NewBridgeAPI(client *Client) *BridgeAPI { + return &BridgeAPI{ + &baseAPI{ + client: client, + FuncGetResourceURL: func() string { + return "bridge" + }, + }, + } +} diff --git a/vendor/github.com/sacloud/libsacloud/api/bridge_gen.go b/vendor/github.com/sacloud/libsacloud/api/bridge_gen.go new file mode 100644 index 00000000..e4a0b5ba --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/bridge_gen.go @@ -0,0 +1,243 @@ +package api + +/************************************************ + generated by IDE. for [BridgeAPI] +************************************************/ + +import ( + "github.com/sacloud/libsacloud/sacloud" +) + +/************************************************ + To support fluent interface for Find() +************************************************/ + +// Reset 検索条件リセット +func (api *BridgeAPI) Reset() *BridgeAPI { + api.reset() + return api +} + +// Offset オフセット +func (api *BridgeAPI) Offset(offset int) *BridgeAPI { + api.offset(offset) + return api +} + +// Limit リミット +func (api *BridgeAPI) Limit(limit int) *BridgeAPI { + api.limit(limit) + return api +} + +// Include 取得する項目 +func (api *BridgeAPI) Include(key string) *BridgeAPI { + api.include(key) + return api +} + +// Exclude 除外する項目 +func (api *BridgeAPI) Exclude(key string) *BridgeAPI { + api.exclude(key) + return api +} + +// FilterBy 指定キーでのフィルター +func (api *BridgeAPI) FilterBy(key string, value interface{}) *BridgeAPI { + api.filterBy(key, value, false) + return api +} + +// FilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *BridgeAPI) FilterMultiBy(key string, value interface{}) *BridgeAPI { + api.filterBy(key, value, true) + return api +} + +// WithNameLike 名称条件 +func (api *BridgeAPI) WithNameLike(name string) *BridgeAPI { + return api.FilterBy("Name", name) +} + +// WithTag タグ条件 +func (api *BridgeAPI) WithTag(tag string) *BridgeAPI { + return api.FilterBy("Tags.Name", tag) +} + +// WithTags タグ(複数)条件 +func (api *BridgeAPI) WithTags(tags []string) *BridgeAPI { + return api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *BridgeAPI) WithSizeGib(size int) *BridgeAPI { +// api.FilterBy("SizeMB", size*1024) +// return api +// } + +// func (api *BridgeAPI) WithSharedScope() *BridgeAPI { +// api.FilterBy("Scope", "shared") +// return api +// } + +// func (api *BridgeAPI) WithUserScope() *BridgeAPI { +// api.FilterBy("Scope", "user") +// return api +// } + +// SortBy 指定キーでのソート +func (api *BridgeAPI) SortBy(key string, reverse bool) *BridgeAPI { + api.sortBy(key, reverse) + return api +} + +// SortByName 名称でのソート +func (api *BridgeAPI) SortByName(reverse bool) *BridgeAPI { + api.sortByName(reverse) + return api +} + +// func (api *BridgeAPI) SortBySize(reverse bool) *BridgeAPI { +// api.sortBy("SizeMB", reverse) +// return api +// } + +/************************************************ + To support Setxxx interface for Find() +************************************************/ + +// SetEmpty 検索条件リセット +func (api *BridgeAPI) SetEmpty() { + api.reset() +} + +// SetOffset オフセット +func (api *BridgeAPI) SetOffset(offset int) { + api.offset(offset) +} + +// SetLimit リミット +func (api *BridgeAPI) SetLimit(limit int) { + api.limit(limit) +} + +// SetInclude 取得する項目 +func (api *BridgeAPI) SetInclude(key string) { + api.include(key) +} + +// SetExclude 除外する項目 +func (api *BridgeAPI) SetExclude(key string) { + api.exclude(key) +} + +// SetFilterBy 指定キーでのフィルター +func (api *BridgeAPI) SetFilterBy(key string, value interface{}) { + api.filterBy(key, value, false) +} + +// SetFilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *BridgeAPI) SetFilterMultiBy(key string, value interface{}) { + api.filterBy(key, value, true) +} + +// SetNameLike 名称条件 +func (api *BridgeAPI) SetNameLike(name string) { + api.FilterBy("Name", name) +} + +// SetTag タグ条件 +func (api *BridgeAPI) SetTag(tag string) { + api.FilterBy("Tags.Name", tag) +} + +// SetTags タグ(複数)条件 +func (api *BridgeAPI) SetTags(tags []string) { + api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *BridgeAPI) SetSizeGib(size int) { +// api.FilterBy("SizeMB", size*1024) +// } + +// func (api *BridgeAPI) SetSharedScope() { +// api.FilterBy("Scope", "shared") +// } + +// func (api *BridgeAPI) SetUserScope() { +// api.FilterBy("Scope", "user") +// } + +// SetSortBy 指定キーでのソート +func (api *BridgeAPI) SetSortBy(key string, reverse bool) { + api.sortBy(key, reverse) +} + +// SetSortByName 名称でのソート +func (api *BridgeAPI) SetSortByName(reverse bool) { + api.sortByName(reverse) +} + +// func (api *BridgeAPI) SortBySize(reverse bool) { +// api.sortBy("SizeMB", reverse) +// } + +/************************************************ + To support CRUD(Create/Read/Update/Delete) +************************************************/ + +// New 新規作成用パラメーター作成 +func (api *BridgeAPI) New() *sacloud.Bridge { + return &sacloud.Bridge{} +} + +// Create 新規作成 +func (api *BridgeAPI) Create(value *sacloud.Bridge) (*sacloud.Bridge, error) { + return api.request(func(res *sacloud.Response) error { + return api.create(api.createRequest(value), res) + }) +} + +// Read 読み取り +func (api *BridgeAPI) Read(id int64) (*sacloud.Bridge, error) { + return api.request(func(res *sacloud.Response) error { + return api.read(id, nil, res) + }) +} + +// Update 更新 +func (api *BridgeAPI) Update(id int64, value *sacloud.Bridge) (*sacloud.Bridge, error) { + return api.request(func(res *sacloud.Response) error { + return api.update(id, api.createRequest(value), res) + }) +} + +// Delete 削除 +func (api *BridgeAPI) Delete(id int64) (*sacloud.Bridge, error) { + return api.request(func(res *sacloud.Response) error { + return api.delete(id, nil, res) + }) +} + +/************************************************ + Inner functions +************************************************/ + +func (api *BridgeAPI) setStateValue(setFunc func(*sacloud.Request)) *BridgeAPI { + api.baseAPI.setStateValue(setFunc) + return api +} + +func (api *BridgeAPI) request(f func(*sacloud.Response) error) (*sacloud.Bridge, error) { + res := &sacloud.Response{} + err := f(res) + if err != nil { + return nil, err + } + return res.Bridge, nil +} + +func (api *BridgeAPI) createRequest(value *sacloud.Bridge) *sacloud.Request { + req := &sacloud.Request{} + req.Bridge = value + return req +} diff --git a/vendor/github.com/sacloud/libsacloud/api/cdrom.go b/vendor/github.com/sacloud/libsacloud/api/cdrom.go new file mode 100644 index 00000000..5bda66b9 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/cdrom.go @@ -0,0 +1,80 @@ +package api + +import ( + "fmt" + "github.com/sacloud/libsacloud/sacloud" + "time" +) + +// CDROMAPI ISOイメージAPI +type CDROMAPI struct { + *baseAPI +} + +// NewCDROMAPI ISOイメージAPI新規作成 +func NewCDROMAPI(client *Client) *CDROMAPI { + return &CDROMAPI{ + &baseAPI{ + client: client, + FuncGetResourceURL: func() string { + return "cdrom" + }, + }, + } +} + +// Create 新規作成 +func (api *CDROMAPI) Create(value *sacloud.CDROM) (*sacloud.CDROM, *sacloud.FTPServer, error) { + f := func(res *sacloud.Response) error { + return api.create(api.createRequest(value), res) + } + res := &sacloud.Response{} + err := f(res) + if err != nil { + return nil, nil, err + } + return res.CDROM, res.FTPServer, nil +} + +// OpenFTP FTP接続開始 +func (api *CDROMAPI) OpenFTP(id int64, reset bool) (*sacloud.FTPServer, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/ftp", api.getResourceURL(), id) + body = map[string]bool{"ChangePassword": reset} + res = &sacloud.Response{} + ) + + result, err := api.action(method, uri, body, res) + if !result || err != nil { + return nil, err + } + + return res.FTPServer, nil +} + +// CloseFTP FTP接続終了 +func (api *CDROMAPI) CloseFTP(id int64) (bool, error) { + var ( + method = "DELETE" + uri = fmt.Sprintf("%s/%d/ftp", api.getResourceURL(), id) + ) + return api.modify(method, uri, nil) + +} + +// SleepWhileCopying コピー終了まで待機 +func (api *CDROMAPI) SleepWhileCopying(id int64, timeout time.Duration) error { + handler := waitingForAvailableFunc(func() (hasAvailable, error) { + return api.Read(id) + }, 0) + return blockingPoll(handler, timeout) +} + +// AsyncSleepWhileCopying コピー終了まで待機(非同期) +func (api *CDROMAPI) AsyncSleepWhileCopying(id int64, timeout time.Duration) (chan (interface{}), chan (interface{}), chan (error)) { + handler := waitingForAvailableFunc(func() (hasAvailable, error) { + return api.Read(id) + }, 0) + return poll(handler, timeout) +} diff --git a/vendor/github.com/sacloud/libsacloud/api/cdrom_gen.go b/vendor/github.com/sacloud/libsacloud/api/cdrom_gen.go new file mode 100644 index 00000000..05bc4d5b --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/cdrom_gen.go @@ -0,0 +1,250 @@ +package api + +/************************************************ + generated by IDE. for [CDROMAPI] +************************************************/ + +import ( + "github.com/sacloud/libsacloud/sacloud" +) + +/************************************************ + To support fluent interface for Find() +************************************************/ + +// Reset 検索条件リセット +func (api *CDROMAPI) Reset() *CDROMAPI { + api.reset() + return api +} + +// Offset オフセット +func (api *CDROMAPI) Offset(offset int) *CDROMAPI { + api.offset(offset) + return api +} + +// Limit リミット +func (api *CDROMAPI) Limit(limit int) *CDROMAPI { + api.limit(limit) + return api +} + +// Include 取得する項目 +func (api *CDROMAPI) Include(key string) *CDROMAPI { + api.include(key) + return api +} + +// Exclude 除外する項目 +func (api *CDROMAPI) Exclude(key string) *CDROMAPI { + api.exclude(key) + return api +} + +// FilterBy 指定キーでのフィルター +func (api *CDROMAPI) FilterBy(key string, value interface{}) *CDROMAPI { + api.filterBy(key, value, false) + return api +} + +// FilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *CDROMAPI) FilterMultiBy(key string, value interface{}) *CDROMAPI { + api.filterBy(key, value, true) + return api +} + +// WithNameLike 名称条件 +func (api *CDROMAPI) WithNameLike(name string) *CDROMAPI { + return api.FilterBy("Name", name) +} + +// WithTag タグ条件 +func (api *CDROMAPI) WithTag(tag string) *CDROMAPI { + return api.FilterBy("Tags.Name", tag) +} + +// WithTags タグ(複数)条件 +func (api *CDROMAPI) WithTags(tags []string) *CDROMAPI { + return api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// WithSizeGib サイズ条件 +func (api *CDROMAPI) WithSizeGib(size int) *CDROMAPI { + api.FilterBy("SizeMB", size*1024) + return api +} + +// WithSharedScope 公開スコープ条件 +func (api *CDROMAPI) WithSharedScope() *CDROMAPI { + api.FilterBy("Scope", "shared") + return api +} + +// WithUserScope ユーザースコープ条件 +func (api *CDROMAPI) WithUserScope() *CDROMAPI { + api.FilterBy("Scope", "user") + return api +} + +// SortBy 指定キーでのソート +func (api *CDROMAPI) SortBy(key string, reverse bool) *CDROMAPI { + api.sortBy(key, reverse) + return api +} + +// SortByName 名称でのソート +func (api *CDROMAPI) SortByName(reverse bool) *CDROMAPI { + api.sortByName(reverse) + return api +} + +// SortBySize サイズでのソート +func (api *CDROMAPI) SortBySize(reverse bool) *CDROMAPI { + api.sortBy("SizeMB", reverse) + return api +} + +/************************************************ + To support Setxxx interface for Find() +************************************************/ + +// SetEmpty 検索条件リセット +func (api *CDROMAPI) SetEmpty() { + api.reset() +} + +// SetOffset オフセット +func (api *CDROMAPI) SetOffset(offset int) { + api.offset(offset) +} + +// SetLimit リミット +func (api *CDROMAPI) SetLimit(limit int) { + api.limit(limit) +} + +// SetInclude 取得する項目 +func (api *CDROMAPI) SetInclude(key string) { + api.include(key) +} + +// SetExclude 除外する項目 +func (api *CDROMAPI) SetExclude(key string) { + api.exclude(key) +} + +// SetFilterBy 指定キーでのフィルター +func (api *CDROMAPI) SetFilterBy(key string, value interface{}) { + api.filterBy(key, value, false) +} + +// SetFilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *CDROMAPI) SetFilterMultiBy(key string, value interface{}) { + api.filterBy(key, value, true) +} + +// SetNameLike 名称条件 +func (api *CDROMAPI) SetNameLike(name string) { + api.FilterBy("Name", name) +} + +// SetTag タグ条件 +func (api *CDROMAPI) SetTag(tag string) { + api.FilterBy("Tags.Name", tag) +} + +// SetTags タグ(複数)条件 +func (api *CDROMAPI) SetTags(tags []string) { + api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// SetSizeGib サイズ条件 +func (api *CDROMAPI) SetSizeGib(size int) { + api.FilterBy("SizeMB", size*1024) +} + +// SetSharedScope 公開スコープ条件 +func (api *CDROMAPI) SetSharedScope() { + api.FilterBy("Scope", "shared") +} + +// SetUserScope ユーザースコープ条件 +func (api *CDROMAPI) SetUserScope() { + api.FilterBy("Scope", "user") +} + +// SetSortBy 指定キーでのソート +func (api *CDROMAPI) SetSortBy(key string, reverse bool) { + api.sortBy(key, reverse) +} + +// SetSortByName 名称でのソート +func (api *CDROMAPI) SetSortByName(reverse bool) { + api.sortByName(reverse) +} + +// SetSortBySize サイズでのソート +func (api *CDROMAPI) SetSortBySize(reverse bool) { + api.sortBy("SizeMB", reverse) +} + +/************************************************ + To support CRUD(Create/Read/Update/Delete) +************************************************/ + +// New 新規作成用パラメータ作成 +func (api *CDROMAPI) New() *sacloud.CDROM { + return &sacloud.CDROM{} +} + +//func (api *CDROMAPI) Create(value *sacloud.CDROM) (*sacloud.CDROM, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.create(api.createRequest(value), res) +// }) +//} + +// Read 読み取り +func (api *CDROMAPI) Read(id int64) (*sacloud.CDROM, error) { + return api.request(func(res *sacloud.Response) error { + return api.read(id, nil, res) + }) +} + +// Update 更新 +func (api *CDROMAPI) Update(id int64, value *sacloud.CDROM) (*sacloud.CDROM, error) { + return api.request(func(res *sacloud.Response) error { + return api.update(id, api.createRequest(value), res) + }) +} + +// Delete 削除 +func (api *CDROMAPI) Delete(id int64) (*sacloud.CDROM, error) { + return api.request(func(res *sacloud.Response) error { + return api.delete(id, nil, res) + }) +} + +/************************************************ + Inner functions +************************************************/ + +func (api *CDROMAPI) setStateValue(setFunc func(*sacloud.Request)) *CDROMAPI { + api.baseAPI.setStateValue(setFunc) + return api +} + +func (api *CDROMAPI) request(f func(*sacloud.Response) error) (*sacloud.CDROM, error) { + res := &sacloud.Response{} + err := f(res) + if err != nil { + return nil, err + } + return res.CDROM, nil +} + +func (api *CDROMAPI) createRequest(value *sacloud.CDROM) *sacloud.Request { + req := &sacloud.Request{} + req.CDROM = value + return req +} diff --git a/vendor/github.com/sacloud/libsacloud/api/client.go b/vendor/github.com/sacloud/libsacloud/api/client.go new file mode 100644 index 00000000..f3ca5a9a --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/client.go @@ -0,0 +1,608 @@ +package api + +import ( + "bytes" + "encoding/json" + "fmt" + "github.com/sacloud/libsacloud" + "github.com/sacloud/libsacloud/sacloud" + "io" + "io/ioutil" + "log" + "net/http" + "strings" + "time" +) + +var ( + // SakuraCloudAPIRoot APIリクエスト送信先ルートURL(末尾にスラッシュを含まない) + SakuraCloudAPIRoot = "https://secure.sakura.ad.jp/cloud/zone" +) + +// Client APIクライアント +type Client struct { + // AccessToken アクセストークン + AccessToken string + // AccessTokenSecret アクセストークンシークレット + AccessTokenSecret string + // Zone 対象ゾーン + Zone string + *API + // TraceMode トレースモード + TraceMode bool + // DefaultTimeoutDuration デフォルトタイムアウト間隔 + DefaultTimeoutDuration time.Duration + // ユーザーエージェント + UserAgent string + // Accept-Language + AcceptLanguage string + // リクエストパラメーター トレーサー + RequestTracer io.Writer + // レスポンス トレーサー + ResponseTracer io.Writer + // 503エラー時のリトライ回数 + RetryMax int + // 503エラー時のリトライ待ち時間 + RetryInterval time.Duration +} + +// NewClient APIクライアント作成 +func NewClient(token, tokenSecret, zone string) *Client { + c := &Client{ + AccessToken: token, + AccessTokenSecret: tokenSecret, + Zone: zone, + TraceMode: false, + DefaultTimeoutDuration: 20 * time.Minute, + UserAgent: fmt.Sprintf("libsacloud/%s", libsacloud.Version), + AcceptLanguage: "", + RetryMax: 0, + RetryInterval: 5 * time.Second, + } + c.API = newAPI(c) + return c +} + +// Clone APIクライアント クローン作成 +func (c *Client) Clone() *Client { + n := &Client{ + AccessToken: c.AccessToken, + AccessTokenSecret: c.AccessTokenSecret, + Zone: c.Zone, + TraceMode: c.TraceMode, + DefaultTimeoutDuration: c.DefaultTimeoutDuration, + UserAgent: c.UserAgent, + AcceptLanguage: c.AcceptLanguage, + RetryMax: c.RetryMax, + RetryInterval: c.RetryInterval, + } + n.API = newAPI(n) + return n +} + +func (c *Client) getEndpoint() string { + return fmt.Sprintf("%s/%s", SakuraCloudAPIRoot, c.Zone) +} + +func (c *Client) isOkStatus(code int) bool { + codes := map[int]bool{ + 200: true, + 201: true, + 202: true, + 204: true, + 305: false, + 400: false, + 401: false, + 403: false, + 404: false, + 405: false, + 406: false, + 408: false, + 409: false, + 411: false, + 413: false, + 415: false, + 500: false, + 503: false, + } + return codes[code] +} + +func (c *Client) newRequest(method, uri string, body interface{}) ([]byte, error) { + var ( + client = &retryableHTTPClient{ + retryMax: c.RetryMax, + retryInterval: c.RetryInterval, + } + err error + req *request + ) + var url = uri + if !strings.HasPrefix(url, "https://") { + url = fmt.Sprintf("%s/%s", c.getEndpoint(), uri) + } + + if body != nil { + var bodyJSON []byte + bodyJSON, err = json.Marshal(body) + if err != nil { + return nil, err + } + if method == "GET" { + url = fmt.Sprintf("%s?%s", url, bytes.NewBuffer(bodyJSON)) + req, err = newRequest(method, url, nil) + } else { + req, err = newRequest(method, url, bytes.NewReader(bodyJSON)) + } + b, _ := json.MarshalIndent(body, "", "\t") + if c.TraceMode { + log.Printf("[libsacloud:Client#request] method : %#v , url : %s , \nbody : %s", method, url, b) + } + if c.RequestTracer != nil { + c.RequestTracer.Write(b) + } + } else { + req, err = newRequest(method, url, nil) + if c.TraceMode { + log.Printf("[libsacloud:Client#request] method : %#v , url : %s ", method, url) + } + } + + if err != nil { + return nil, fmt.Errorf("Error with request: %v - %q", url, err) + } + + req.SetBasicAuth(c.AccessToken, c.AccessTokenSecret) + req.Header.Add("X-Sakura-Bigint-As-Int", "1") //Use BigInt on resource ids. + //if c.TraceMode { + // req.Header.Add("X-Sakura-API-Beautify", "1") // format response-JSON + //} + req.Header.Add("User-Agent", c.UserAgent) + if c.AcceptLanguage != "" { + req.Header.Add("Accept-Language", c.AcceptLanguage) + } + req.Method = method + + resp, err := client.Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + data, err := ioutil.ReadAll(resp.Body) + + v := &map[string]interface{}{} + json.Unmarshal(data, v) + b, _ := json.MarshalIndent(v, "", "\t") + if c.ResponseTracer != nil { + c.ResponseTracer.Write(b) + } + + if c.TraceMode { + log.Printf("[libsacloud:Client#response] : %s", b) + } + if !c.isOkStatus(resp.StatusCode) { + + errResponse := &sacloud.ResultErrorValue{} + err := json.Unmarshal(data, errResponse) + + if err != nil { + return nil, fmt.Errorf("Error in response: %s", string(data)) + } + return nil, NewError(resp.StatusCode, errResponse) + + } + if err != nil { + return nil, err + } + + return data, nil +} + +type lenReader interface { + Len() int +} + +type request struct { + // body is a seekable reader over the request body payload. This is + // used to rewind the request data in between retries. + body io.ReadSeeker + + // Embed an HTTP request directly. This makes a *Request act exactly + // like an *http.Request so that all meta methods are supported. + *http.Request +} + +func newRequest(method, url string, body io.ReadSeeker) (*request, error) { + var rcBody io.ReadCloser + if body != nil { + rcBody = ioutil.NopCloser(body) + } + + httpReq, err := http.NewRequest(method, url, rcBody) + if err != nil { + return nil, err + } + + if lr, ok := body.(lenReader); ok { + httpReq.ContentLength = int64(lr.Len()) + } + + return &request{body, httpReq}, nil +} + +type retryableHTTPClient struct { + http.Client + retryInterval time.Duration + retryMax int +} + +func (c *retryableHTTPClient) Do(req *request) (*http.Response, error) { + for i := 0; ; i++ { + + if req.body != nil { + if _, err := req.body.Seek(0, 0); err != nil { + return nil, fmt.Errorf("failed to seek body: %v", err) + } + } + + res, err := c.Client.Do(req.Request) + if res != nil && res.StatusCode != 503 { + return res, err + } + if res != nil && res.Body != nil { + res.Body.Close() + } + + if err != nil { + return res, err + } + + remain := c.retryMax - i + if remain == 0 { + break + } + time.Sleep(c.retryInterval) + } + + return nil, fmt.Errorf("%s %s giving up after %d attempts", + req.Method, req.URL, c.retryMax+1) +} + +// API libsacloudでサポートしているAPI群 +type API struct { + AuthStatus *AuthStatusAPI // 認証状態API + AutoBackup *AutoBackupAPI // 自動バックアップAPI + Archive *ArchiveAPI // アーカイブAPI + Bill *BillAPI // 請求情報API + Bridge *BridgeAPI // ブリッジAPi + CDROM *CDROMAPI // ISOイメージAPI + Database *DatabaseAPI // データベースAPI + Disk *DiskAPI // ディスクAPI + DNS *DNSAPI // DNS API + Facility *FacilityAPI // ファシリティAPI + GSLB *GSLBAPI // GSLB API + Icon *IconAPI // アイコンAPI + Interface *InterfaceAPI // インターフェースAPI + Internet *InternetAPI // ルーターAPI + IPAddress *IPAddressAPI // IPアドレスAPI + IPv6Addr *IPv6AddrAPI // IPv6アドレスAPI + IPv6Net *IPv6NetAPI // IPv6ネットワークAPI + License *LicenseAPI // ライセンスAPI + LoadBalancer *LoadBalancerAPI // ロードバランサーAPI + MobileGateway *MobileGatewayAPI // モバイルゲートウェイAPI + NewsFeed *NewsFeedAPI // フィード(障害/メンテナンス情報)API + NFS *NFSAPI // NFS API + Note *NoteAPI // スタートアップスクリプトAPI + PacketFilter *PacketFilterAPI // パケットフィルタAPI + PrivateHost *PrivateHostAPI // 専有ホストAPI + Product *ProductAPI // 製品情報API + Server *ServerAPI // サーバーAPI + SIM *SIMAPI // SIM API + SimpleMonitor *SimpleMonitorAPI // シンプル監視API + SSHKey *SSHKeyAPI // 公開鍵API + Subnet *SubnetAPI // IPv4ネットワークAPI + Switch *SwitchAPI // スイッチAPI + VPCRouter *VPCRouterAPI // VPCルーターAPI + WebAccel *WebAccelAPI // ウェブアクセラレータAPI +} + +// GetAuthStatusAPI 認証状態API取得 +func (api *API) GetAuthStatusAPI() *AuthStatusAPI { + return api.AuthStatus +} + +// GetAutoBackupAPI 自動バックアップAPI取得 +func (api *API) GetAutoBackupAPI() *AutoBackupAPI { + return api.AutoBackup +} + +// GetArchiveAPI アーカイブAPI取得 +func (api *API) GetArchiveAPI() *ArchiveAPI { + return api.Archive +} + +// GetBillAPI 請求情報API取得 +func (api *API) GetBillAPI() *BillAPI { + return api.Bill +} + +// GetBridgeAPI ブリッジAPI取得 +func (api *API) GetBridgeAPI() *BridgeAPI { + return api.Bridge +} + +// GetCDROMAPI ISOイメージAPI取得 +func (api *API) GetCDROMAPI() *CDROMAPI { + return api.CDROM +} + +// GetDatabaseAPI データベースAPI取得 +func (api *API) GetDatabaseAPI() *DatabaseAPI { + return api.Database +} + +// GetDiskAPI ディスクAPI取得 +func (api *API) GetDiskAPI() *DiskAPI { + return api.Disk +} + +// GetDNSAPI DNSAPI取得 +func (api *API) GetDNSAPI() *DNSAPI { + return api.DNS +} + +// GetRegionAPI リージョンAPI取得 +func (api *API) GetRegionAPI() *RegionAPI { + return api.Facility.GetRegionAPI() +} + +// GetZoneAPI ゾーンAPI取得 +func (api *API) GetZoneAPI() *ZoneAPI { + return api.Facility.GetZoneAPI() +} + +// GetGSLBAPI GSLB API取得 +func (api *API) GetGSLBAPI() *GSLBAPI { + return api.GSLB +} + +// GetIconAPI アイコンAPI取得 +func (api *API) GetIconAPI() *IconAPI { + return api.Icon +} + +// GetInterfaceAPI インターフェースAPI取得 +func (api *API) GetInterfaceAPI() *InterfaceAPI { + return api.Interface +} + +// GetInternetAPI ルーターAPI取得 +func (api *API) GetInternetAPI() *InternetAPI { + return api.Internet +} + +// GetIPAddressAPI IPアドレスAPI取得 +func (api *API) GetIPAddressAPI() *IPAddressAPI { + return api.IPAddress +} + +// GetIPv6AddrAPI IPv6アドレスAPI取得 +func (api *API) GetIPv6AddrAPI() *IPv6AddrAPI { + return api.IPv6Addr +} + +// GetIPv6NetAPI IPv6ネットワークAPI取得 +func (api *API) GetIPv6NetAPI() *IPv6NetAPI { + return api.IPv6Net +} + +// GetLicenseAPI ライセンスAPI取得 +func (api *API) GetLicenseAPI() *LicenseAPI { + return api.License +} + +// GetLoadBalancerAPI ロードバランサーAPI取得 +func (api *API) GetLoadBalancerAPI() *LoadBalancerAPI { + return api.LoadBalancer +} + +// GetMobileGatewayAPI モバイルゲートウェイAPI取得 +func (api *API) GetMobileGatewayAPI() *MobileGatewayAPI { + return api.MobileGateway +} + +// GetNewsFeedAPI フィード(障害/メンテナンス情報)API取得 +func (api *API) GetNewsFeedAPI() *NewsFeedAPI { + return api.NewsFeed +} + +// GetNFSAPI NFS API取得 +func (api *API) GetNFSAPI() *NFSAPI { + return api.NFS +} + +// GetNoteAPI スタートアップAPI取得 +func (api *API) GetNoteAPI() *NoteAPI { + return api.Note +} + +// GetPacketFilterAPI パケットフィルタAPI取得 +func (api *API) GetPacketFilterAPI() *PacketFilterAPI { + return api.PacketFilter +} + +// GetPrivateHostAPI 専有ホストAPI取得 +func (api *API) GetPrivateHostAPI() *PrivateHostAPI { + return api.PrivateHost +} + +// GetProductServerAPI サーバープランAPI取得 +func (api *API) GetProductServerAPI() *ProductServerAPI { + return api.Product.GetProductServerAPI() +} + +// GetProductLicenseAPI ライセンスプランAPI取得 +func (api *API) GetProductLicenseAPI() *ProductLicenseAPI { + return api.Product.GetProductLicenseAPI() +} + +// GetProductDiskAPI ディスクプランAPI取得 +func (api *API) GetProductDiskAPI() *ProductDiskAPI { + return api.Product.GetProductDiskAPI() +} + +// GetProductInternetAPI ルータープランAPI取得 +func (api *API) GetProductInternetAPI() *ProductInternetAPI { + return api.Product.GetProductInternetAPI() +} + +// GetPublicPriceAPI 価格情報API取得 +func (api *API) GetPublicPriceAPI() *PublicPriceAPI { + return api.Product.GetPublicPriceAPI() +} + +// GetServerAPI サーバーAPI取得 +func (api *API) GetServerAPI() *ServerAPI { + return api.Server +} + +// GetSIMAPI SIM API取得 +func (api *API) GetSIMAPI() *SIMAPI { + return api.SIM +} + +// GetSimpleMonitorAPI シンプル監視API取得 +func (api *API) GetSimpleMonitorAPI() *SimpleMonitorAPI { + return api.SimpleMonitor +} + +// GetSSHKeyAPI SSH公開鍵API取得 +func (api *API) GetSSHKeyAPI() *SSHKeyAPI { + return api.SSHKey +} + +// GetSubnetAPI サブネットAPI取得 +func (api *API) GetSubnetAPI() *SubnetAPI { + return api.Subnet +} + +// GetSwitchAPI スイッチAPI取得 +func (api *API) GetSwitchAPI() *SwitchAPI { + return api.Switch +} + +// GetVPCRouterAPI VPCルーターAPI取得 +func (api *API) GetVPCRouterAPI() *VPCRouterAPI { + return api.VPCRouter +} + +// GetWebAccelAPI ウェブアクセラレータAPI取得 +func (api *API) GetWebAccelAPI() *WebAccelAPI { + return api.WebAccel +} + +// ProductAPI 製品情報関連API群 +type ProductAPI struct { + Server *ProductServerAPI // サーバープランAPI + License *ProductLicenseAPI // ライセンスプランAPI + Disk *ProductDiskAPI // ディスクプランAPI + Internet *ProductInternetAPI // ルータープランAPI + PrivateHost *ProductPrivateHostAPI // 専有ホストプランAPI + Price *PublicPriceAPI // 価格情報API +} + +// GetProductServerAPI サーバープランAPI取得 +func (api *ProductAPI) GetProductServerAPI() *ProductServerAPI { + return api.Server +} + +// GetProductLicenseAPI ライセンスプランAPI取得 +func (api *ProductAPI) GetProductLicenseAPI() *ProductLicenseAPI { + return api.License +} + +// GetProductDiskAPI ディスクプランAPI取得 +func (api *ProductAPI) GetProductDiskAPI() *ProductDiskAPI { + return api.Disk +} + +// GetProductInternetAPI ルータープランAPI取得 +func (api *ProductAPI) GetProductInternetAPI() *ProductInternetAPI { + return api.Internet +} + +// GetProductPrivateHostAPI 専有ホストプラン取得API +func (api *ProductAPI) GetProductPrivateHostAPI() *ProductPrivateHostAPI { + return api.PrivateHost +} + +// GetPublicPriceAPI 価格情報API取得 +func (api *ProductAPI) GetPublicPriceAPI() *PublicPriceAPI { + return api.Price +} + +// FacilityAPI ファシリティ関連API群 +type FacilityAPI struct { + Region *RegionAPI // リージョンAPI + Zone *ZoneAPI // ゾーンAPI +} + +// GetRegionAPI リージョンAPI取得 +func (api *FacilityAPI) GetRegionAPI() *RegionAPI { + return api.Region +} + +// GetZoneAPI ゾーンAPI取得 +func (api *FacilityAPI) GetZoneAPI() *ZoneAPI { + return api.Zone +} + +func newAPI(client *Client) *API { + return &API{ + AuthStatus: NewAuthStatusAPI(client), + AutoBackup: NewAutoBackupAPI(client), + Archive: NewArchiveAPI(client), + Bill: NewBillAPI(client), + Bridge: NewBridgeAPI(client), + CDROM: NewCDROMAPI(client), + Database: NewDatabaseAPI(client), + Disk: NewDiskAPI(client), + DNS: NewDNSAPI(client), + Facility: &FacilityAPI{ + Region: NewRegionAPI(client), + Zone: NewZoneAPI(client), + }, + GSLB: NewGSLBAPI(client), + Icon: NewIconAPI(client), + Interface: NewInterfaceAPI(client), + Internet: NewInternetAPI(client), + IPAddress: NewIPAddressAPI(client), + IPv6Addr: NewIPv6AddrAPI(client), + IPv6Net: NewIPv6NetAPI(client), + License: NewLicenseAPI(client), + LoadBalancer: NewLoadBalancerAPI(client), + MobileGateway: NewMobileGatewayAPI(client), + NewsFeed: NewNewsFeedAPI(client), + NFS: NewNFSAPI(client), + Note: NewNoteAPI(client), + PacketFilter: NewPacketFilterAPI(client), + PrivateHost: NewPrivateHostAPI(client), + Product: &ProductAPI{ + Server: NewProductServerAPI(client), + License: NewProductLicenseAPI(client), + Disk: NewProductDiskAPI(client), + Internet: NewProductInternetAPI(client), + PrivateHost: NewProductPrivateHostAPI(client), + Price: NewPublicPriceAPI(client), + }, + Server: NewServerAPI(client), + SIM: NewSIMAPI(client), + SimpleMonitor: NewSimpleMonitorAPI(client), + SSHKey: NewSSHKeyAPI(client), + Subnet: NewSubnetAPI(client), + Switch: NewSwitchAPI(client), + VPCRouter: NewVPCRouterAPI(client), + WebAccel: NewWebAccelAPI(client), + } +} diff --git a/vendor/github.com/sacloud/libsacloud/api/database.go b/vendor/github.com/sacloud/libsacloud/api/database.go new file mode 100644 index 00000000..9ebe9a14 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/database.go @@ -0,0 +1,429 @@ +package api + +import ( + "encoding/json" + "fmt" + "github.com/sacloud/libsacloud/sacloud" + "time" +) + +//HACK: さくらのAPI側仕様: Applianceの内容によってJSONフォーマットが異なるため +// ロードバランサ/VPCルータそれぞれでリクエスト/レスポンスデータ型を定義する。 + +// SearchDatabaseResponse データベース検索レスポンス +type SearchDatabaseResponse struct { + // Total 総件数 + Total int `json:",omitempty"` + // From ページング開始位置 + From int `json:",omitempty"` + // Count 件数 + Count int `json:",omitempty"` + // Databases データベースリスト + Databases []sacloud.Database `json:"Appliances,omitempty"` +} + +type databaseRequest struct { + Database *sacloud.Database `json:"Appliance,omitempty"` + From int `json:",omitempty"` + Count int `json:",omitempty"` + Sort []string `json:",omitempty"` + Filter map[string]interface{} `json:",omitempty"` + Exclude []string `json:",omitempty"` + Include []string `json:",omitempty"` +} + +type databaseResponse struct { + *sacloud.ResultFlagValue + *sacloud.Database `json:"Appliance,omitempty"` + // Success + Success interface{} `json:",omitempty"` //HACK: さくらのAPI側仕様: 戻り値:Successがbool値へ変換できないためinterface{}で受ける +} + +type databaseStatusResponse struct { + *sacloud.ResultFlagValue + Success interface{} `json:",omitempty"` //HACK: さくらのAPI側仕様: 戻り値:Successがbool値へ変換できないためinterface{} + Appliance *struct { + SettingsResponse *sacloud.DatabaseStatus + } +} + +type databaseBackupResponse struct { + Log string `json:",omitempty"` + IsOk bool `json:"is_ok,omitempty"` +} + +// DatabaseAPI データベースAPI +type DatabaseAPI struct { + *baseAPI +} + +// NewDatabaseAPI データベースAPI作成 +func NewDatabaseAPI(client *Client) *DatabaseAPI { + return &DatabaseAPI{ + &baseAPI{ + client: client, + FuncGetResourceURL: func() string { + return "appliance" + }, + FuncBaseSearchCondition: func() *sacloud.Request { + res := &sacloud.Request{} + res.AddFilter("Class", "database") + return res + }, + }, + } +} + +// Find 検索 +func (api *DatabaseAPI) Find() (*SearchDatabaseResponse, error) { + data, err := api.client.newRequest("GET", api.getResourceURL(), api.getSearchState()) + if err != nil { + return nil, err + } + var res SearchDatabaseResponse + if err := json.Unmarshal(data, &res); err != nil { + return nil, err + } + return &res, nil +} + +func (api *DatabaseAPI) request(f func(*databaseResponse) error) (*sacloud.Database, error) { + res := &databaseResponse{} + err := f(res) + if err != nil { + return nil, err + } + return res.Database, nil +} + +func (api *DatabaseAPI) createRequest(value *sacloud.Database) *databaseResponse { + return &databaseResponse{Database: value} +} + +// New 新規作成用パラメーター作成 +func (api *DatabaseAPI) New(values *sacloud.CreateDatabaseValue) *sacloud.Database { + return sacloud.CreateNewDatabase(values) +} + +// Create 新規作成 +func (api *DatabaseAPI) Create(value *sacloud.Database) (*sacloud.Database, error) { + return api.request(func(res *databaseResponse) error { + return api.create(api.createRequest(value), res) + }) +} + +// Read 読み取り +func (api *DatabaseAPI) Read(id int64) (*sacloud.Database, error) { + return api.request(func(res *databaseResponse) error { + return api.read(id, nil, res) + }) +} + +// Status DBの設定/起動状態の取得 +func (api *DatabaseAPI) Status(id int64) (*sacloud.DatabaseStatus, error) { + var ( + method = "GET" + uri = fmt.Sprintf("%s/%d/status", api.getResourceURL(), id) + ) + + res := &databaseStatusResponse{} + err := api.baseAPI.request(method, uri, nil, res) + if err != nil { + return nil, err + } + return res.Appliance.SettingsResponse, nil +} + +// Backup バックアップ取得 +func (api *DatabaseAPI) Backup(id int64) (string, error) { + var ( + method = "POST" + uri = fmt.Sprintf("%s/%d/action/history", api.getResourceURL(), id) + ) + + body := map[string]interface{}{ + "Appliance": map[string]interface{}{ + "Settings": map[string]interface{}{ + "DBConf": map[string]interface{}{ + "backup": map[string]string{ + "availability": "discontinued", + }, + }, + }, + }, + } + + res := &databaseBackupResponse{} + err := api.baseAPI.request(method, uri, body, res) + if err != nil { + return "", err + } + return res.Log, nil +} + +// DownloadLog ログ取得 +func (api *DatabaseAPI) DownloadLog(id int64, logID string) (string, error) { + var ( + method = "GET" + uri = fmt.Sprintf("%s/%d/download/log/%s", api.getResourceURL(), id, logID) + ) + + res := &databaseBackupResponse{} + err := api.baseAPI.request(method, uri, nil, res) + if err != nil { + return "", err + } + return res.Log, nil +} + +// Restore バックアップからの復元 +func (api *DatabaseAPI) Restore(id int64, backupID string) (string, error) { + var ( + method = "POST" + uri = fmt.Sprintf("%s/%d/action/history/%s", api.getResourceURL(), id, backupID) + ) + + body := map[string]interface{}{ + "Appliance": map[string]interface{}{}, + } + + res := &databaseBackupResponse{} + err := api.baseAPI.request(method, uri, body, res) + if err != nil { + return "", err + } + return res.Log, nil +} + +// DeleteBackup バックアップの削除 +func (api *DatabaseAPI) DeleteBackup(id int64, backupID string) (string, error) { + var ( + method = "DELETE" + uri = fmt.Sprintf("%s/%d/action/history/%s", api.getResourceURL(), id, backupID) + ) + + body := map[string]interface{}{ + "Appliance": map[string]interface{}{}, + } + + res := &databaseBackupResponse{} + err := api.baseAPI.request(method, uri, body, res) + if err != nil { + return "", err + } + return res.Log, nil +} + +// HistoryLock バックアップ削除ロック +func (api *DatabaseAPI) HistoryLock(id int64, backupID string) (string, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/action/history-lock/%s", api.getResourceURL(), id, backupID) + ) + + body := map[string]interface{}{ + "Appliance": map[string]interface{}{}, + } + + res := &databaseBackupResponse{} + err := api.baseAPI.request(method, uri, body, res) + if err != nil { + return "", err + } + return res.Log, nil +} + +// HistoryUnlock バックアップ削除アンロック +func (api *DatabaseAPI) HistoryUnlock(id int64, backupID string) (string, error) { + var ( + method = "DELETE" + uri = fmt.Sprintf("%s/%d/action/history-lock/%s", api.getResourceURL(), id, backupID) + ) + + body := map[string]interface{}{ + "Appliance": map[string]interface{}{}, + } + + res := &databaseBackupResponse{} + err := api.baseAPI.request(method, uri, body, res) + if err != nil { + return "", err + } + return res.Log, nil +} + +// Update 更新 +func (api *DatabaseAPI) Update(id int64, value *sacloud.Database) (*sacloud.Database, error) { + return api.request(func(res *databaseResponse) error { + return api.update(id, api.createRequest(value), res) + }) +} + +// UpdateSetting 設定更新 +func (api *DatabaseAPI) UpdateSetting(id int64, value *sacloud.Database) (*sacloud.Database, error) { + req := &sacloud.Database{ + // Settings + Settings: value.Settings, + } + return api.request(func(res *databaseResponse) error { + return api.update(id, api.createRequest(req), res) + }) +} + +// Delete 削除 +func (api *DatabaseAPI) Delete(id int64) (*sacloud.Database, error) { + return api.request(func(res *databaseResponse) error { + return api.delete(id, nil, res) + }) +} + +// Config 設定変更の反映 +func (api *DatabaseAPI) Config(id int64) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/config", api.getResourceURL(), id) + ) + return api.modify(method, uri, nil) +} + +// IsUp 起動しているか判定 +func (api *DatabaseAPI) IsUp(id int64) (bool, error) { + lb, err := api.Read(id) + if err != nil { + return false, err + } + return lb.Instance.IsUp(), nil +} + +// IsDown ダウンしているか判定 +func (api *DatabaseAPI) IsDown(id int64) (bool, error) { + lb, err := api.Read(id) + if err != nil { + return false, err + } + return lb.Instance.IsDown(), nil +} + +// IsDatabaseRunning データベースプロセスが起動しているか判定 +func (api *DatabaseAPI) IsDatabaseRunning(id int64) (bool, error) { + db, err := api.Status(id) + if err != nil { + return false, err + } + return db.IsUp(), nil + +} + +// Boot 起動 +func (api *DatabaseAPI) Boot(id int64) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/power", api.getResourceURL(), id) + ) + return api.modify(method, uri, nil) +} + +// Shutdown シャットダウン(graceful) +func (api *DatabaseAPI) Shutdown(id int64) (bool, error) { + var ( + method = "DELETE" + uri = fmt.Sprintf("%s/%d/power", api.getResourceURL(), id) + ) + + return api.modify(method, uri, nil) +} + +// Stop シャットダウン(force) +func (api *DatabaseAPI) Stop(id int64) (bool, error) { + var ( + method = "DELETE" + uri = fmt.Sprintf("%s/%d/power", api.getResourceURL(), id) + ) + + return api.modify(method, uri, map[string]bool{"Force": true}) +} + +// RebootForce 再起動 +func (api *DatabaseAPI) RebootForce(id int64) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/reset", api.getResourceURL(), id) + ) + + return api.modify(method, uri, nil) +} + +// ResetForce リセット +func (api *DatabaseAPI) ResetForce(id int64, recycleProcess bool) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/reset", api.getResourceURL(), id) + ) + + return api.modify(method, uri, map[string]bool{"RecycleProcess": recycleProcess}) +} + +// SleepUntilUp 起動するまで待機 +func (api *DatabaseAPI) SleepUntilUp(id int64, timeout time.Duration) error { + handler := waitingForUpFunc(func() (hasUpDown, error) { + return api.Read(id) + }, 0) + return blockingPoll(handler, timeout) +} + +// SleepUntilDatabaseRunning 起動するまで待機 +func (api *DatabaseAPI) SleepUntilDatabaseRunning(id int64, timeout time.Duration, maxRetry int) error { + handler := waitingForUpFunc(func() (hasUpDown, error) { + return api.Read(id) + }, maxRetry) + return blockingPoll(handler, timeout) +} + +// SleepUntilDown ダウンするまで待機 +func (api *DatabaseAPI) SleepUntilDown(id int64, timeout time.Duration) error { + handler := waitingForDownFunc(func() (hasUpDown, error) { + return api.Read(id) + }, 0) + return blockingPoll(handler, timeout) +} + +// SleepWhileCopying コピー終了まで待機 +func (api *DatabaseAPI) SleepWhileCopying(id int64, timeout time.Duration, maxRetry int) error { + handler := waitingForAvailableFunc(func() (hasAvailable, error) { + return api.Read(id) + }, maxRetry) + return blockingPoll(handler, timeout) +} + +// AsyncSleepWhileCopying コピー終了まで待機(非同期) +func (api *DatabaseAPI) AsyncSleepWhileCopying(id int64, timeout time.Duration, maxRetry int) (chan (interface{}), chan (interface{}), chan (error)) { + handler := waitingForAvailableFunc(func() (hasAvailable, error) { + return api.Read(id) + }, maxRetry) + return poll(handler, timeout) +} + +// MonitorCPU CPUアクティビティーモニター取得 +func (api *DatabaseAPI) MonitorCPU(id int64, body *sacloud.ResourceMonitorRequest) (*sacloud.MonitorValues, error) { + return api.baseAPI.applianceMonitorBy(id, "cpu", 0, body) +} + +// MonitorDatabase データーベース固有項目アクティビティモニター取得 +func (api *DatabaseAPI) MonitorDatabase(id int64, body *sacloud.ResourceMonitorRequest) (*sacloud.MonitorValues, error) { + return api.baseAPI.applianceMonitorBy(id, "database", 0, body) +} + +// MonitorInterface NICアクティビティーモニター取得 +func (api *DatabaseAPI) MonitorInterface(id int64, body *sacloud.ResourceMonitorRequest) (*sacloud.MonitorValues, error) { + return api.baseAPI.applianceMonitorBy(id, "interface", 0, body) +} + +// MonitorSystemDisk システムディスクアクティビティーモニター取得 +func (api *DatabaseAPI) MonitorSystemDisk(id int64, body *sacloud.ResourceMonitorRequest) (*sacloud.MonitorValues, error) { + return api.baseAPI.applianceMonitorBy(id, "disk", 1, body) +} + +// MonitorBackupDisk バックアップディスクアクティビティーモニター取得 +func (api *DatabaseAPI) MonitorBackupDisk(id int64, body *sacloud.ResourceMonitorRequest) (*sacloud.MonitorValues, error) { + return api.baseAPI.applianceMonitorBy(id, "disk", 2, body) +} diff --git a/vendor/github.com/sacloud/libsacloud/api/database_gen.go b/vendor/github.com/sacloud/libsacloud/api/database_gen.go new file mode 100644 index 00000000..26345aab --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/database_gen.go @@ -0,0 +1,238 @@ +package api + +/************************************************ + generated by IDE. for [DatabaseAPI] +************************************************/ + +import ( + "github.com/sacloud/libsacloud/sacloud" +) + +/************************************************ + To support fluent interface for Find() +************************************************/ + +// Reset 検索条件のリセット +func (api *DatabaseAPI) Reset() *DatabaseAPI { + api.reset() + return api +} + +// Offset オフセット +func (api *DatabaseAPI) Offset(offset int) *DatabaseAPI { + api.offset(offset) + return api +} + +// Limit リミット +func (api *DatabaseAPI) Limit(limit int) *DatabaseAPI { + api.limit(limit) + return api +} + +// Include 取得する項目 +func (api *DatabaseAPI) Include(key string) *DatabaseAPI { + api.include(key) + return api +} + +// Exclude 除外する項目 +func (api *DatabaseAPI) Exclude(key string) *DatabaseAPI { + api.exclude(key) + return api +} + +// FilterBy 指定項目でのフィルター +func (api *DatabaseAPI) FilterBy(key string, value interface{}) *DatabaseAPI { + api.filterBy(key, value, false) + return api +} + +// FilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *DatabaseAPI) FilterMultiBy(key string, value interface{}) *DatabaseAPI { + api.filterBy(key, value, true) + return api +} + +// WithNameLike 名称条件 +func (api *DatabaseAPI) WithNameLike(name string) *DatabaseAPI { + return api.FilterBy("Name", name) +} + +// WithTag タグ条件 +func (api *DatabaseAPI) WithTag(tag string) *DatabaseAPI { + return api.FilterBy("Tags.Name", tag) +} + +// WithTags タグ(複数)条件 +func (api *DatabaseAPI) WithTags(tags []string) *DatabaseAPI { + return api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *DatabaseAPI) WithSizeGib(size int) *DatabaseAPI { +// api.FilterBy("SizeMB", size*1024) +// return api +// } + +// func (api *DatabaseAPI) WithSharedScope() *DatabaseAPI { +// api.FilterBy("Scope", "shared") +// return api +// } + +// func (api *DatabaseAPI) WithUserScope() *DatabaseAPI { +// api.FilterBy("Scope", "user") +// return api +// } + +// SortBy 指定キーでのソート +func (api *DatabaseAPI) SortBy(key string, reverse bool) *DatabaseAPI { + api.sortBy(key, reverse) + return api +} + +// SortByName 名称でのソート +func (api *DatabaseAPI) SortByName(reverse bool) *DatabaseAPI { + api.sortByName(reverse) + return api +} + +// func (api *DatabaseAPI) SortBySize(reverse bool) *DatabaseAPI { +// api.sortBy("SizeMB", reverse) +// return api +// } + +/************************************************ + To support fluent interface for Find() +************************************************/ + +// SetEmpty 検索条件のリセット +func (api *DatabaseAPI) SetEmpty() { + api.reset() +} + +// SetOffset オフセット +func (api *DatabaseAPI) SetOffset(offset int) { + api.offset(offset) +} + +// SetLimit リミット +func (api *DatabaseAPI) SetLimit(limit int) { + api.limit(limit) +} + +// SetInclude 取得する項目 +func (api *DatabaseAPI) SetInclude(key string) { + api.include(key) +} + +// SetExclude 除外する項目 +func (api *DatabaseAPI) SetExclude(key string) { + api.exclude(key) +} + +// SetFilterBy 指定項目でのフィルター +func (api *DatabaseAPI) SetFilterBy(key string, value interface{}) { + api.filterBy(key, value, false) +} + +// SetFilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *DatabaseAPI) SetFilterMultiBy(key string, value interface{}) { + api.filterBy(key, value, true) +} + +// SetNameLike 名称条件 +func (api *DatabaseAPI) SetNameLike(name string) { + api.FilterBy("Name", name) +} + +// SetTag タグ条件 +func (api *DatabaseAPI) SetTag(tag string) { + api.FilterBy("Tags.Name", tag) +} + +// SetTags タグ(複数)条件 +func (api *DatabaseAPI) SetTags(tags []string) { + api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *DatabaseAPI) SetSizeGib(size int) { +// api.FilterBy("SizeMB", size*1024) +// } + +// func (api *DatabaseAPI) SetSharedScope() { +// api.FilterBy("Scope", "shared") +// } + +// func (api *DatabaseAPI) SetUserScope() { +// api.FilterBy("Scope", "user") +// } + +// SetSortBy 指定キーでのソート +func (api *DatabaseAPI) SetSortBy(key string, reverse bool) { + api.sortBy(key, reverse) +} + +// SetSortByName 名称でのソート +func (api *DatabaseAPI) SetSortByName(reverse bool) { + api.sortByName(reverse) +} + +// func (api *DatabaseAPI) SetSortBySize(reverse bool) { +// api.sortBy("SizeMB", reverse) +// } + +/************************************************ + To support CRUD(Create/Read/Update/Delete) +************************************************/ + +// func (api *DatabaseAPI) New() *sacloud.Database { +// return &sacloud.Database{} +// } + +// func (api *DatabaseAPI) Create(value *sacloud.Database) (*sacloud.Database, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.create(api.createRequest(value), res) +// }) +// } + +// func (api *DatabaseAPI) Read(id string) (*sacloud.Database, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.read(id, nil, res) +// }) +// } + +// func (api *DatabaseAPI) Update(id string, value *sacloud.Database) (*sacloud.Database, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.update(id, api.createRequest(value), res) +// }) +// } + +// func (api *DatabaseAPI) Delete(id string) (*sacloud.Database, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.delete(id, nil, res) +// }) +// } + +/************************************************ + Inner functions +************************************************/ + +func (api *DatabaseAPI) setStateValue(setFunc func(*sacloud.Request)) *DatabaseAPI { + api.baseAPI.setStateValue(setFunc) + return api +} + +//func (api *DatabaseAPI) request(f func(*sacloud.Response) error) (*sacloud.Database, error) { +// res := &sacloud.Response{} +// err := f(res) +// if err != nil { +// return nil, err +// } +// return res.Database, nil +//} +// +//func (api *DatabaseAPI) createRequest(value *sacloud.Database) *sacloud.Request { +// req := &sacloud.Request{} +// req.Database = value +// return req +//} diff --git a/vendor/github.com/sacloud/libsacloud/api/disk.go b/vendor/github.com/sacloud/libsacloud/api/disk.go new file mode 100644 index 00000000..a90a4b00 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/disk.go @@ -0,0 +1,283 @@ +package api + +import ( + "fmt" + "github.com/sacloud/libsacloud/sacloud" + "time" +) + +var ( + // allowDiskEditTags ディスクの編集可否判定に用いるタグ + allowDiskEditTags = []string{ + "os-unix", + "os-linux", + } + + // bundleInfoWindowsHostClass ディスクの編集可否判定に用いる、BundleInfoでのWindows判定文字列 + bundleInfoWindowsHostClass = "ms_windows" +) + +// DiskAPI ディスクAPI +type DiskAPI struct { + *baseAPI +} + +// NewDiskAPI ディスクAPI作成 +func NewDiskAPI(client *Client) *DiskAPI { + return &DiskAPI{ + &baseAPI{ + client: client, + // FuncGetResourceURL + FuncGetResourceURL: func() string { + return "disk" + }, + }, + } +} + +// SortByConnectionOrder 接続順でのソート +func (api *DiskAPI) SortByConnectionOrder(reverse bool) *DiskAPI { + api.sortBy("ConnectionOrder", reverse) + return api +} + +// WithServerID サーバーID条件 +func (api *DiskAPI) WithServerID(id int64) *DiskAPI { + api.FilterBy("Server.ID", id) + return api +} + +// Create 新規作成 +func (api *DiskAPI) Create(value *sacloud.Disk) (*sacloud.Disk, error) { + //HACK: さくらのAPI側仕様: 戻り値:Successがbool値へ変換できないため文字列で受ける + type diskResponse struct { + *sacloud.Response + // Success + Success string `json:",omitempty"` + } + res := &diskResponse{} + err := api.create(api.createRequest(value), res) + if err != nil { + return nil, err + } + return res.Disk, nil +} + +// NewCondig ディスクの修正用パラメーター作成 +func (api *DiskAPI) NewCondig() *sacloud.DiskEditValue { + return &sacloud.DiskEditValue{} +} + +// Config ディスクの修正 +func (api *DiskAPI) Config(id int64, disk *sacloud.DiskEditValue) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/config", api.getResourceURL(), id) + ) + + return api.modify(method, uri, disk) +} + +func (api *DiskAPI) install(id int64, body *sacloud.Disk) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/install", api.getResourceURL(), id) + ) + //HACK: さくらのAPI側仕様: 戻り値:Successがbool値へ変換できないため文字列で受ける + type diskResponse struct { + *sacloud.ResultFlagValue + // Success + Success string `json:",omitempty"` + } + res := &diskResponse{} + err := api.baseAPI.request(method, uri, body, res) + if err != nil { + return false, err + } + return res.IsOk, nil +} + +// ReinstallFromBlank ブランクディスクから再インストール +func (api *DiskAPI) ReinstallFromBlank(id int64, sizeMB int) (bool, error) { + var body = &sacloud.Disk{} + body.SetSizeMB(sizeMB) + + return api.install(id, body) +} + +// ReinstallFromArchive アーカイブからの再インストール +func (api *DiskAPI) ReinstallFromArchive(id int64, archiveID int64, distantFrom ...int64) (bool, error) { + var body = &sacloud.Disk{} + body.SetSourceArchive(archiveID) + if len(distantFrom) > 0 { + body.SetDistantFrom(distantFrom) + } + return api.install(id, body) +} + +// ReinstallFromDisk ディスクからの再インストール +func (api *DiskAPI) ReinstallFromDisk(id int64, diskID int64, distantFrom ...int64) (bool, error) { + var body = &sacloud.Disk{} + body.SetSourceDisk(diskID) + if len(distantFrom) > 0 { + body.SetDistantFrom(distantFrom) + } + return api.install(id, body) +} + +// ToBlank ディスクを空にする +func (api *DiskAPI) ToBlank(diskID int64) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/to/blank", api.getResourceURL(), diskID) + ) + return api.modify(method, uri, nil) +} + +// ResizePartition パーティションのリサイズ +func (api *DiskAPI) ResizePartition(diskID int64) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/resize-partition", api.getResourceURL(), diskID) + ) + return api.modify(method, uri, nil) +} + +// DisconnectFromServer サーバーとの接続解除 +func (api *DiskAPI) DisconnectFromServer(diskID int64) (bool, error) { + var ( + method = "DELETE" + uri = fmt.Sprintf("%s/%d/to/server", api.getResourceURL(), diskID) + ) + return api.modify(method, uri, nil) +} + +// ConnectToServer サーバーとの接続 +func (api *DiskAPI) ConnectToServer(diskID int64, serverID int64) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/to/server/%d", api.getResourceURL(), diskID, serverID) + ) + return api.modify(method, uri, nil) +} + +// State ディスクの状態を取得し有効な状態か判定 +func (api *DiskAPI) State(diskID int64) (bool, error) { + disk, err := api.Read(diskID) + if err != nil { + return false, err + } + return disk.IsAvailable(), nil +} + +// SleepWhileCopying コピー終了まで待機 +func (api *DiskAPI) SleepWhileCopying(id int64, timeout time.Duration) error { + handler := waitingForAvailableFunc(func() (hasAvailable, error) { + return api.Read(id) + }, 0) + return blockingPoll(handler, timeout) +} + +// AsyncSleepWhileCopying コピー終了まで待機(非同期) +func (api *DiskAPI) AsyncSleepWhileCopying(id int64, timeout time.Duration) (chan (interface{}), chan (interface{}), chan (error)) { + handler := waitingForAvailableFunc(func() (hasAvailable, error) { + return api.Read(id) + }, 0) + return poll(handler, timeout) +} + +// Monitor アクティビティーモニター取得 +func (api *DiskAPI) Monitor(id int64, body *sacloud.ResourceMonitorRequest) (*sacloud.MonitorValues, error) { + return api.baseAPI.monitor(id, body) +} + +// CanEditDisk ディスクの修正が可能か判定 +func (api *DiskAPI) CanEditDisk(id int64) (bool, error) { + + disk, err := api.Read(id) + if err != nil { + return false, err + } + + if disk == nil { + return false, nil + } + + // BundleInfoがあれば編集不可 + if disk.BundleInfo != nil && disk.BundleInfo.HostClass == bundleInfoWindowsHostClass { + // Windows + return false, nil + } + + // SophosUTMであれば編集不可 + if disk.HasTag("pkg-sophosutm") || disk.IsSophosUTM() { + return false, nil + } + + // ソースアーカイブ/ソースディスクともに持っていない場合 + if disk.SourceArchive == nil && disk.SourceDisk == nil { + //ブランクディスクがソース + return false, nil + } + + for _, t := range allowDiskEditTags { + if disk.HasTag(t) { + // 対応OSインストール済みディスク + return true, nil + } + } + + // ここまできても判定できないならソースに投げる + if disk.SourceDisk != nil && disk.SourceDisk.Availability != "discontinued" { + return api.client.Disk.CanEditDisk(disk.SourceDisk.ID) + } + if disk.SourceArchive != nil && disk.SourceArchive.Availability != "discontinued" { + return api.client.Archive.CanEditDisk(disk.SourceArchive.ID) + } + + return false, nil + +} + +// GetPublicArchiveIDFromAncestors 祖先の中からパブリックアーカイブのIDを検索 +func (api *DiskAPI) GetPublicArchiveIDFromAncestors(id int64) (int64, bool) { + + emptyID := int64(0) + + disk, err := api.Read(id) + if err != nil { + return emptyID, false + } + + if disk == nil { + return emptyID, false + } + + // BundleInfoがあれば編集不可 + if disk.BundleInfo != nil && disk.BundleInfo.HostClass == bundleInfoWindowsHostClass { + // Windows + return emptyID, false + } + + // SophosUTMであれば編集不可 + if disk.HasTag("pkg-sophosutm") || disk.IsSophosUTM() { + return emptyID, false + } + + for _, t := range allowDiskEditTags { + if disk.HasTag(t) { + // 対応OSインストール済みディスク + return disk.ID, true + } + } + + // ここまできても判定できないならソースに投げる + if disk.SourceDisk != nil && disk.SourceDisk.Availability != "discontinued" { + return api.client.Disk.GetPublicArchiveIDFromAncestors(disk.SourceDisk.ID) + } + if disk.SourceArchive != nil && disk.SourceArchive.Availability != "discontinued" { + return api.client.Archive.GetPublicArchiveIDFromAncestors(disk.SourceArchive.ID) + } + return emptyID, false + +} diff --git a/vendor/github.com/sacloud/libsacloud/api/disk_gen.go b/vendor/github.com/sacloud/libsacloud/api/disk_gen.go new file mode 100644 index 00000000..114d12df --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/disk_gen.go @@ -0,0 +1,228 @@ +package api + +/************************************************ + generated by IDE. for [DiskAPI] +************************************************/ + +import ( + "github.com/sacloud/libsacloud/sacloud" +) + +/************************************************ + To support fluent interface for Find() +************************************************/ + +// Reset 検索条件のリセット +func (api *DiskAPI) Reset() *DiskAPI { + api.reset() + return api +} + +// Offset オフセット +func (api *DiskAPI) Offset(offset int) *DiskAPI { + api.offset(offset) + return api +} + +// Limit リミット +func (api *DiskAPI) Limit(limit int) *DiskAPI { + api.limit(limit) + return api +} + +// Include 取得する項目 +func (api *DiskAPI) Include(key string) *DiskAPI { + api.include(key) + return api +} + +// Exclude 除外する項目 +func (api *DiskAPI) Exclude(key string) *DiskAPI { + api.exclude(key) + return api +} + +// FilterBy 指定キーでのフィルター +func (api *DiskAPI) FilterBy(key string, value interface{}) *DiskAPI { + api.filterBy(key, value, false) + return api +} + +// FilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *DiskAPI) FilterMultiBy(key string, value interface{}) *DiskAPI { + api.filterBy(key, value, true) + return api +} + +// WithNameLike 名称条件 +func (api *DiskAPI) WithNameLike(name string) *DiskAPI { + return api.FilterBy("Name", name) +} + +// WithTag タグ条件 +func (api *DiskAPI) WithTag(tag string) *DiskAPI { + return api.FilterBy("Tags.Name", tag) +} + +// WithTags タグ(複数)条件 +func (api *DiskAPI) WithTags(tags []string) *DiskAPI { + return api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// WithSizeGib サイズ条件 +func (api *DiskAPI) WithSizeGib(size int) *DiskAPI { + api.FilterBy("SizeMB", size*1024) + return api +} + +// SortBy 指定キーでのソート +func (api *DiskAPI) SortBy(key string, reverse bool) *DiskAPI { + api.sortBy(key, reverse) + return api +} + +// SortByName 名称でのソート +func (api *DiskAPI) SortByName(reverse bool) *DiskAPI { + api.sortByName(reverse) + return api +} + +// SortBySize サイズでのソート +func (api *DiskAPI) SortBySize(reverse bool) *DiskAPI { + api.sortBy("SizeMB", reverse) + return api +} + +/************************************************ + To support fluent interface for Find() +************************************************/ + +// SetEmpty 検索条件のリセット +func (api *DiskAPI) SetEmpty() { + api.reset() +} + +// SetOffset オフセット +func (api *DiskAPI) SetOffset(offset int) { + api.offset(offset) +} + +// SetLimit リミット +func (api *DiskAPI) SetLimit(limit int) { + api.limit(limit) +} + +// SetInclude 取得する項目 +func (api *DiskAPI) SetInclude(key string) { + api.include(key) +} + +// SetExclude 除外する項目 +func (api *DiskAPI) SetExclude(key string) { + api.exclude(key) +} + +// SetFilterBy 指定キーでのフィルター +func (api *DiskAPI) SetFilterBy(key string, value interface{}) { + api.filterBy(key, value, false) +} + +// SetFilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *DiskAPI) SetFilterMultiBy(key string, value interface{}) { + api.filterBy(key, value, true) +} + +// SetNameLike 名称条件 +func (api *DiskAPI) SetNameLike(name string) { + api.FilterBy("Name", name) +} + +// SetTag タグ条件 +func (api *DiskAPI) SetTag(tag string) { + api.FilterBy("Tags.Name", tag) +} + +// SetTags タグ(複数)条件 +func (api *DiskAPI) SetTags(tags []string) { + api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// SetSizeGib サイズ条件 +func (api *DiskAPI) SetSizeGib(size int) { + api.FilterBy("SizeMB", size*1024) +} + +// SetSortBy 指定キーでのソート +func (api *DiskAPI) SetSortBy(key string, reverse bool) { + api.sortBy(key, reverse) +} + +// SetSortByName 名称でのソート +func (api *DiskAPI) SetSortByName(reverse bool) { + api.sortByName(reverse) +} + +// SetSortBySize サイズでのソート +func (api *DiskAPI) SetSortBySize(reverse bool) { + api.sortBy("SizeMB", reverse) +} + +/************************************************ + To support CRUD(Create/Read/Update/Delete) +************************************************/ + +// New 新規作成用パラメーター作成 +func (api *DiskAPI) New() *sacloud.Disk { + return sacloud.CreateNewDisk() +} + +//func (api *DiskAPI) Create(value *sacloud.Disk) (*sacloud.Disk, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.create(api.createRequest(value), res) +// }) +//} + +// Read 読み取り +func (api *DiskAPI) Read(id int64) (*sacloud.Disk, error) { + return api.request(func(res *sacloud.Response) error { + return api.read(id, nil, res) + }) +} + +// Update 更新 +func (api *DiskAPI) Update(id int64, value *sacloud.Disk) (*sacloud.Disk, error) { + return api.request(func(res *sacloud.Response) error { + return api.update(id, api.createRequest(value), res) + }) +} + +// Delete 削除 +func (api *DiskAPI) Delete(id int64) (*sacloud.Disk, error) { + return api.request(func(res *sacloud.Response) error { + return api.delete(id, nil, res) + }) +} + +/************************************************ + Inner functions +************************************************/ + +func (api *DiskAPI) setStateValue(setFunc func(*sacloud.Request)) *DiskAPI { + api.baseAPI.setStateValue(setFunc) + return api +} + +func (api *DiskAPI) request(f func(*sacloud.Response) error) (*sacloud.Disk, error) { + res := &sacloud.Response{} + err := f(res) + if err != nil { + return nil, err + } + return res.Disk, nil +} + +func (api *DiskAPI) createRequest(value *sacloud.Disk) *sacloud.Request { + req := &sacloud.Request{} + req.Disk = value + return req +} diff --git a/vendor/github.com/sacloud/libsacloud/api/dns.go b/vendor/github.com/sacloud/libsacloud/api/dns.go new file mode 100644 index 00000000..3483a835 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/dns.go @@ -0,0 +1,206 @@ +package api + +import ( + "encoding/json" + "github.com/sacloud/libsacloud/sacloud" + "strings" +) + +//HACK: さくらのAPI側仕様: CommonServiceItemsの内容によってJSONフォーマットが異なるため +// DNS/GSLB/シンプル監視それぞれでリクエスト/レスポンスデータ型を定義する。 + +// SearchDNSResponse DNS検索レスポンス +type SearchDNSResponse struct { + // Total 総件数 + Total int `json:",omitempty"` + // From ページング開始位置 + From int `json:",omitempty"` + // Count 件数 + Count int `json:",omitempty"` + // CommonServiceDNSItems DNSリスト + CommonServiceDNSItems []sacloud.DNS `json:"CommonServiceItems,omitempty"` +} +type dnsRequest struct { + CommonServiceDNSItem *sacloud.DNS `json:"CommonServiceItem,omitempty"` + From int `json:",omitempty"` + Count int `json:",omitempty"` + Sort []string `json:",omitempty"` + Filter map[string]interface{} `json:",omitempty"` + Exclude []string `json:",omitempty"` + Include []string `json:",omitempty"` +} +type dnsResponse struct { + *sacloud.ResultFlagValue + *sacloud.DNS `json:"CommonServiceItem,omitempty"` +} + +// DNSAPI DNS API +type DNSAPI struct { + *baseAPI +} + +// NewDNSAPI DNS API作成 +func NewDNSAPI(client *Client) *DNSAPI { + return &DNSAPI{ + &baseAPI{ + client: client, + FuncGetResourceURL: func() string { + return "commonserviceitem" + }, + FuncBaseSearchCondition: func() *sacloud.Request { + res := &sacloud.Request{} + res.AddFilter("Provider.Class", "dns") + return res + }, + }, + } +} + +// Find 検索 +func (api *DNSAPI) Find() (*SearchDNSResponse, error) { + + data, err := api.client.newRequest("GET", api.getResourceURL(), api.getSearchState()) + if err != nil { + return nil, err + } + var res SearchDNSResponse + if err := json.Unmarshal(data, &res); err != nil { + return nil, err + } + return &res, nil +} + +func (api *DNSAPI) request(f func(*dnsResponse) error) (*sacloud.DNS, error) { + res := &dnsResponse{} + err := f(res) + if err != nil { + return nil, err + } + return res.DNS, nil +} + +func (api *DNSAPI) createRequest(value *sacloud.DNS) *dnsRequest { + req := &dnsRequest{} + req.CommonServiceDNSItem = value + return req +} + +// Create 新規作成 +func (api *DNSAPI) Create(value *sacloud.DNS) (*sacloud.DNS, error) { + return api.request(func(res *dnsResponse) error { + return api.create(api.createRequest(value), res) + }) +} + +// New 新規作成用パラメーター作成 +func (api *DNSAPI) New(zoneName string) *sacloud.DNS { + return sacloud.CreateNewDNS(zoneName) +} + +// Read 読み取り +func (api *DNSAPI) Read(id int64) (*sacloud.DNS, error) { + return api.request(func(res *dnsResponse) error { + return api.read(id, nil, res) + }) +} + +// Update 更新 +func (api *DNSAPI) Update(id int64, value *sacloud.DNS) (*sacloud.DNS, error) { + return api.request(func(res *dnsResponse) error { + return api.update(id, api.createRequest(value), res) + }) +} + +// Delete 削除 +func (api *DNSAPI) Delete(id int64) (*sacloud.DNS, error) { + return api.request(func(res *dnsResponse) error { + return api.delete(id, nil, res) + }) +} + +// SetupDNSRecord DNSレコード作成 +func (api *DNSAPI) SetupDNSRecord(zoneName string, hostName string, ip string) ([]string, error) { + + dnsItem, err := api.findOrCreateBy(zoneName) + if err != nil { + return nil, err + } + + if strings.HasSuffix(hostName, zoneName) { + hostName = strings.Replace(hostName, zoneName, "", -1) + } + + dnsItem.Settings.DNS.AddDNSRecordSet(hostName, ip) + + res, err := api.updateDNSRecord(dnsItem) + if err != nil { + return nil, err + } + + if dnsItem.ID == sacloud.EmptyID { + return res.Status.NS, nil + } + + return nil, nil + +} + +// DeleteDNSRecord DNSレコード削除 +func (api *DNSAPI) DeleteDNSRecord(zoneName string, hostName string, ip string) error { + dnsItem, err := api.findOrCreateBy(zoneName) + if err != nil { + return err + } + dnsItem.Settings.DNS.DeleteDNSRecordSet(hostName, ip) + + if dnsItem.HasDNSRecord() { + _, err = api.updateDNSRecord(dnsItem) + if err != nil { + return err + } + + } else { + _, err = api.Delete(dnsItem.ID) + if err != nil { + return err + } + + } + return nil +} + +func (api *DNSAPI) findOrCreateBy(zoneName string) (*sacloud.DNS, error) { + + res, err := api.Reset().WithNameLike(zoneName).Limit(1).Find() + if err != nil { + return nil, err + } + + //すでに登録されている場合 + var dnsItem *sacloud.DNS + if res.Count > 0 { + dnsItem = &res.CommonServiceDNSItems[0] + } else { + dnsItem = sacloud.CreateNewDNS(zoneName) + } + + return dnsItem, nil +} + +func (api *DNSAPI) updateDNSRecord(dnsItem *sacloud.DNS) (*sacloud.DNS, error) { + + var item *sacloud.DNS + var err error + + if dnsItem.ID == sacloud.EmptyID { + item, err = api.Create(dnsItem) + } else { + item, err = api.Update(dnsItem.ID, dnsItem) + } + + if err != nil { + return nil, err + } + + return item, nil +} diff --git a/vendor/github.com/sacloud/libsacloud/api/dns_gen.go b/vendor/github.com/sacloud/libsacloud/api/dns_gen.go new file mode 100644 index 00000000..7ff419fc --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/dns_gen.go @@ -0,0 +1,238 @@ +package api + +/************************************************ + generated by IDE. for [DNSAPI] +************************************************/ + +import ( + "github.com/sacloud/libsacloud/sacloud" +) + +/************************************************ + To support fluent interface for Find() +************************************************/ + +// Reset 検索条件のリセット +func (api *DNSAPI) Reset() *DNSAPI { + api.reset() + return api +} + +// Offset オフセット +func (api *DNSAPI) Offset(offset int) *DNSAPI { + api.offset(offset) + return api +} + +// Limit リミット +func (api *DNSAPI) Limit(limit int) *DNSAPI { + api.limit(limit) + return api +} + +// Include 取得する項目 +func (api *DNSAPI) Include(key string) *DNSAPI { + api.include(key) + return api +} + +// Exclude 除外する項目 +func (api *DNSAPI) Exclude(key string) *DNSAPI { + api.exclude(key) + return api +} + +// FilterBy 指定キーでのフィルター +func (api *DNSAPI) FilterBy(key string, value interface{}) *DNSAPI { + api.filterBy(key, value, false) + return api +} + +// FilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *DNSAPI) FilterMultiBy(key string, value interface{}) *DNSAPI { + api.filterBy(key, value, true) + return api +} + +// WithNameLike 名称条件 +func (api *DNSAPI) WithNameLike(name string) *DNSAPI { + return api.FilterBy("Name", name) +} + +// WithTag タグ条件 +func (api *DNSAPI) WithTag(tag string) *DNSAPI { + return api.FilterBy("Tags.Name", tag) +} + +// WithTags タグ(複数)条件 +func (api *DNSAPI) WithTags(tags []string) *DNSAPI { + return api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *DNSAPI) WithSizeGib(size int) *DNSAPI { +// api.FilterBy("SizeMB", size*1024) +// return api +// } + +// func (api *DNSAPI) WithSharedScope() *DNSAPI { +// api.FilterBy("Scope", "shared") +// return api +// } + +// func (api *DNSAPI) WithUserScope() *DNSAPI { +// api.FilterBy("Scope", "user") +// return api +// } + +// SortBy 指定キーでのソート +func (api *DNSAPI) SortBy(key string, reverse bool) *DNSAPI { + api.sortBy(key, reverse) + return api +} + +// SortByName 名称でのソート +func (api *DNSAPI) SortByName(reverse bool) *DNSAPI { + api.sortByName(reverse) + return api +} + +// func (api *DNSAPI) SortBySize(reverse bool) *DNSAPI { +// api.sortBy("SizeMB", reverse) +// return api +// } + +/************************************************ + To support Setxxx interface for Find() +************************************************/ + +// SetEmpty 検索条件のリセット +func (api *DNSAPI) SetEmpty() { + api.reset() +} + +// SetOffset オフセット +func (api *DNSAPI) SetOffset(offset int) { + api.offset(offset) +} + +// SetLimit リミット +func (api *DNSAPI) SetLimit(limit int) { + api.limit(limit) +} + +// SetInclude 取得する項目 +func (api *DNSAPI) SetInclude(key string) { + api.include(key) +} + +// SetExclude 除外する項目 +func (api *DNSAPI) SetExclude(key string) { + api.exclude(key) +} + +// SetFilterBy 指定キーでのフィルター +func (api *DNSAPI) SetFilterBy(key string, value interface{}) { + api.filterBy(key, value, false) +} + +// SetFilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *DNSAPI) SetFilterMultiBy(key string, value interface{}) { + api.filterBy(key, value, true) +} + +// SetNameLike 名称条件 +func (api *DNSAPI) SetNameLike(name string) { + api.FilterBy("Name", name) +} + +// SetTag タグ条件 +func (api *DNSAPI) SetTag(tag string) { + api.FilterBy("Tags.Name", tag) +} + +// SetTags タグ(複数)条件 +func (api *DNSAPI) SetTags(tags []string) { + api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *DNSAPI) SetSizeGib(size int) { +// api.FilterBy("SizeMB", size*1024) +// } + +// func (api *DNSAPI) SetSharedScope() { +// api.FilterBy("Scope", "shared") +// } + +// func (api *DNSAPI) SetUserScope() { +// api.FilterBy("Scope", "user") +// } + +// SetSortBy 指定キーでのソート +func (api *DNSAPI) SetSortBy(key string, reverse bool) { + api.sortBy(key, reverse) +} + +// SetSortByName 名称でのソート +func (api *DNSAPI) SetSortByName(reverse bool) { + api.sortByName(reverse) +} + +// func (api *DNSAPI) SetSortBySize(reverse bool) { +// api.sortBy("SizeMB", reverse) +// } + +/************************************************ + To support CRUD(Create/Read/Update/Delete) +************************************************/ + +// func (api *DNSAPI) New() *sacloud.DNS { +// return &sacloud.DNS{} +// } + +// func (api *DNSAPI) Create(value *sacloud.DNS) (*sacloud.DNS, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.create(api.createRequest(value), res) +// }) +// } + +// func (api *DNSAPI) Read(id string) (*sacloud.DNS, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.read(id, nil, res) +// }) +// } + +// func (api *DNSAPI) Update(id string, value *sacloud.DNS) (*sacloud.DNS, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.update(id, api.createRequest(value), res) +// }) +// } + +// func (api *DNSAPI) Delete(id string) (*sacloud.DNS, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.delete(id, nil, res) +// }) +// } + +/************************************************ + Inner functions +************************************************/ + +func (api *DNSAPI) setStateValue(setFunc func(*sacloud.Request)) *DNSAPI { + api.baseAPI.setStateValue(setFunc) + return api +} + +//func (api *DNSAPI) request(f func(*sacloud.Response) error) (*sacloud.DNS, error) { +// res := &sacloud.Response{} +// err := f(res) +// if err != nil { +// return nil, err +// } +// return res.DNS, nil +//} +// +//func (api *DNSAPI) createRequest(value *sacloud.DNS) *dnsRequest { +// req := &dnsRequest{} +// req.CommonServiceDNSItem = value +// return req +//} diff --git a/vendor/github.com/sacloud/libsacloud/api/doc.go b/vendor/github.com/sacloud/libsacloud/api/doc.go new file mode 100644 index 00000000..2ec4e0eb --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/doc.go @@ -0,0 +1,176 @@ +// Package api is the Low Level APIs for maganing resources on SakuraCloud. +// +// さくらのクラウドでのリソース操作用の低レベルAPIです。 +// さくらのクラウドAPI呼び出しを行います。 +// +// Basic usage +// +// はじめにAPIクライアントを作成します。以降は作成したAPIクライアントを通じて各操作を行います。 +// +// APIクライアントの作成にはAPIトークン、APIシークレット、対象ゾーン情報が必要です。 +// +// あらかじめ、さくらのクラウド コントロールパネルにてAPIキーを発行しておいてください。 +// +// token := "PUT YOUR TOKEN" +// secret := "PUT YOUR SECRET" +// zone := "tk1a" +// +// // クライアントの作成 +// client := api.NewClient(token, secret, zone) +// +// Select target resource +// +// 操作対象のリソースごとにAPIクライアントのフィールドを用意しています。 +// 例えばサーバーの操作を行う場合はAPIクライアントの"Server"フィールドを通じて操作します。 +// +// フィールドの一覧は[type API]のドキュメントを参照してください。 +// +// // サーバーの検索の場合 +// client.Server.Find() +// +// // ディスクの検索の場合 +// client.Disk.Find() +// +// +// Find resource +// +// リソースの検索を行うには、条件を指定してFind()を呼び出します。 +// +// APIクライアントでは、検索条件の指定にFluent APIを採用しているため、メソッドチェーンで条件を指定できます。 +// +// // サーバーの検索 +// res, err := client.Server. +// WithNameLike("server name"). // サーバー名に"server name"が含まれる +// Offset(0). // 検索結果の位置0(先頭)から取得 +// Limit(5). // 5件取得 +// Include("Name"). // 結果にName列を含める +// Include("Description"). // 結果にDescription列を含める +// Find() // 検索実施 +// +// if err != nil { +// panic(err) +// } +// +// fmt.Printf("response: %#v", res.Servers) +// +// Create resource +// +// 新規作成用パラメーターを作成し、値を設定します。 +// その後APIクライアントのCreate()を呼び出します。 +// +// // スイッチの作成 +// param := client.Switch.New() // 新規作成用パラメーターの作成 +// param.Name = "example" // 値の設定(名前) +// param.Description = "example" // 値の設定(説明) +// sw, err := client.Switch.Create(param) // 作成 +// +// if err != nil { +// panic(err) +// } +// +// fmt.Printf("Created switch: %#v", sw) +// +// リソースの作成は非同期で行われます。 +// +// このため、サーバーやディスクなどの作成に時間がかかるリソースに対して +// Create()呼び出し直後に操作を行おうとした場合にエラーとなることがあります。 +// +// 必要に応じて適切なメソッドを呼び出し、リソースが適切な状態になるまで待機してください。 +// +// // パブリックアーカイブからディスク作成 +// archive, _ := client.Archive.FindLatestStableCentOS() +// // ディスクの作成 +// param := client.Disk.New() +// param.Name = "example" // 値の設定(名前) +// param.SetSourceArchive(archive.ID) // コピー元にCentOSパブリックアーカイブを指定 +// disk, err := client.Disk.Create(param) // 作成 +// +// if err != nil { +// panic(err) +// } +// +// // 作成完了まで待機 +// err = client.Disk.SleepWhileCopying(disk.ID, client.DefaultTimeoutDuration) +// +// // タイムアウト発生の場合errが返る +// if err != nil { +// panic(err) +// } +// +// fmt.Printf("Created disk: %#v", disk) +// +// Update resource +// +// APIクライアントのUpdate()メソッドを呼び出します。 +// +// req, err := client.Server.Find() +// if err != nil { +// panic(err) +// } +// server := &req.Servers[0] +// +// // 更新 +// server.Name = "update" // サーバー名を変更 +// server.AppendTag("example-tag") // タグを追加 +// updatedServer, err := client.Server.Update(server.ID, server) //更新実行 +// if err != nil { +// panic(err) +// } +// fmt.Printf("Updated server: %#v", updatedServer) +// +// 更新内容によってはあらかじめシャットダウンなどのリソースの操作が必要になる場合があります。 +// +// 詳細はさくらのクラウド ドキュメントを参照下さい。 +// http://cloud.sakura.ad.jp/document/ +// +// Delete resource +// +// APIクライアントのDeleteメソッドを呼び出します。 +// +// // 削除 +// deletedSwitch, err := client.Switch.Delete(sw.ID) +// if err != nil { +// panic(err) +// } +// fmt.Printf("Deleted switch: %#v", deletedSwitch) +// +// 対象リソースによってはあらかじめシャットダウンや切断などの操作が必要になる場合があります。 +// +// 詳細はさくらのクラウド ドキュメントを参照下さい。 +// http://cloud.sakura.ad.jp/document/ +// +// PowerManagement +// +// サーバーやアプライアンスなどの電源操作もAPIを通じて行えます。 +// +// // 起動 +// _, err = client.Server.Boot(server.ID) +// if err != nil { +// panic(err) +// } +// +// // 起動完了まで待機 +// err = client.Server.SleepUntilUp(server.ID, client.DefaultTimeoutDuration) +// +// // シャットダウン +// _, err = client.Server.Shutdown(server.ID) // gracefulシャットダウン +// +// if err != nil { +// panic(err) +// } +// +// // ダウンまで待機 +// err = client.Server.SleepUntilDown(server.ID, client.DefaultTimeoutDuration) +// +// 電源関連のAPI呼び出しは非同期で行われます。 +// +// 必要に応じて適切なメソッドを呼び出し、リソースが適切な状態になるまで待機してください。 +// +// Other +// +// APIクライアントでは開発時のデバッグ出力が可能です。 +// 以下のようにTraceModeフラグをtrueに設定した上でAPI呼び出しを行うと、標準出力へトレースログが出力されます。 +// +// client.TraceMode = true +// +package api diff --git a/vendor/github.com/sacloud/libsacloud/api/error.go b/vendor/github.com/sacloud/libsacloud/api/error.go new file mode 100644 index 00000000..5e0ca2a8 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/error.go @@ -0,0 +1,79 @@ +package api + +import ( + "fmt" + "github.com/sacloud/libsacloud/sacloud" +) + +// Error APIコール時のエラー情報 +type Error interface { + // errorインターフェースを内包 + error + + // エラー発生時のレスポンスコード + ResponseCode() int + + // エラーコード + Code() string + + // エラー発生時のメッセージ + Message() string + + // エラー追跡用シリアルコード + Serial() string + + // エラー(オリジナル) + OrigErr() *sacloud.ResultErrorValue +} + +// NewError APIコール時のエラー情報 +func NewError(responseCode int, err *sacloud.ResultErrorValue) Error { + return &apiError{ + responseCode: responseCode, + origErr: err, + } +} + +type apiError struct { + responseCode int + origErr *sacloud.ResultErrorValue +} + +// Error errorインターフェース +func (e *apiError) Error() string { + return fmt.Sprintf("Error in response: %#v", e.origErr) +} + +// ResponseCode エラー発生時のレスポンスコード +func (e *apiError) ResponseCode() int { + return e.responseCode +} + +// Code エラーコード +func (e *apiError) Code() string { + if e.origErr != nil { + return e.origErr.ErrorCode + } + return "" +} + +// Message エラー発生時のメッセージ( +func (e *apiError) Message() string { + if e.origErr != nil { + return e.origErr.ErrorMessage + } + return "" +} + +// Serial エラー追跡用シリアルコード +func (e *apiError) Serial() string { + if e.origErr != nil { + return e.origErr.Serial + } + return "" +} + +// OrigErr エラー(オリジナル) +func (e *apiError) OrigErr() *sacloud.ResultErrorValue { + return e.origErr +} diff --git a/vendor/github.com/sacloud/libsacloud/api/gslb.go b/vendor/github.com/sacloud/libsacloud/api/gslb.go new file mode 100644 index 00000000..bce4cc2d --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/gslb.go @@ -0,0 +1,202 @@ +package api + +import ( + "encoding/json" + // "strings" + "github.com/sacloud/libsacloud/sacloud" +) + +//HACK: さくらのAPI側仕様: CommonServiceItemsの内容によってJSONフォーマットが異なるため +// DNS/GSLB/シンプル監視それぞれでリクエスト/レスポンスデータ型を定義する。 + +// SearchGSLBResponse GSLB検索レスポンス +type SearchGSLBResponse struct { + // Total 総件数 + Total int `json:",omitempty"` + // From ページング開始位置 + From int `json:",omitempty"` + // Count 件数 + Count int `json:",omitempty"` + // CommonServiceGSLBItems GSLBリスト + CommonServiceGSLBItems []sacloud.GSLB `json:"CommonServiceItems,omitempty"` +} + +type gslbRequest struct { + CommonServiceGSLBItem *sacloud.GSLB `json:"CommonServiceItem,omitempty"` + From int `json:",omitempty"` + Count int `json:",omitempty"` + Sort []string `json:",omitempty"` + Filter map[string]interface{} `json:",omitempty"` + Exclude []string `json:",omitempty"` + Include []string `json:",omitempty"` +} + +type gslbResponse struct { + *sacloud.ResultFlagValue + *sacloud.GSLB `json:"CommonServiceItem,omitempty"` +} + +// GSLBAPI GSLB API +type GSLBAPI struct { + *baseAPI +} + +// NewGSLBAPI GSLB API作成 +func NewGSLBAPI(client *Client) *GSLBAPI { + return &GSLBAPI{ + &baseAPI{ + client: client, + FuncGetResourceURL: func() string { + return "commonserviceitem" + }, + FuncBaseSearchCondition: func() *sacloud.Request { + res := &sacloud.Request{} + res.AddFilter("Provider.Class", "gslb") + return res + }, + }, + } +} + +// Find 検索 +func (api *GSLBAPI) Find() (*SearchGSLBResponse, error) { + + data, err := api.client.newRequest("GET", api.getResourceURL(), api.getSearchState()) + if err != nil { + return nil, err + } + var res SearchGSLBResponse + if err := json.Unmarshal(data, &res); err != nil { + return nil, err + } + return &res, nil +} + +func (api *GSLBAPI) request(f func(*gslbResponse) error) (*sacloud.GSLB, error) { + res := &gslbResponse{} + err := f(res) + if err != nil { + return nil, err + } + return res.GSLB, nil +} + +func (api *GSLBAPI) createRequest(value *sacloud.GSLB) *gslbResponse { + return &gslbResponse{GSLB: value} +} + +// New 新規作成用パラメーター作成 +func (api *GSLBAPI) New(name string) *sacloud.GSLB { + return sacloud.CreateNewGSLB(name) +} + +// Create 新規作成 +func (api *GSLBAPI) Create(value *sacloud.GSLB) (*sacloud.GSLB, error) { + return api.request(func(res *gslbResponse) error { + return api.create(api.createRequest(value), res) + }) +} + +// Read 読み取り +func (api *GSLBAPI) Read(id int64) (*sacloud.GSLB, error) { + return api.request(func(res *gslbResponse) error { + return api.read(id, nil, res) + }) +} + +// Update 更新 +func (api *GSLBAPI) Update(id int64, value *sacloud.GSLB) (*sacloud.GSLB, error) { + return api.request(func(res *gslbResponse) error { + return api.update(id, api.createRequest(value), res) + }) +} + +// Delete 削除 +func (api *GSLBAPI) Delete(id int64) (*sacloud.GSLB, error) { + return api.request(func(res *gslbResponse) error { + return api.delete(id, nil, res) + }) +} + +// SetupGSLBRecord GSLB配下にサーバー追加 +func (api *GSLBAPI) SetupGSLBRecord(gslbName string, ip string) ([]string, error) { + + gslbItem, err := api.findOrCreateBy(gslbName) + + if err != nil { + return nil, err + } + gslbItem.Settings.GSLB.AddServer(ip) + res, err := api.updateGSLBServers(gslbItem) + if err != nil { + return nil, err + } + + if gslbItem.ID == sacloud.EmptyID { + return []string{res.Status.FQDN}, nil + } + return nil, nil + +} + +// DeleteGSLBServer GSLB配下のサーバー削除 +func (api *GSLBAPI) DeleteGSLBServer(gslbName string, ip string) error { + gslbItem, err := api.findOrCreateBy(gslbName) + if err != nil { + return err + } + gslbItem.Settings.GSLB.DeleteServer(ip) + + if gslbItem.HasGSLBServer() { + _, err = api.updateGSLBServers(gslbItem) + if err != nil { + return err + } + + } else { + _, err = api.Delete(gslbItem.ID) + if err != nil { + return err + } + + } + return nil +} + +func (api *GSLBAPI) findOrCreateBy(gslbName string) (*sacloud.GSLB, error) { + + req := &sacloud.Request{} + req.AddFilter("Name", gslbName) + res, err := api.Find() + if err != nil { + return nil, err + } + + //すでに登録されている場合 + var gslbItem *sacloud.GSLB + if res.Count > 0 { + gslbItem = &res.CommonServiceGSLBItems[0] + } else { + gslbItem = sacloud.CreateNewGSLB(gslbName) + } + + return gslbItem, nil +} + +func (api *GSLBAPI) updateGSLBServers(gslbItem *sacloud.GSLB) (*sacloud.GSLB, error) { + + var item *sacloud.GSLB + var err error + + if gslbItem.ID == sacloud.EmptyID { + item, err = api.Create(gslbItem) + } else { + item, err = api.Update(gslbItem.ID, gslbItem) + } + + if err != nil { + return nil, err + } + + return item, nil +} diff --git a/vendor/github.com/sacloud/libsacloud/api/gslb_gen.go b/vendor/github.com/sacloud/libsacloud/api/gslb_gen.go new file mode 100644 index 00000000..2ea80d31 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/gslb_gen.go @@ -0,0 +1,238 @@ +package api + +/************************************************ + generated by IDE. for [GSLBAPI] +************************************************/ + +import ( + "github.com/sacloud/libsacloud/sacloud" +) + +/************************************************ + To support fluent interface for Find() +************************************************/ + +// Reset 検索条件のリセット +func (api *GSLBAPI) Reset() *GSLBAPI { + api.reset() + return api +} + +// Offset オフセット +func (api *GSLBAPI) Offset(offset int) *GSLBAPI { + api.offset(offset) + return api +} + +// Limit リミット +func (api *GSLBAPI) Limit(limit int) *GSLBAPI { + api.limit(limit) + return api +} + +// Include 取得する項目 +func (api *GSLBAPI) Include(key string) *GSLBAPI { + api.include(key) + return api +} + +// Exclude 除外する項目 +func (api *GSLBAPI) Exclude(key string) *GSLBAPI { + api.exclude(key) + return api +} + +// FilterBy 指定キーでのフィルター +func (api *GSLBAPI) FilterBy(key string, value interface{}) *GSLBAPI { + api.filterBy(key, value, false) + return api +} + +// FilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *GSLBAPI) FilterMultiBy(key string, value interface{}) *GSLBAPI { + api.filterBy(key, value, true) + return api +} + +// WithNameLike 名称条件 +func (api *GSLBAPI) WithNameLike(name string) *GSLBAPI { + return api.FilterBy("Name", name) +} + +// WithTag タグ条件 +func (api *GSLBAPI) WithTag(tag string) *GSLBAPI { + return api.FilterBy("Tags.Name", tag) +} + +// WithTags タグ(複数)条件 +func (api *GSLBAPI) WithTags(tags []string) *GSLBAPI { + return api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *GSLBAPI) WithSizeGib(size int) *GSLBAPI { +// api.FilterBy("SizeMB", size*1024) +// return api +// } + +// func (api *GSLBAPI) WithSharedScope() *GSLBAPI { +// api.FilterBy("Scope", "shared") +// return api +// } + +// func (api *GSLBAPI) WithUserScope() *GSLBAPI { +// api.FilterBy("Scope", "user") +// return api +// } + +// SortBy 指定キーでのソート +func (api *GSLBAPI) SortBy(key string, reverse bool) *GSLBAPI { + api.sortBy(key, reverse) + return api +} + +// SortByName 名称でのソート +func (api *GSLBAPI) SortByName(reverse bool) *GSLBAPI { + api.sortByName(reverse) + return api +} + +// func (api *GSLBAPI) SortBySize(reverse bool) *GSLBAPI { +// api.sortBy("SizeMB", reverse) +// return api +// } + +/************************************************ + To support Setxxx interface for Find() +************************************************/ + +// SetEmpty 検索条件のリセット +func (api *GSLBAPI) SetEmpty() { + api.reset() +} + +// SetOffset オフセット +func (api *GSLBAPI) SetOffset(offset int) { + api.offset(offset) +} + +// SetLimit リミット +func (api *GSLBAPI) SetLimit(limit int) { + api.limit(limit) +} + +// SetInclude 取得する項目 +func (api *GSLBAPI) SetInclude(key string) { + api.include(key) +} + +// SetExclude 除外する項目 +func (api *GSLBAPI) SetExclude(key string) { + api.exclude(key) +} + +// SetFilterBy 指定キーでのフィルター +func (api *GSLBAPI) SetFilterBy(key string, value interface{}) { + api.filterBy(key, value, false) +} + +// SetFilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *GSLBAPI) SetFilterMultiBy(key string, value interface{}) { + api.filterBy(key, value, true) +} + +// SetNameLike 名称条件 +func (api *GSLBAPI) SetNameLike(name string) { + api.FilterBy("Name", name) +} + +// SetTag タグ条件 +func (api *GSLBAPI) SetTag(tag string) { + api.FilterBy("Tags.Name", tag) +} + +// SetTags タグ(複数)条件 +func (api *GSLBAPI) SetTags(tags []string) { + api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *GSLBAPI) SetSizeGib(size int) { +// api.FilterBy("SizeMB", size*1024) +// } + +// func (api *GSLBAPI) SetSharedScope() { +// api.FilterBy("Scope", "shared") +// } + +// func (api *GSLBAPI) SetUserScope() { +// api.FilterBy("Scope", "user") +// } + +// SetSortBy 指定キーでのソート +func (api *GSLBAPI) SetSortBy(key string, reverse bool) { + api.sortBy(key, reverse) +} + +// SetSortByName 名称でのソート +func (api *GSLBAPI) SetSortByName(reverse bool) { + api.sortByName(reverse) +} + +// func (api *GSLBAPI) SetSortBySize(reverse bool) { +// api.sortBy("SizeMB", reverse) +// } + +/************************************************ + To support CRUD(Create/Read/Update/Delete) +************************************************/ + +// func (api *GSLBAPI) New() *sacloud.GSLB { +// return &sacloud.GSLB{} +// } + +// func (api *GSLBAPI) Create(value *sacloud.GSLB) (*sacloud.GSLB, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.create(api.createRequest(value), res) +// }) +// } + +// func (api *GSLBAPI) Read(id string) (*sacloud.GSLB, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.read(id, nil, res) +// }) +// } + +// func (api *GSLBAPI) Update(id string, value *sacloud.GSLB) (*sacloud.GSLB, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.update(id, api.createRequest(value), res) +// }) +// } + +// func (api *GSLBAPI) Delete(id string) (*sacloud.GSLB, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.delete(id, nil, res) +// }) +// } + +/************************************************ + Inner functions +************************************************/ + +func (api *GSLBAPI) setStateValue(setFunc func(*sacloud.Request)) *GSLBAPI { + api.baseAPI.setStateValue(setFunc) + return api +} + +//func (api *GSLBAPI) request(f func(*sacloud.Response) error) (*sacloud.GSLB, error) { +// res := &sacloud.Response{} +// err := f(res) +// if err != nil { +// return nil, err +// } +// return res.GSLB, nil +//} +// +//func (api *GSLBAPI) createRequest(value *sacloud.GSLB) *sacloud.Request { +// req := &sacloud.Request{} +// req.GSLB = value +// return req +//} diff --git a/vendor/github.com/sacloud/libsacloud/api/icon.go b/vendor/github.com/sacloud/libsacloud/api/icon.go new file mode 100644 index 00000000..db584c8c --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/icon.go @@ -0,0 +1,31 @@ +package api + +import "github.com/sacloud/libsacloud/sacloud" + +// IconAPI アイコンAPI +type IconAPI struct { + *baseAPI +} + +// NewIconAPI アイコンAPI作成 +func NewIconAPI(client *Client) *IconAPI { + return &IconAPI{ + &baseAPI{ + client: client, + FuncGetResourceURL: func() string { + return "icon" + }, + }, + } +} + +// GetImage アイコン画像データ(BASE64文字列)取得 +func (api *IconAPI) GetImage(id int64, size string) (*sacloud.Image, error) { + + res := &sacloud.Response{} + err := api.read(id, map[string]string{"Size": size}, res) + if err != nil { + return nil, err + } + return res.Image, nil +} diff --git a/vendor/github.com/sacloud/libsacloud/api/icon_gen.go b/vendor/github.com/sacloud/libsacloud/api/icon_gen.go new file mode 100644 index 00000000..38546b80 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/icon_gen.go @@ -0,0 +1,247 @@ +package api + +/************************************************ + generated by IDE. for [IconAPI] +************************************************/ + +import ( + "github.com/sacloud/libsacloud/sacloud" +) + +/************************************************ + To support fluent interface for Find() +************************************************/ + +// Reset 検索条件のリセット +func (api *IconAPI) Reset() *IconAPI { + api.reset() + return api +} + +// Offset オフセット +func (api *IconAPI) Offset(offset int) *IconAPI { + api.offset(offset) + return api +} + +// Limit リミット +func (api *IconAPI) Limit(limit int) *IconAPI { + api.limit(limit) + return api +} + +// Include 取得する項目 +func (api *IconAPI) Include(key string) *IconAPI { + api.include(key) + return api +} + +// Exclude 除外する項目 +func (api *IconAPI) Exclude(key string) *IconAPI { + api.exclude(key) + return api +} + +// FilterBy 指定キーでのフィルター +func (api *IconAPI) FilterBy(key string, value interface{}) *IconAPI { + api.filterBy(key, value, false) + return api +} + +// FilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *IconAPI) FilterMultiBy(key string, value interface{}) *IconAPI { + api.filterBy(key, value, true) + return api +} + +// WithNameLike 名称条件 +func (api *IconAPI) WithNameLike(name string) *IconAPI { + return api.FilterBy("Name", name) +} + +// WithTag タグ条件 +func (api *IconAPI) WithTag(tag string) *IconAPI { + return api.FilterBy("Tags.Name", tag) +} + +// WithTags タグ(複数)条件 +func (api *IconAPI) WithTags(tags []string) *IconAPI { + return api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *IconAPI) WithSizeGib(size int) *IconAPI { +// api.FilterBy("SizeMB", size*1024) +// return api +// } + +// WithSharedScope 公開スコープ条件 +func (api *IconAPI) WithSharedScope() *IconAPI { + api.FilterBy("Scope", "shared") + return api +} + +// WithUserScope ユーザースコープ条件 +func (api *IconAPI) WithUserScope() *IconAPI { + api.FilterBy("Scope", "user") + return api +} + +// SortBy 指定キーでのソート +func (api *IconAPI) SortBy(key string, reverse bool) *IconAPI { + api.sortBy(key, reverse) + return api +} + +// SortByName 名称でのソート +func (api *IconAPI) SortByName(reverse bool) *IconAPI { + api.sortByName(reverse) + return api +} + +// func (api *IconAPI) SortBySize(reverse bool) *IconAPI { +// api.sortBy("SizeMB", reverse) +// return api +// } + +/************************************************ + To support Setxxx interface for Find() +************************************************/ + +// SetEmpty 検索条件のリセット +func (api *IconAPI) SetEmpty() { + api.reset() +} + +// SetOffset オフセット +func (api *IconAPI) SetOffset(offset int) { + api.offset(offset) +} + +// SetLimit リミット +func (api *IconAPI) SetLimit(limit int) { + api.limit(limit) +} + +// SetInclude 取得する項目 +func (api *IconAPI) SetInclude(key string) { + api.include(key) +} + +// SetExclude 除外する項目 +func (api *IconAPI) SetExclude(key string) { + api.exclude(key) +} + +// SetFilterBy 指定キーでのフィルター +func (api *IconAPI) SetFilterBy(key string, value interface{}) { + api.filterBy(key, value, false) +} + +// SetFilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *IconAPI) SetFilterMultiBy(key string, value interface{}) { + api.filterBy(key, value, true) +} + +// SetNameLike 名称条件 +func (api *IconAPI) SetNameLike(name string) { + api.FilterBy("Name", name) +} + +// SetTag タグ条件 +func (api *IconAPI) SetTag(tag string) { + api.FilterBy("Tags.Name", tag) +} + +// SetTags タグ(複数)条件 +func (api *IconAPI) SetTags(tags []string) { + api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *IconAPI) SetSizeGib(size int) { +// api.FilterBy("SizeMB", size*1024) +// } + +// SetSharedScope 公開スコープ条件 +func (api *IconAPI) SetSharedScope() { + api.FilterBy("Scope", "shared") +} + +// SetUserScope ユーザースコープ条件 +func (api *IconAPI) SetUserScope() { + api.FilterBy("Scope", "user") +} + +// SetSortBy 指定キーでのソート +func (api *IconAPI) SetSortBy(key string, reverse bool) { + api.sortBy(key, reverse) +} + +// SetSortByName 名称でのソート +func (api *IconAPI) SetSortByName(reverse bool) { + api.sortByName(reverse) +} + +// func (api *IconAPI) SortBySize(reverse bool) { +// api.sortBy("SizeMB", reverse) +// } + +/************************************************ + To support CRUD(Create/Read/Update/Delete) +************************************************/ + +// New 新規作成用パラメーター作成 +func (api *IconAPI) New() *sacloud.Icon { + return &sacloud.Icon{} +} + +// Create 新規作成 +func (api *IconAPI) Create(value *sacloud.Icon) (*sacloud.Icon, error) { + return api.request(func(res *sacloud.Response) error { + return api.create(api.createRequest(value), res) + }) +} + +// Read 読み取り +func (api *IconAPI) Read(id int64) (*sacloud.Icon, error) { + return api.request(func(res *sacloud.Response) error { + return api.read(id, nil, res) + }) +} + +// Update 更新 +func (api *IconAPI) Update(id int64, value *sacloud.Icon) (*sacloud.Icon, error) { + return api.request(func(res *sacloud.Response) error { + return api.update(id, api.createRequest(value), res) + }) +} + +// Delete 削除 +func (api *IconAPI) Delete(id int64) (*sacloud.Icon, error) { + return api.request(func(res *sacloud.Response) error { + return api.delete(id, nil, res) + }) +} + +/************************************************ + Inner functions +************************************************/ + +func (api *IconAPI) setStateValue(setFunc func(*sacloud.Request)) *IconAPI { + api.baseAPI.setStateValue(setFunc) + return api +} + +func (api *IconAPI) request(f func(*sacloud.Response) error) (*sacloud.Icon, error) { + res := &sacloud.Response{} + err := f(res) + if err != nil { + return nil, err + } + return res.Icon, nil +} + +func (api *IconAPI) createRequest(value *sacloud.Icon) *sacloud.Request { + req := &sacloud.Request{} + req.Icon = value + return req +} diff --git a/vendor/github.com/sacloud/libsacloud/api/interface.go b/vendor/github.com/sacloud/libsacloud/api/interface.go new file mode 100644 index 00000000..21282c6c --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/interface.go @@ -0,0 +1,83 @@ +package api + +import ( + "fmt" + "github.com/sacloud/libsacloud/sacloud" +) + +// InterfaceAPI インターフェースAPI +type InterfaceAPI struct { + *baseAPI +} + +// NewInterfaceAPI インターフェースAPI作成 +func NewInterfaceAPI(client *Client) *InterfaceAPI { + return &InterfaceAPI{ + &baseAPI{ + client: client, + FuncGetResourceURL: func() string { + return "interface" + }, + }, + } +} + +// CreateAndConnectToServer 新規作成しサーバーへ接続する +func (api *InterfaceAPI) CreateAndConnectToServer(serverID int64) (*sacloud.Interface, error) { + iface := api.New() + iface.Server = &sacloud.Server{ + // Resource + Resource: &sacloud.Resource{ID: serverID}, + } + return api.Create(iface) +} + +// ConnectToSwitch スイッチへ接続する +func (api *InterfaceAPI) ConnectToSwitch(interfaceID int64, switchID int64) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/to/switch/%d", api.getResourceURL(), interfaceID, switchID) + ) + return api.modify(method, uri, nil) +} + +// ConnectToSharedSegment 共有セグメントへ接続する +func (api *InterfaceAPI) ConnectToSharedSegment(interfaceID int64) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/to/switch/shared", api.getResourceURL(), interfaceID) + ) + return api.modify(method, uri, nil) +} + +// DisconnectFromSwitch スイッチと切断する +func (api *InterfaceAPI) DisconnectFromSwitch(interfaceID int64) (bool, error) { + var ( + method = "DELETE" + uri = fmt.Sprintf("%s/%d/to/switch", api.getResourceURL(), interfaceID) + ) + return api.modify(method, uri, nil) +} + +// Monitor アクティビティーモニター取得 +func (api *InterfaceAPI) Monitor(id int64, body *sacloud.ResourceMonitorRequest) (*sacloud.MonitorValues, error) { + return api.baseAPI.monitor(id, body) +} + +// ConnectToPacketFilter パケットフィルター適用 +func (api *InterfaceAPI) ConnectToPacketFilter(interfaceID int64, packetFilterID int64) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("/%s/%d/to/packetfilter/%d", api.getResourceURL(), interfaceID, packetFilterID) + ) + return api.modify(method, uri, nil) +} + +// DisconnectFromPacketFilter パケットフィルター切断 +func (api *InterfaceAPI) DisconnectFromPacketFilter(interfaceID int64) (bool, error) { + var ( + method = "DELETE" + uri = fmt.Sprintf("/%s/%d/to/packetfilter", api.getResourceURL(), interfaceID) + ) + return api.modify(method, uri, nil) +} diff --git a/vendor/github.com/sacloud/libsacloud/api/interface_gen.go b/vendor/github.com/sacloud/libsacloud/api/interface_gen.go new file mode 100644 index 00000000..81bc2425 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/interface_gen.go @@ -0,0 +1,243 @@ +package api + +/************************************************ + generated by IDE. for [InterfaceAPI] +************************************************/ + +import ( + "github.com/sacloud/libsacloud/sacloud" +) + +/************************************************ + To support fluent interface for Find() +************************************************/ + +// Reset 検索条件のリセット +func (api *InterfaceAPI) Reset() *InterfaceAPI { + api.reset() + return api +} + +// Offset オフセット +func (api *InterfaceAPI) Offset(offset int) *InterfaceAPI { + api.offset(offset) + return api +} + +// Limit リミット +func (api *InterfaceAPI) Limit(limit int) *InterfaceAPI { + api.limit(limit) + return api +} + +// Include 取得する項目 +func (api *InterfaceAPI) Include(key string) *InterfaceAPI { + api.include(key) + return api +} + +// Exclude 除外する項目 +func (api *InterfaceAPI) Exclude(key string) *InterfaceAPI { + api.exclude(key) + return api +} + +// FilterBy 指定キーでのフィルター +func (api *InterfaceAPI) FilterBy(key string, value interface{}) *InterfaceAPI { + api.filterBy(key, value, false) + return api +} + +// FilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *InterfaceAPI) FilterMultiBy(key string, value interface{}) *InterfaceAPI { + api.filterBy(key, value, true) + return api +} + +// WithNameLike 名称条件 +func (api *InterfaceAPI) WithNameLike(name string) *InterfaceAPI { + return api.FilterBy("Name", name) +} + +// WithTag タグ条件 +func (api *InterfaceAPI) WithTag(tag string) *InterfaceAPI { + return api.FilterBy("Tags.Name", tag) +} + +// WithTags タグ(複数)条件 +func (api *InterfaceAPI) WithTags(tags []string) *InterfaceAPI { + return api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *InterfaceAPI) WithSizeGib(size int) *InterfaceAPI { +// api.FilterBy("SizeMB", size*1024) +// return api +// } + +// func (api *InterfaceAPI) WithSharedScope() *InterfaceAPI { +// api.FilterBy("Scope", "shared") +// return api +// } + +// func (api *InterfaceAPI) WithUserScope() *InterfaceAPI { +// api.FilterBy("Scope", "user") +// return api +// } + +// SortBy 指定キーでのソート +func (api *InterfaceAPI) SortBy(key string, reverse bool) *InterfaceAPI { + api.sortBy(key, reverse) + return api +} + +// SortByName 名称でのソート +func (api *InterfaceAPI) SortByName(reverse bool) *InterfaceAPI { + api.sortByName(reverse) + return api +} + +// func (api *InterfaceAPI) SortBySize(reverse bool) *InterfaceAPI { +// api.sortBy("SizeMB", reverse) +// return api +// } + +/************************************************ + To support Setxxx interface for Find() +************************************************/ + +// SetEmpty 検索条件のリセット +func (api *InterfaceAPI) SetEmpty() { + api.reset() +} + +// SetOffset オフセット +func (api *InterfaceAPI) SetOffset(offset int) { + api.offset(offset) +} + +// SetLimit リミット +func (api *InterfaceAPI) SetLimit(limit int) { + api.limit(limit) +} + +// SetInclude 取得する項目 +func (api *InterfaceAPI) SetInclude(key string) { + api.include(key) +} + +// SetExclude 除外する項目 +func (api *InterfaceAPI) SetExclude(key string) { + api.exclude(key) +} + +// SetFilterBy 指定キーでのフィルター +func (api *InterfaceAPI) SetFilterBy(key string, value interface{}) { + api.filterBy(key, value, false) +} + +// SetFilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *InterfaceAPI) SetFilterMultiBy(key string, value interface{}) { + api.filterBy(key, value, true) +} + +// SetNameLike 名称条件 +func (api *InterfaceAPI) SetNameLike(name string) { + api.FilterBy("Name", name) +} + +// SetTag タグ条件 +func (api *InterfaceAPI) SetTag(tag string) { + api.FilterBy("Tags.Name", tag) +} + +// SetTags タグ(複数)条件 +func (api *InterfaceAPI) SetTags(tags []string) { + api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *InterfaceAPI) SetSizeGib(size int) { +// api.FilterBy("SizeMB", size*1024) +// } + +// func (api *InterfaceAPI) SetSharedScope() { +// api.FilterBy("Scope", "shared") +// } + +// func (api *InterfaceAPI) SetUserScope() { +// api.FilterBy("Scope", "user") +// } + +// SetSortBy 指定キーでのソート +func (api *InterfaceAPI) SetSortBy(key string, reverse bool) { + api.sortBy(key, reverse) +} + +// SetSortByName 名称でのソート +func (api *InterfaceAPI) SetSortByName(reverse bool) { + api.sortByName(reverse) +} + +// func (api *InterfaceAPI) SetSortBySize(reverse bool) { +// api.sortBy("SizeMB", reverse) +// } + +/************************************************ + To support CRUD(Create/Read/Update/Delete) +************************************************/ + +// New 新規作成用パラメーター作成 +func (api *InterfaceAPI) New() *sacloud.Interface { + return &sacloud.Interface{} +} + +// Create 新規作成 +func (api *InterfaceAPI) Create(value *sacloud.Interface) (*sacloud.Interface, error) { + return api.request(func(res *sacloud.Response) error { + return api.create(api.createRequest(value), res) + }) +} + +// Read 読み取り +func (api *InterfaceAPI) Read(id int64) (*sacloud.Interface, error) { + return api.request(func(res *sacloud.Response) error { + return api.read(id, nil, res) + }) +} + +// Update 更新 +func (api *InterfaceAPI) Update(id int64, value *sacloud.Interface) (*sacloud.Interface, error) { + return api.request(func(res *sacloud.Response) error { + return api.update(id, api.createRequest(value), res) + }) +} + +// Delete 削除 +func (api *InterfaceAPI) Delete(id int64) (*sacloud.Interface, error) { + return api.request(func(res *sacloud.Response) error { + return api.delete(id, nil, res) + }) +} + +/************************************************ + Inner functions +************************************************/ + +func (api *InterfaceAPI) setStateValue(setFunc func(*sacloud.Request)) *InterfaceAPI { + api.baseAPI.setStateValue(setFunc) + return api +} + +func (api *InterfaceAPI) request(f func(*sacloud.Response) error) (*sacloud.Interface, error) { + res := &sacloud.Response{} + err := f(res) + if err != nil { + return nil, err + } + return res.Interface, nil +} + +func (api *InterfaceAPI) createRequest(value *sacloud.Interface) *sacloud.Request { + req := &sacloud.Request{} + req.Interface = value + return req +} diff --git a/vendor/github.com/sacloud/libsacloud/api/internet.go b/vendor/github.com/sacloud/libsacloud/api/internet.go new file mode 100644 index 00000000..01513414 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/internet.go @@ -0,0 +1,143 @@ +package api + +import ( + "fmt" + "github.com/sacloud/libsacloud/sacloud" + "time" +) + +// InternetAPI ルーターAPI +type InternetAPI struct { + *baseAPI +} + +// NewInternetAPI ルーターAPI作成 +func NewInternetAPI(client *Client) *InternetAPI { + return &InternetAPI{ + &baseAPI{ + client: client, + FuncGetResourceURL: func() string { + return "internet" + }, + }, + } +} + +// UpdateBandWidth 帯域幅更新 +func (api *InternetAPI) UpdateBandWidth(id int64, bandWidth int) (*sacloud.Internet, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/bandwidth", api.getResourceURL(), id) + body = &sacloud.Request{} + ) + body.Internet = &sacloud.Internet{BandWidthMbps: bandWidth} + + return api.request(func(res *sacloud.Response) error { + return api.baseAPI.request(method, uri, body, res) + }) +} + +// AddSubnet IPアドレスブロックの追加割り当て +func (api *InternetAPI) AddSubnet(id int64, nwMaskLen int, nextHop string) (*sacloud.Subnet, error) { + var ( + method = "POST" + uri = fmt.Sprintf("%s/%d/subnet", api.getResourceURL(), id) + ) + body := &map[string]interface{}{ + "NetworkMaskLen": nwMaskLen, + "NextHop": nextHop, + } + + res := &sacloud.Response{} + err := api.baseAPI.request(method, uri, body, res) + if err != nil { + return nil, err + } + return res.Subnet, nil +} + +// UpdateSubnet IPアドレスブロックの更新 +func (api *InternetAPI) UpdateSubnet(id int64, subnetID int64, nextHop string) (*sacloud.Subnet, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/subnet/%d", api.getResourceURL(), id, subnetID) + ) + body := &map[string]interface{}{ + "NextHop": nextHop, + } + + res := &sacloud.Response{} + err := api.baseAPI.request(method, uri, body, res) + if err != nil { + return nil, err + } + return res.Subnet, nil +} + +// DeleteSubnet IPアドレスブロックの削除 +func (api *InternetAPI) DeleteSubnet(id int64, subnetID int64) (*sacloud.ResultFlagValue, error) { + var ( + method = "DELETE" + uri = fmt.Sprintf("%s/%d/subnet/%d", api.getResourceURL(), id, subnetID) + ) + + res := &sacloud.ResultFlagValue{} + err := api.baseAPI.request(method, uri, nil, res) + if err != nil { + return nil, err + } + return res, nil +} + +// EnableIPv6 IPv6有効化 +func (api *InternetAPI) EnableIPv6(id int64) (*sacloud.IPv6Net, error) { + var ( + method = "POST" + uri = fmt.Sprintf("%s/%d/ipv6net", api.getResourceURL(), id) + ) + + res := &sacloud.Response{} + err := api.baseAPI.request(method, uri, nil, res) + if err != nil { + return nil, err + } + return res.IPv6Net, nil +} + +// DisableIPv6 IPv6無効化 +func (api *InternetAPI) DisableIPv6(id int64, ipv6NetID int64) (bool, error) { + var ( + method = "DELETE" + uri = fmt.Sprintf("%s/%d/ipv6net/%d", api.getResourceURL(), id, ipv6NetID) + ) + + res := &sacloud.Response{} + err := api.baseAPI.request(method, uri, nil, res) + if err != nil { + return false, err + } + return true, nil +} + +// SleepWhileCreating 作成完了まで待機(リトライ10) +func (api *InternetAPI) SleepWhileCreating(id int64, timeout time.Duration) error { + handler := waitingForReadFunc(func() (interface{}, error) { + return api.Read(id) + }, 10) // 作成直後はReadが404を返すことがあるためリトライ + return blockingPoll(handler, timeout) + +} + +// RetrySleepWhileCreating 作成完了まで待機 作成直後はReadが404を返すことがあるためmaxRetryまでリトライする +func (api *InternetAPI) RetrySleepWhileCreating(id int64, timeout time.Duration, maxRetry int) error { + handler := waitingForReadFunc(func() (interface{}, error) { + return api.Read(id) + }, maxRetry) + return blockingPoll(handler, timeout) + +} + +// Monitor アクティビティーモニター取得 +func (api *InternetAPI) Monitor(id int64, body *sacloud.ResourceMonitorRequest) (*sacloud.MonitorValues, error) { + return api.baseAPI.monitor(id, body) +} diff --git a/vendor/github.com/sacloud/libsacloud/api/internet_gen.go b/vendor/github.com/sacloud/libsacloud/api/internet_gen.go new file mode 100644 index 00000000..f2c96fa7 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/internet_gen.go @@ -0,0 +1,243 @@ +package api + +/************************************************ + generated by IDE. for [InternetAPI] +************************************************/ + +import ( + "github.com/sacloud/libsacloud/sacloud" +) + +/************************************************ + To support fluent interface for Find() +************************************************/ + +// Reset 検索条件のリセット +func (api *InternetAPI) Reset() *InternetAPI { + api.reset() + return api +} + +// Offset オフセット +func (api *InternetAPI) Offset(offset int) *InternetAPI { + api.offset(offset) + return api +} + +// Limit リミット +func (api *InternetAPI) Limit(limit int) *InternetAPI { + api.limit(limit) + return api +} + +// Include 取得する項目 +func (api *InternetAPI) Include(key string) *InternetAPI { + api.include(key) + return api +} + +// Exclude 除外する項目 +func (api *InternetAPI) Exclude(key string) *InternetAPI { + api.exclude(key) + return api +} + +// FilterBy 指定キーでのフィルター +func (api *InternetAPI) FilterBy(key string, value interface{}) *InternetAPI { + api.filterBy(key, value, false) + return api +} + +// FilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *InternetAPI) FilterMultiBy(key string, value interface{}) *InternetAPI { + api.filterBy(key, value, true) + return api +} + +// WithNameLike 名称条件 +func (api *InternetAPI) WithNameLike(name string) *InternetAPI { + return api.FilterBy("Name", name) +} + +// WithTag タグ条件 +func (api *InternetAPI) WithTag(tag string) *InternetAPI { + return api.FilterBy("Tags.Name", tag) +} + +// WithTags タグ(複数)条件 +func (api *InternetAPI) WithTags(tags []string) *InternetAPI { + return api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *InternetAPI) WithSizeGib(size int) *InternetAPI { +// api.FilterBy("SizeMB", size*1024) +// return api +// } + +// func (api *InternetAPI) WithSharedScope() *InternetAPI { +// api.FilterBy("Scope", "shared") +// return api +// } + +// func (api *InternetAPI) WithUserScope() *InternetAPI { +// api.FilterBy("Scope", "user") +// return api +// } + +// SortBy 指定キーでのソート +func (api *InternetAPI) SortBy(key string, reverse bool) *InternetAPI { + api.sortBy(key, reverse) + return api +} + +// SortByName 名称でのソート +func (api *InternetAPI) SortByName(reverse bool) *InternetAPI { + api.sortByName(reverse) + return api +} + +// func (api *InternetAPI) SortBySize(reverse bool) *InternetAPI { +// api.sortBy("SizeMB", reverse) +// return api +// } + +/************************************************ + To support Setxxx interface for Find() +************************************************/ + +// SetEmpty 検索条件のリセット +func (api *InternetAPI) SetEmpty() { + api.reset() +} + +// SetOffset オフセット +func (api *InternetAPI) SetOffset(offset int) { + api.offset(offset) +} + +// SetLimit リミット +func (api *InternetAPI) SetLimit(limit int) { + api.limit(limit) +} + +// SetInclude 取得する項目 +func (api *InternetAPI) SetInclude(key string) { + api.include(key) +} + +// SetExclude 除外する項目 +func (api *InternetAPI) SetExclude(key string) { + api.exclude(key) +} + +// SetFilterBy 指定キーでのフィルター +func (api *InternetAPI) SetFilterBy(key string, value interface{}) { + api.filterBy(key, value, false) +} + +// SetFilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *InternetAPI) SetFilterMultiBy(key string, value interface{}) { + api.filterBy(key, value, true) +} + +// SetNameLike 名称条件 +func (api *InternetAPI) SetNameLike(name string) { + api.FilterBy("Name", name) +} + +// SetTag タグ条件 +func (api *InternetAPI) SetTag(tag string) { + api.FilterBy("Tags.Name", tag) +} + +// SetTags タグ(複数)条件 +func (api *InternetAPI) SetTags(tags []string) { + api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *InternetAPI) SetSizeGib(size int) { +// api.FilterBy("SizeMB", size*1024) +// } + +// func (api *InternetAPI) SetSharedScope() { +// api.FilterBy("Scope", "shared") +// } + +// func (api *InternetAPI) SetUserScope() { +// api.FilterBy("Scope", "user") +// } + +// SetSortBy 指定キーでのソート +func (api *InternetAPI) SetSortBy(key string, reverse bool) { + api.sortBy(key, reverse) +} + +// SetSortByName 名称でのソート +func (api *InternetAPI) SetSortByName(reverse bool) { + api.sortByName(reverse) +} + +// func (api *InternetAPI) SetSortBySize(reverse bool) { +// api.sortBy("SizeMB", reverse) +// } + +/************************************************ + To support CRUD(Create/Read/Update/Delete) +************************************************/ + +// New 新規作成用パラメーター作成 +func (api *InternetAPI) New() *sacloud.Internet { + return &sacloud.Internet{} +} + +// Create 新規作成 +func (api *InternetAPI) Create(value *sacloud.Internet) (*sacloud.Internet, error) { + return api.request(func(res *sacloud.Response) error { + return api.create(api.createRequest(value), res) + }) +} + +// Read 読み取り +func (api *InternetAPI) Read(id int64) (*sacloud.Internet, error) { + return api.request(func(res *sacloud.Response) error { + return api.read(id, nil, res) + }) +} + +// Update 更新 +func (api *InternetAPI) Update(id int64, value *sacloud.Internet) (*sacloud.Internet, error) { + return api.request(func(res *sacloud.Response) error { + return api.update(id, api.createRequest(value), res) + }) +} + +// Delete 削除 +func (api *InternetAPI) Delete(id int64) (*sacloud.Internet, error) { + return api.request(func(res *sacloud.Response) error { + return api.delete(id, nil, res) + }) +} + +/************************************************ + Inner functions +************************************************/ + +func (api *InternetAPI) setStateValue(setFunc func(*sacloud.Request)) *InternetAPI { + api.baseAPI.setStateValue(setFunc) + return api +} + +func (api *InternetAPI) request(f func(*sacloud.Response) error) (*sacloud.Internet, error) { + res := &sacloud.Response{} + err := f(res) + if err != nil { + return nil, err + } + return res.Internet, nil +} + +func (api *InternetAPI) createRequest(value *sacloud.Internet) *sacloud.Request { + req := &sacloud.Request{} + req.Internet = value + return req +} diff --git a/vendor/github.com/sacloud/libsacloud/api/ipaddress.go b/vendor/github.com/sacloud/libsacloud/api/ipaddress.go new file mode 100644 index 00000000..3de95259 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/ipaddress.go @@ -0,0 +1,56 @@ +package api + +import ( + "fmt" + "github.com/sacloud/libsacloud/sacloud" +) + +// IPAddressAPI IPアドレスAPI +type IPAddressAPI struct { + *baseAPI +} + +// NewIPAddressAPI IPアドレスAPI新規作成 +func NewIPAddressAPI(client *Client) *IPAddressAPI { + return &IPAddressAPI{ + &baseAPI{ + client: client, + FuncGetResourceURL: func() string { + return "ipaddress" + }, + }, + } +} + +// Read 読み取り +func (api *IPAddressAPI) Read(ip string) (*sacloud.IPAddress, error) { + return api.request(func(res *sacloud.Response) error { + var ( + method = "GET" + uri = fmt.Sprintf("%s/%s", api.getResourceURL(), ip) + ) + + return api.baseAPI.request(method, uri, nil, res) + }) + +} + +// Update 更新(ホスト名逆引き設定) +func (api *IPAddressAPI) Update(ip string, hostName string) (*sacloud.IPAddress, error) { + + type request struct { + // IPAddress + IPAddress map[string]string + } + + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%s", api.getResourceURL(), ip) + body = &request{IPAddress: map[string]string{}} + ) + body.IPAddress["HostName"] = hostName + + return api.request(func(res *sacloud.Response) error { + return api.baseAPI.request(method, uri, body, res) + }) +} diff --git a/vendor/github.com/sacloud/libsacloud/api/ipaddress_gen.go b/vendor/github.com/sacloud/libsacloud/api/ipaddress_gen.go new file mode 100644 index 00000000..d20f72e6 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/ipaddress_gen.go @@ -0,0 +1,231 @@ +package api + +/************************************************ + generated by IDE. for [IPAddressAPI] +************************************************/ + +import ( + "github.com/sacloud/libsacloud/sacloud" +) + +/************************************************ + To support fluent interface for Find() +************************************************/ + +// Reset 検索条件のリセット +func (api *IPAddressAPI) Reset() *IPAddressAPI { + api.reset() + return api +} + +// Offset オフセット +func (api *IPAddressAPI) Offset(offset int) *IPAddressAPI { + api.offset(offset) + return api +} + +// Limit リミット +func (api *IPAddressAPI) Limit(limit int) *IPAddressAPI { + api.limit(limit) + return api +} + +// Include 取得する項目 +func (api *IPAddressAPI) Include(key string) *IPAddressAPI { + api.include(key) + return api +} + +// Exclude 除外する項目 +func (api *IPAddressAPI) Exclude(key string) *IPAddressAPI { + api.exclude(key) + return api +} + +// FilterBy 指定キーでのフィルタ +func (api *IPAddressAPI) FilterBy(key string, value interface{}) *IPAddressAPI { + api.filterBy(key, value, false) + return api +} + +// FilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *IPAddressAPI) FilterMultiBy(key string, value interface{}) *IPAddressAPI { + api.filterBy(key, value, true) + return api +} + +//func (api *IPAddressAPI) WithNameLike(name string) *IPAddressAPI { +// return api.FilterBy("Name", name) +//} + +//func (api *IPAddressAPI) WithTag(tag string) *IPAddressAPI { +// return api.FilterBy("Tags.Name", tag) +//} +//func (api *IPAddressAPI) WithTags(tags []string) *IPAddressAPI { +// return api.FilterBy("Tags.Name", []interface{}{tags}) +//} +// +//func (api *IPAddressAPI) WithSizeGib(size int) *IPAddressAPI { +// api.FilterBy("SizeMB", size*1024) +// return api +//} +// +//func (api *IPAddressAPI) WithSharedScope() *IPAddressAPI { +// api.FilterBy("Scope", "shared") +// return api +//} +// +//func (api *IPAddressAPI) WithUserScope() *IPAddressAPI { +// api.FilterBy("Scope", "user") +// return api +//} + +// SortBy 指定キーでのソート +func (api *IPAddressAPI) SortBy(key string, reverse bool) *IPAddressAPI { + api.sortBy(key, reverse) + return api +} + +//// SortByName 名称でのソート +//func (api *IPAddressAPI) SortByName(reverse bool) *IPAddressAPI { +// api.sortByName(reverse) +// return api +//} + +//func (api *IPAddressAPI) SortBySize(reverse bool) *IPAddressAPI { +// api.sortBy("SizeMB", reverse) +// return api +//} + +/************************************************ + To support Setxxx interface for Find() +************************************************/ + +// SetEmpty 検索条件のリセット +func (api *IPAddressAPI) SetEmpty() { + api.reset() +} + +// SetOffset オフセット +func (api *IPAddressAPI) SetOffset(offset int) { + api.offset(offset) +} + +// SetLimit リミット +func (api *IPAddressAPI) SetLimit(limit int) { + api.limit(limit) +} + +// SetInclude 取得する項目 +func (api *IPAddressAPI) SetInclude(key string) { + api.include(key) +} + +// SetExclude 除外する項目 +func (api *IPAddressAPI) SetExclude(key string) { + api.exclude(key) +} + +// SetFilterBy 指定キーでのフィルタ +func (api *IPAddressAPI) SetFilterBy(key string, value interface{}) { + api.filterBy(key, value, false) +} + +// SetFilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *IPAddressAPI) SetFilterMultiBy(key string, value interface{}) { + api.filterBy(key, value, true) +} + +//func (api *IPAddressAPI) SetNameLike(name string) { +// api.FilterBy("Name", name) +//} + +//func (api *IPAddressAPI) SetTag(tag string) { +// api.FilterBy("Tags.Name", tag) +//} +//func (api *IPAddressAPI) SetTags(tags []string) { +// api.FilterBy("Tags.Name", []interface{}{tags}) +//} +// +//func (api *IPAddressAPI) SetSizeGib(size int) { +// api.FilterBy("SizeMB", size*1024) +//} +// +//func (api *IPAddressAPI) SetSharedScope() { +// api.FilterBy("Scope", "shared") +//} +// +//func (api *IPAddressAPI) SetUserScope() { +// api.FilterBy("Scope", "user") +//} + +// SetSortBy 指定キーでのソート +func (api *IPAddressAPI) SetSortBy(key string, reverse bool) { + api.sortBy(key, reverse) +} + +//// SetSortByName 名称でのソート +//func (api *IPAddressAPI) SetSortByName(reverse bool) { +// api.sortByName(reverse) +//} + +//func (api *IPAddressAPI) SetSortBySize(reverse bool) { +// api.sortBy("SizeMB", reverse) +//} + +/************************************************ + To support CRUD(Create/Read/Update/Delete) +************************************************/ + +//func (api *IPAddressAPI) Create(value *sacloud.IPAddress) (*sacloud.IPAddress, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.create(api.createRequest(value), res) +// }) +//} + +//func (api *IPAddressAPI) Read(id int64) (*sacloud.IPAddress, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.read(id, nil, res) +// }) +//} + +//func (api *IPAddressAPI) Update(id int64, value *sacloud.IPAddress) (*sacloud.IPAddress, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.update(id, api.createRequest(value), res) +// }) +//} +// +//func (api *IPAddressAPI) Delete(id int64) (*sacloud.IPAddress, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.delete(id, nil, res) +// }) +//} +// +//func (api *IPAddressAPI) New() *sacloud.IPAddress { +// return &sacloud.IPAddress{ +// } +//} + +/************************************************ + Inner functions +************************************************/ + +func (api *IPAddressAPI) setStateValue(setFunc func(*sacloud.Request)) *IPAddressAPI { + api.baseAPI.setStateValue(setFunc) + return api +} + +func (api *IPAddressAPI) request(f func(*sacloud.Response) error) (*sacloud.IPAddress, error) { + res := &sacloud.Response{} + err := f(res) + if err != nil { + return nil, err + } + return res.IPAddress, nil +} + +func (api *IPAddressAPI) createRequest(value *sacloud.IPAddress) *sacloud.Request { + req := &sacloud.Request{} + req.IPAddress = value + return req +} diff --git a/vendor/github.com/sacloud/libsacloud/api/ipv6addr.go b/vendor/github.com/sacloud/libsacloud/api/ipv6addr.go new file mode 100644 index 00000000..7186d3e0 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/ipv6addr.go @@ -0,0 +1,96 @@ +package api + +import ( + "fmt" + "github.com/sacloud/libsacloud/sacloud" +) + +// IPv6AddrAPI IPv6アドレスAPI +type IPv6AddrAPI struct { + *baseAPI +} + +// NewIPv6AddrAPI IPv6アドレスAPI新規作成 +func NewIPv6AddrAPI(client *Client) *IPv6AddrAPI { + return &IPv6AddrAPI{ + &baseAPI{ + client: client, + FuncGetResourceURL: func() string { + return "ipv6addr" + }, + }, + } +} + +// Read 読み取り +func (api *IPv6AddrAPI) Read(ip string) (*sacloud.IPv6Addr, error) { + return api.request(func(res *sacloud.Response) error { + var ( + method = "GET" + uri = fmt.Sprintf("%s/%s", api.getResourceURL(), ip) + ) + + return api.baseAPI.request(method, uri, nil, res) + }) + +} + +// Create 新規作成 +func (api *IPv6AddrAPI) Create(ip string, hostName string) (*sacloud.IPv6Addr, error) { + + type request struct { + // IPv6Addr + IPv6Addr map[string]string + } + + var ( + method = "POST" + uri = api.getResourceURL() + body = &request{IPv6Addr: map[string]string{}} + ) + body.IPv6Addr["IPv6Addr"] = ip + body.IPv6Addr["HostName"] = hostName + + return api.request(func(res *sacloud.Response) error { + return api.baseAPI.request(method, uri, body, res) + }) +} + +// Update 更新 +func (api *IPv6AddrAPI) Update(ip string, hostName string) (*sacloud.IPv6Addr, error) { + + type request struct { + // IPv6Addr + IPv6Addr map[string]string + } + + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%s", api.getResourceURL(), ip) + body = &request{IPv6Addr: map[string]string{}} + ) + body.IPv6Addr["HostName"] = hostName + + return api.request(func(res *sacloud.Response) error { + return api.baseAPI.request(method, uri, body, res) + }) +} + +// Delete 削除 +func (api *IPv6AddrAPI) Delete(ip string) (*sacloud.IPv6Addr, error) { + + type request struct { + // IPv6Addr + IPv6Addr map[string]string + } + + var ( + method = "DELETE" + uri = fmt.Sprintf("%s/%s", api.getResourceURL(), ip) + body = &request{IPv6Addr: map[string]string{}} + ) + + return api.request(func(res *sacloud.Response) error { + return api.baseAPI.request(method, uri, body, res) + }) +} diff --git a/vendor/github.com/sacloud/libsacloud/api/ipv6addr_gen.go b/vendor/github.com/sacloud/libsacloud/api/ipv6addr_gen.go new file mode 100644 index 00000000..132568dc --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/ipv6addr_gen.go @@ -0,0 +1,232 @@ +package api + +/************************************************ + generated by IDE. for [IPv6AddrAPI] +************************************************/ + +import ( + "github.com/sacloud/libsacloud/sacloud" +) + +/************************************************ + To support fluent interface for Find() +************************************************/ + +// Reset 検索条件のリセット +func (api *IPv6AddrAPI) Reset() *IPv6AddrAPI { + api.reset() + return api +} + +// Offset オフセット +func (api *IPv6AddrAPI) Offset(offset int) *IPv6AddrAPI { + api.offset(offset) + return api +} + +// Limit リミット +func (api *IPv6AddrAPI) Limit(limit int) *IPv6AddrAPI { + api.limit(limit) + return api +} + +// Include 取得する項目 +func (api *IPv6AddrAPI) Include(key string) *IPv6AddrAPI { + api.include(key) + return api +} + +// Exclude 除外する項目 +func (api *IPv6AddrAPI) Exclude(key string) *IPv6AddrAPI { + api.exclude(key) + return api +} + +// FilterBy 指定キーでのフィルター +func (api *IPv6AddrAPI) FilterBy(key string, value interface{}) *IPv6AddrAPI { + api.filterBy(key, value, false) + return api +} + +// FilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *IPv6AddrAPI) FilterMultiBy(key string, value interface{}) *IPv6AddrAPI { + api.filterBy(key, value, true) + return api +} + +//func (api *IPv6AddrAPI) WithNameLike(name string) *IPv6AddrAPI { +// return api.FilterBy("Name", name) +//} + +//func (api *IPv6AddrAPI) WithTag(tag string) *IPv6AddrAPI { +// return api.FilterBy("Tags.Name", tag) +//} +//func (api *IPv6AddrAPI) WithTags(tags []string) *IPv6AddrAPI { +// return api.FilterBy("Tags.Name", []interface{}{tags}) +//} +// +//func (api *IPv6AddrAPI) WithSizeGib(size int) *IPv6AddrAPI { +// api.FilterBy("SizeMB", size*1024) +// return api +//} +// +//func (api *IPv6AddrAPI) WithSharedScope() *IPv6AddrAPI { +// api.FilterBy("Scope", "shared") +// return api +//} +// +//func (api *IPv6AddrAPI) WithUserScope() *IPv6AddrAPI { +// api.FilterBy("Scope", "user") +// return api +//} + +// SortBy 指定キーでのソート +func (api *IPv6AddrAPI) SortBy(key string, reverse bool) *IPv6AddrAPI { + api.sortBy(key, reverse) + return api +} + +//// SortByName +//func (api *IPv6AddrAPI) SortByName(reverse bool) *IPv6AddrAPI { +// api.sortByName(reverse) +// return api +//} + +//func (api *IPv6AddrAPI) SortBySize(reverse bool) *IPv6AddrAPI { +// api.sortBy("SizeMB", reverse) +// return api +//} + +/************************************************ + To support Setxxx interface for Find() +************************************************/ + +// SetEmpty 検索条件のリセット +func (api *IPv6AddrAPI) SetEmpty() { + api.reset() +} + +// SetOffset オフセット +func (api *IPv6AddrAPI) SetOffset(offset int) { + api.offset(offset) +} + +// SetLimit リミット +func (api *IPv6AddrAPI) SetLimit(limit int) { + api.limit(limit) +} + +// SetInclude 取得する項目 +func (api *IPv6AddrAPI) SetInclude(key string) { + api.include(key) +} + +// SetExclude 除外する項目 +func (api *IPv6AddrAPI) SetExclude(key string) { + api.exclude(key) +} + +// SetFilterBy 指定キーでのフィルター +func (api *IPv6AddrAPI) SetFilterBy(key string, value interface{}) { + api.filterBy(key, value, false) +} + +// SetFilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *IPv6AddrAPI) SetFilterMultiBy(key string, value interface{}) { + api.filterBy(key, value, true) +} + +//func (api *IPv6AddrAPI) SetNameLike(name string) { +//} + +//func (api *IPv6AddrAPI) SetTag(tag string) { +// api.FilterBy("Tags.Name", tag) +//} +//func (api *IPv6AddrAPI) SetTags(tags []string) { +// api.FilterBy("Tags.Name", []interface{}{tags}) +//} +// +//func (api *IPv6AddrAPI) SetSizeGib(size int) { +// api.FilterBy("SizeMB", size*1024) +//} +// +//func (api *IPv6AddrAPI) SetSharedScope() { +// api.FilterBy("Scope", "shared") +//} +// +//func (api *IPv6AddrAPI) SetUserScope() { +// api.FilterBy("Scope", "user") +//} + +// SetSortBy 指定キーでのソート +func (api *IPv6AddrAPI) SetSortBy(key string, reverse bool) { + api.sortBy(key, reverse) +} + +//// SetSortByName +//func (api *IPv6AddrAPI) SetSortByName(reverse bool) { +// api.sortByName(reverse) +//} + +//func (api *IPv6AddrAPI) SetSortBySize(reverse bool) { +// api.sortBy("SizeMB", reverse) +//} + +/************************************************ + // To + To support CRUD(Create/Read/Update/Delete) +************************************************/ + +//func (api *IPv6AddrAPI) Create(value *sacloud.IPv6Addr) (*sacloud.IPv6Addr, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.create(api.createRequest(value), res) +// }) +//} + +//func (api *IPv6AddrAPI) Read(id int64) (*sacloud.IPv6Addr, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.read(id, nil, res) +// }) +//} + +//func (api *IPv6AddrAPI) Update(id int64, value *sacloud.IPv6Addr) (*sacloud.IPv6Addr, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.update(id, api.createRequest(value), res) +// }) +//} +// +//func (api *IPv6AddrAPI) Delete(id int64) (*sacloud.IPv6Addr, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.delete(id, nil, res) +// }) +//} +// + +// New 新規作成用パラメーター作成 +func (api *IPv6AddrAPI) New() *sacloud.IPv6Addr { + return sacloud.CreateNewIPv6Addr() +} + +/************************************************ + Inner functions +************************************************/ + +func (api *IPv6AddrAPI) setStateValue(setFunc func(*sacloud.Request)) *IPv6AddrAPI { + api.baseAPI.setStateValue(setFunc) + return api +} + +func (api *IPv6AddrAPI) request(f func(*sacloud.Response) error) (*sacloud.IPv6Addr, error) { + res := &sacloud.Response{} + err := f(res) + if err != nil { + return nil, err + } + return res.IPv6Addr, nil +} + +func (api *IPv6AddrAPI) createRequest(value *sacloud.IPv6Addr) *sacloud.Request { + req := &sacloud.Request{} + req.IPv6Addr = value + return req +} diff --git a/vendor/github.com/sacloud/libsacloud/api/ipv6net.go b/vendor/github.com/sacloud/libsacloud/api/ipv6net.go new file mode 100644 index 00000000..9eb1c4d5 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/ipv6net.go @@ -0,0 +1,18 @@ +package api + +// IPv6NetAPI IPv6ネットワークAPI +type IPv6NetAPI struct { + *baseAPI +} + +// NewIPv6NetAPI IPv6ネットワークAPI作成 +func NewIPv6NetAPI(client *Client) *IPv6NetAPI { + return &IPv6NetAPI{ + &baseAPI{ + client: client, + FuncGetResourceURL: func() string { + return "ipv6net" + }, + }, + } +} diff --git a/vendor/github.com/sacloud/libsacloud/api/ipv6net_gen.go b/vendor/github.com/sacloud/libsacloud/api/ipv6net_gen.go new file mode 100644 index 00000000..5accb90f --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/ipv6net_gen.go @@ -0,0 +1,229 @@ +package api + +/************************************************ + generated by IDE. for [IPv6NetAPI] +************************************************/ + +import ( + "github.com/sacloud/libsacloud/sacloud" +) + +/************************************************ + To support fluent interface for Find() +************************************************/ + +// Reset 検索条件のクリア +func (api *IPv6NetAPI) Reset() *IPv6NetAPI { + api.reset() + return api +} + +// Offset オフセット +func (api *IPv6NetAPI) Offset(offset int) *IPv6NetAPI { + api.offset(offset) + return api +} + +// Limit リミット +func (api *IPv6NetAPI) Limit(limit int) *IPv6NetAPI { + api.limit(limit) + return api +} + +// Include 取得する項目 +func (api *IPv6NetAPI) Include(key string) *IPv6NetAPI { + api.include(key) + return api +} + +// Exclude 除外する項目 +func (api *IPv6NetAPI) Exclude(key string) *IPv6NetAPI { + api.exclude(key) + return api +} + +// FilterBy 指定キーでのフィルター +func (api *IPv6NetAPI) FilterBy(key string, value interface{}) *IPv6NetAPI { + api.filterBy(key, value, false) + return api +} + +// FilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *IPv6NetAPI) FilterMultiBy(key string, value interface{}) *IPv6NetAPI { + api.filterBy(key, value, true) + return api +} + +//func (api *IPv6NetAPI) WithNameLike(name string) *IPv6NetAPI { +// return api.FilterBy("Name", name) +//} +// +//func (api *IPv6NetAPI) WithTag(tag string) *IPv6NetAPI { +// return api.FilterBy("Tags.Name", tag) +//} +//func (api *IPv6NetAPI) WithTags(tags []string) *IPv6NetAPI { +// return api.FilterBy("Tags.Name", []interface{}{tags}) +//} + +// func (api *IPv6NetAPI) WithSizeGib(size int) *IPv6NetAPI { +// api.FilterBy("SizeMB", size*1024) +// return api +// } + +// func (api *IPv6NetAPI) WithSharedScope() *IPv6NetAPI { +// api.FilterBy("Scope", "shared") +// return api +// } + +// func (api *IPv6NetAPI) WithUserScope() *IPv6NetAPI { +// api.FilterBy("Scope", "user") +// return api +// } + +// SortBy 指定キーでのソート +func (api *IPv6NetAPI) SortBy(key string, reverse bool) *IPv6NetAPI { + api.sortBy(key, reverse) + return api +} + +//func (api *IPv6NetAPI) SortByName(reverse bool) *IPv6NetAPI { +// api.sortByName(reverse) +// return api +//} + +// func (api *IPv6NetAPI) SortBySize(reverse bool) *IPv6NetAPI { +// api.sortBy("SizeMB", reverse) +// return api +// } + +/************************************************ + To support Setxxx interface for Find() +************************************************/ + +// SetEmpty 検索条件のクリア +func (api *IPv6NetAPI) SetEmpty() { + api.reset() +} + +// SetOffset オフセット +func (api *IPv6NetAPI) SetOffset(offset int) { + api.offset(offset) +} + +// SetLimit リミット +func (api *IPv6NetAPI) SetLimit(limit int) { + api.limit(limit) +} + +// SetInclude 取得する項目 +func (api *IPv6NetAPI) SetInclude(key string) { + api.include(key) +} + +// SetExclude 除外する項目 +func (api *IPv6NetAPI) SetExclude(key string) { + api.exclude(key) +} + +// SetFilterBy 指定キーでのフィルター +func (api *IPv6NetAPI) SetFilterBy(key string, value interface{}) { + api.filterBy(key, value, false) +} + +// SetFilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *IPv6NetAPI) SetFilterMultiBy(key string, value interface{}) { + api.filterBy(key, value, true) +} + +//func (api *IPv6NetAPI) SetNameLike(name string) { +// api.FilterBy("Name", name) +//} +// +//func (api *IPv6NetAPI) SetTag(tag string) { +// api.FilterBy("Tags.Name", tag) +//} +//func (api *IPv6NetAPI) SetTags(tags []string) { +// api.FilterBy("Tags.Name", []interface{}{tags}) +//} + +// func (api *IPv6NetAPI) SetSizeGib(size int) { +// api.FilterBy("SizeMB", size*1024) +// } + +// func (api *IPv6NetAPI) SetSharedScope() { +// api.FilterBy("Scope", "shared") +// } + +// func (api *IPv6NetAPI) SetUserScope() { +// api.FilterBy("Scope", "user") +// } + +// SetSortBy 指定キーでのソート +func (api *IPv6NetAPI) SetSortBy(key string, reverse bool) { + api.sortBy(key, reverse) +} + +//func (api *IPv6NetAPI) SetSortByName(reverse bool) { +// api.sortByName(reverse) +//} + +// func (api *IPv6NetAPI) SetSortBySize(reverse bool) { +// api.sortBy("SizeMB", reverse) +// } + +/************************************************ + To support CRUD(Create/Read/Update/Delete) +************************************************/ + +//func (api *IPv6NetAPI) New() *sacloud.IPv6Net { +// return &sacloud.IPv6Net{} +//} + +//func (api *IPv6NetAPI) Create(value *sacloud.IPv6Net) (*sacloud.IPv6Net, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.create(api.createRequest(value), res) +// }) +//} + +// Read 読み取り +func (api *IPv6NetAPI) Read(id int64) (*sacloud.IPv6Net, error) { + return api.request(func(res *sacloud.Response) error { + return api.read(id, nil, res) + }) +} + +//func (api *IPv6NetAPI) Update(id int64, value *sacloud.IPv6Net) (*sacloud.IPv6Net, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.update(id, api.createRequest(value), res) +// }) +//} +// +//func (api *IPv6NetAPI) Delete(id int64) (*sacloud.IPv6Net, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.delete(id, nil, res) +// }) +//} + +/************************************************ + Inner functions +************************************************/ + +func (api *IPv6NetAPI) setStateValue(setFunc func(*sacloud.Request)) *IPv6NetAPI { + api.baseAPI.setStateValue(setFunc) + return api +} + +func (api *IPv6NetAPI) request(f func(*sacloud.Response) error) (*sacloud.IPv6Net, error) { + res := &sacloud.Response{} + err := f(res) + if err != nil { + return nil, err + } + return res.IPv6Net, nil +} + +func (api *IPv6NetAPI) createRequest(value *sacloud.IPv6Net) *sacloud.Request { + req := &sacloud.Request{} + req.IPv6Net = value + return req +} diff --git a/vendor/github.com/sacloud/libsacloud/api/license.go b/vendor/github.com/sacloud/libsacloud/api/license.go new file mode 100644 index 00000000..dc2811ce --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/license.go @@ -0,0 +1,18 @@ +package api + +// LicenseAPI ライセンスAPI +type LicenseAPI struct { + *baseAPI +} + +// NewLicenseAPI ライセンスAPI作成 +func NewLicenseAPI(client *Client) *LicenseAPI { + return &LicenseAPI{ + &baseAPI{ + client: client, + FuncGetResourceURL: func() string { + return "license" + }, + }, + } +} diff --git a/vendor/github.com/sacloud/libsacloud/api/license_gen.go b/vendor/github.com/sacloud/libsacloud/api/license_gen.go new file mode 100644 index 00000000..0c38524a --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/license_gen.go @@ -0,0 +1,243 @@ +package api + +/************************************************ + generated by IDE. for [LicenseAPI] +************************************************/ + +import ( + "github.com/sacloud/libsacloud/sacloud" +) + +/************************************************ + To support fluent interface for Find() +************************************************/ + +// Reset 検索条件のリセット +func (api *LicenseAPI) Reset() *LicenseAPI { + api.reset() + return api +} + +// Offset オフセット +func (api *LicenseAPI) Offset(offset int) *LicenseAPI { + api.offset(offset) + return api +} + +// Limit リミット +func (api *LicenseAPI) Limit(limit int) *LicenseAPI { + api.limit(limit) + return api +} + +// Include 取得する項目 +func (api *LicenseAPI) Include(key string) *LicenseAPI { + api.include(key) + return api +} + +// Exclude 除外する項目 +func (api *LicenseAPI) Exclude(key string) *LicenseAPI { + api.exclude(key) + return api +} + +// FilterBy 指定キーでのフィルター +func (api *LicenseAPI) FilterBy(key string, value interface{}) *LicenseAPI { + api.filterBy(key, value, false) + return api +} + +// FilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *LicenseAPI) FilterMultiBy(key string, value interface{}) *LicenseAPI { + api.filterBy(key, value, true) + return api +} + +// WithNameLike 名称条件 +func (api *LicenseAPI) WithNameLike(name string) *LicenseAPI { + return api.FilterBy("Name", name) +} + +// WithTag タグ条件 +func (api *LicenseAPI) WithTag(tag string) *LicenseAPI { + return api.FilterBy("Tags.Name", tag) +} + +// WithTags タグ(複数)条件 +func (api *LicenseAPI) WithTags(tags []string) *LicenseAPI { + return api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *LicenseAPI) WithSizeGib(size int) *LicenseAPI { +// api.FilterBy("SizeMB", size*1024) +// return api +// } + +// func (api *LicenseAPI) WithSharedScope() *LicenseAPI { +// api.FilterBy("Scope", "shared") +// return api +// } + +// func (api *LicenseAPI) WithUserScope() *LicenseAPI { +// api.FilterBy("Scope", "user") +// return api +// } + +// SortBy 指定キーでのソート +func (api *LicenseAPI) SortBy(key string, reverse bool) *LicenseAPI { + api.sortBy(key, reverse) + return api +} + +// SortByName 名称でのソート +func (api *LicenseAPI) SortByName(reverse bool) *LicenseAPI { + api.sortByName(reverse) + return api +} + +// func (api *LicenseAPI) SortBySize(reverse bool) *LicenseAPI { +// api.sortBy("SizeMB", reverse) +// return api +// } + +/************************************************ + To support Setxxx interface for Find() +************************************************/ + +// SetEmpty 検索条件のリセット +func (api *LicenseAPI) SetEmpty() { + api.reset() +} + +// SetOffset オフセット +func (api *LicenseAPI) SetOffset(offset int) { + api.offset(offset) +} + +// SetLimit リミット +func (api *LicenseAPI) SetLimit(limit int) { + api.limit(limit) +} + +// SetInclude 取得する項目 +func (api *LicenseAPI) SetInclude(key string) { + api.include(key) +} + +// SetExclude 除外する項目 +func (api *LicenseAPI) SetExclude(key string) { + api.exclude(key) +} + +// SetFilterBy 指定キーでのフィルター +func (api *LicenseAPI) SetFilterBy(key string, value interface{}) { + api.filterBy(key, value, false) +} + +// SetFilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *LicenseAPI) SetFilterMultiBy(key string, value interface{}) { + api.filterBy(key, value, true) +} + +// SetNameLike 名称条件 +func (api *LicenseAPI) SetNameLike(name string) { + api.FilterBy("Name", name) +} + +// SetTag タグ条件 +func (api *LicenseAPI) SetTag(tag string) { + api.FilterBy("Tags.Name", tag) +} + +// SetTags タグ(複数)条件 +func (api *LicenseAPI) SetTags(tags []string) { + api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *LicenseAPI) SetSizeGib(size int) { +// api.FilterBy("SizeMB", size*1024) +// } + +// func (api *LicenseAPI) SetSharedScope() { +// api.FilterBy("Scope", "shared") +// } + +// func (api *LicenseAPI) SetUserScope() { +// api.FilterBy("Scope", "user") +// } + +// SetSortBy 指定キーでのソート +func (api *LicenseAPI) SetSortBy(key string, reverse bool) { + api.sortBy(key, reverse) +} + +// SetSortByName 名称でのソート +func (api *LicenseAPI) SetSortByName(reverse bool) { + api.sortByName(reverse) +} + +// func (api *LicenseAPI) SetSortBySize(reverse bool) { +// api.sortBy("SizeMB", reverse) +// } + +/************************************************ + To support CRUD(Create/Read/Update/Delete) +************************************************/ + +// New 新規作成用パラメーター作成 +func (api *LicenseAPI) New() *sacloud.License { + return &sacloud.License{} +} + +// Create 新規作成 +func (api *LicenseAPI) Create(value *sacloud.License) (*sacloud.License, error) { + return api.request(func(res *sacloud.Response) error { + return api.create(api.createRequest(value), res) + }) +} + +// Read 読み取り +func (api *LicenseAPI) Read(id int64) (*sacloud.License, error) { + return api.request(func(res *sacloud.Response) error { + return api.read(id, nil, res) + }) +} + +// Update 更新 +func (api *LicenseAPI) Update(id int64, value *sacloud.License) (*sacloud.License, error) { + return api.request(func(res *sacloud.Response) error { + return api.update(id, api.createRequest(value), res) + }) +} + +// Delete 削除 +func (api *LicenseAPI) Delete(id int64) (*sacloud.License, error) { + return api.request(func(res *sacloud.Response) error { + return api.delete(id, nil, res) + }) +} + +/************************************************ + Inner functions +************************************************/ + +func (api *LicenseAPI) setStateValue(setFunc func(*sacloud.Request)) *LicenseAPI { + api.baseAPI.setStateValue(setFunc) + return api +} + +func (api *LicenseAPI) request(f func(*sacloud.Response) error) (*sacloud.License, error) { + res := &sacloud.Response{} + err := f(res) + if err != nil { + return nil, err + } + return res.License, nil +} + +func (api *LicenseAPI) createRequest(value *sacloud.License) *sacloud.Request { + req := &sacloud.Request{} + req.License = value + return req +} diff --git a/vendor/github.com/sacloud/libsacloud/api/load_balancer.go b/vendor/github.com/sacloud/libsacloud/api/load_balancer.go new file mode 100644 index 00000000..c5873c69 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/load_balancer.go @@ -0,0 +1,232 @@ +package api + +import ( + "encoding/json" + "fmt" + "github.com/sacloud/libsacloud/sacloud" + "time" +) + +//HACK: さくらのAPI側仕様: Applianceの内容によってJSONフォーマットが異なるため +// ロードバランサ/VPCルータそれぞれでリクエスト/レスポンスデータ型を定義する。 + +// SearchLoadBalancerResponse ロードバランサー検索レスポンス +type SearchLoadBalancerResponse struct { + // Total 総件数 + Total int `json:",omitempty"` + // From ページング開始位置 + From int `json:",omitempty"` + // Count 件数 + Count int `json:",omitempty"` + // LoadBalancers ロードバランサー リスト + LoadBalancers []sacloud.LoadBalancer `json:"Appliances,omitempty"` +} + +type loadBalancerRequest struct { + LoadBalancer *sacloud.LoadBalancer `json:"Appliance,omitempty"` + From int `json:",omitempty"` + Count int `json:",omitempty"` + Sort []string `json:",omitempty"` + Filter map[string]interface{} `json:",omitempty"` + Exclude []string `json:",omitempty"` + Include []string `json:",omitempty"` +} + +type loadBalancerResponse struct { + *sacloud.ResultFlagValue + *sacloud.LoadBalancer `json:"Appliance,omitempty"` + Success interface{} `json:",omitempty"` //HACK: さくらのAPI側仕様: 戻り値:Successがbool値へ変換できないためinterface{} +} + +// LoadBalancerAPI ロードバランサーAPI +type LoadBalancerAPI struct { + *baseAPI +} + +// NewLoadBalancerAPI ロードバランサーAPI作成 +func NewLoadBalancerAPI(client *Client) *LoadBalancerAPI { + return &LoadBalancerAPI{ + &baseAPI{ + client: client, + FuncGetResourceURL: func() string { + return "appliance" + }, + FuncBaseSearchCondition: func() *sacloud.Request { + res := &sacloud.Request{} + res.AddFilter("Class", "loadbalancer") + return res + }, + }, + } +} + +// Find 検索 +func (api *LoadBalancerAPI) Find() (*SearchLoadBalancerResponse, error) { + data, err := api.client.newRequest("GET", api.getResourceURL(), api.getSearchState()) + if err != nil { + return nil, err + } + var res SearchLoadBalancerResponse + if err := json.Unmarshal(data, &res); err != nil { + return nil, err + } + return &res, nil +} + +func (api *LoadBalancerAPI) request(f func(*loadBalancerResponse) error) (*sacloud.LoadBalancer, error) { + res := &loadBalancerResponse{} + err := f(res) + if err != nil { + return nil, err + } + return res.LoadBalancer, nil +} + +func (api *LoadBalancerAPI) createRequest(value *sacloud.LoadBalancer) *loadBalancerResponse { + return &loadBalancerResponse{LoadBalancer: value} +} + +//func (api *LoadBalancerAPI) New() *sacloud.LoadBalancer { +// return sacloud.CreateNewLoadBalancer() +//} + +// Create 新規作成 +func (api *LoadBalancerAPI) Create(value *sacloud.LoadBalancer) (*sacloud.LoadBalancer, error) { + return api.request(func(res *loadBalancerResponse) error { + return api.create(api.createRequest(value), res) + }) +} + +// Read 読み取り +func (api *LoadBalancerAPI) Read(id int64) (*sacloud.LoadBalancer, error) { + return api.request(func(res *loadBalancerResponse) error { + return api.read(id, nil, res) + }) +} + +// Update 更新 +func (api *LoadBalancerAPI) Update(id int64, value *sacloud.LoadBalancer) (*sacloud.LoadBalancer, error) { + return api.request(func(res *loadBalancerResponse) error { + return api.update(id, api.createRequest(value), res) + }) +} + +// Delete 削除 +func (api *LoadBalancerAPI) Delete(id int64) (*sacloud.LoadBalancer, error) { + return api.request(func(res *loadBalancerResponse) error { + return api.delete(id, nil, res) + }) +} + +// Config 設定変更の反映 +func (api *LoadBalancerAPI) Config(id int64) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/config", api.getResourceURL(), id) + ) + return api.modify(method, uri, nil) +} + +// IsUp 起動しているか判定 +func (api *LoadBalancerAPI) IsUp(id int64) (bool, error) { + lb, err := api.Read(id) + if err != nil { + return false, err + } + return lb.Instance.IsUp(), nil +} + +// IsDown ダウンしているか判定 +func (api *LoadBalancerAPI) IsDown(id int64) (bool, error) { + lb, err := api.Read(id) + if err != nil { + return false, err + } + return lb.Instance.IsDown(), nil +} + +// Boot 起動 +func (api *LoadBalancerAPI) Boot(id int64) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/power", api.getResourceURL(), id) + ) + return api.modify(method, uri, nil) +} + +// Shutdown シャットダウン(graceful) +func (api *LoadBalancerAPI) Shutdown(id int64) (bool, error) { + var ( + method = "DELETE" + uri = fmt.Sprintf("%s/%d/power", api.getResourceURL(), id) + ) + + return api.modify(method, uri, nil) +} + +// Stop シャットダウン(force) +func (api *LoadBalancerAPI) Stop(id int64) (bool, error) { + var ( + method = "DELETE" + uri = fmt.Sprintf("%s/%d/power", api.getResourceURL(), id) + ) + + return api.modify(method, uri, map[string]bool{"Force": true}) +} + +// RebootForce 再起動 +func (api *LoadBalancerAPI) RebootForce(id int64) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/reset", api.getResourceURL(), id) + ) + + return api.modify(method, uri, nil) +} + +// ResetForce リセット +func (api *LoadBalancerAPI) ResetForce(id int64, recycleProcess bool) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/reset", api.getResourceURL(), id) + ) + + return api.modify(method, uri, map[string]bool{"RecycleProcess": recycleProcess}) +} + +// SleepUntilUp 起動するまで待機 +func (api *LoadBalancerAPI) SleepUntilUp(id int64, timeout time.Duration) error { + handler := waitingForUpFunc(func() (hasUpDown, error) { + return api.Read(id) + }, 0) + return blockingPoll(handler, timeout) +} + +// SleepUntilDown ダウンするまで待機 +func (api *LoadBalancerAPI) SleepUntilDown(id int64, timeout time.Duration) error { + handler := waitingForDownFunc(func() (hasUpDown, error) { + return api.Read(id) + }, 0) + return blockingPoll(handler, timeout) +} + +// SleepWhileCopying コピー終了まで待機 +func (api *LoadBalancerAPI) SleepWhileCopying(id int64, timeout time.Duration, maxRetry int) error { + handler := waitingForAvailableFunc(func() (hasAvailable, error) { + return api.Read(id) + }, maxRetry) + return blockingPoll(handler, timeout) +} + +// AsyncSleepWhileCopying コピー終了まで待機(非同期) +func (api *LoadBalancerAPI) AsyncSleepWhileCopying(id int64, timeout time.Duration, maxRetry int) (chan (interface{}), chan (interface{}), chan (error)) { + handler := waitingForAvailableFunc(func() (hasAvailable, error) { + return api.Read(id) + }, maxRetry) + return poll(handler, timeout) +} + +// Monitor アクティビティーモニター取得 +func (api *LoadBalancerAPI) Monitor(id int64, body *sacloud.ResourceMonitorRequest) (*sacloud.MonitorValues, error) { + return api.baseAPI.applianceMonitorBy(id, "interface", 0, body) +} diff --git a/vendor/github.com/sacloud/libsacloud/api/load_balancer_gen.go b/vendor/github.com/sacloud/libsacloud/api/load_balancer_gen.go new file mode 100644 index 00000000..52c4e7bd --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/load_balancer_gen.go @@ -0,0 +1,238 @@ +package api + +/************************************************ + generated by IDE. for [LoadBalancerAPI] +************************************************/ + +import ( + "github.com/sacloud/libsacloud/sacloud" +) + +/************************************************ + To support fluent interface for Find() +************************************************/ + +// Reset 検索条件のリセット +func (api *LoadBalancerAPI) Reset() *LoadBalancerAPI { + api.reset() + return api +} + +// Offset オフセット +func (api *LoadBalancerAPI) Offset(offset int) *LoadBalancerAPI { + api.offset(offset) + return api +} + +// Limit リミット +func (api *LoadBalancerAPI) Limit(limit int) *LoadBalancerAPI { + api.limit(limit) + return api +} + +// Include 取得する項目 +func (api *LoadBalancerAPI) Include(key string) *LoadBalancerAPI { + api.include(key) + return api +} + +// Exclude 除外する項目 +func (api *LoadBalancerAPI) Exclude(key string) *LoadBalancerAPI { + api.exclude(key) + return api +} + +// FilterBy 指定キーでのフィルター +func (api *LoadBalancerAPI) FilterBy(key string, value interface{}) *LoadBalancerAPI { + api.filterBy(key, value, false) + return api +} + +// FilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *LoadBalancerAPI) FilterMultiBy(key string, value interface{}) *LoadBalancerAPI { + api.filterBy(key, value, true) + return api +} + +// WithNameLike 名称条件 +func (api *LoadBalancerAPI) WithNameLike(name string) *LoadBalancerAPI { + return api.FilterBy("Name", name) +} + +// WithTag タグ条件 +func (api *LoadBalancerAPI) WithTag(tag string) *LoadBalancerAPI { + return api.FilterBy("Tags.Name", tag) +} + +// WithTags タグ(複数)条件 +func (api *LoadBalancerAPI) WithTags(tags []string) *LoadBalancerAPI { + return api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *LoadBalancerAPI) WithSizeGib(size int) *LoadBalancerAPI { +// api.FilterBy("SizeMB", size*1024) +// return api +// } + +// func (api *LoadBalancerAPI) WithSharedScope() *LoadBalancerAPI { +// api.FilterBy("Scope", "shared") +// return api +// } + +// func (api *LoadBalancerAPI) WithUserScope() *LoadBalancerAPI { +// api.FilterBy("Scope", "user") +// return api +// } + +// SortBy 指定キーでのソート +func (api *LoadBalancerAPI) SortBy(key string, reverse bool) *LoadBalancerAPI { + api.sortBy(key, reverse) + return api +} + +// SortByName 名称でのソート +func (api *LoadBalancerAPI) SortByName(reverse bool) *LoadBalancerAPI { + api.sortByName(reverse) + return api +} + +// func (api *LoadBalancerAPI) SortBySize(reverse bool) *LoadBalancerAPI { +// api.sortBy("SizeMB", reverse) +// return api +// } + +/************************************************ + To support Setxxx interface for Find() +************************************************/ + +// SetEmpty 検索条件のリセット +func (api *LoadBalancerAPI) SetEmpty() { + api.reset() +} + +// SetOffset オフセット +func (api *LoadBalancerAPI) SetOffset(offset int) { + api.offset(offset) +} + +// SetLimit リミット +func (api *LoadBalancerAPI) SetLimit(limit int) { + api.limit(limit) +} + +// SetInclude 取得する項目 +func (api *LoadBalancerAPI) SetInclude(key string) { + api.include(key) +} + +// SetExclude 除外する項目 +func (api *LoadBalancerAPI) SetExclude(key string) { + api.exclude(key) +} + +// SetFilterBy 指定キーでのフィルター +func (api *LoadBalancerAPI) SetFilterBy(key string, value interface{}) { + api.filterBy(key, value, false) +} + +// SetFilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *LoadBalancerAPI) SetFilterMultiBy(key string, value interface{}) { + api.filterBy(key, value, true) +} + +// SetNameLike 名称条件 +func (api *LoadBalancerAPI) SetNameLike(name string) { + api.FilterBy("Name", name) +} + +// SetTag タグ条件 +func (api *LoadBalancerAPI) SetTag(tag string) { + api.FilterBy("Tags.Name", tag) +} + +// SetTags タグ(複数)条件 +func (api *LoadBalancerAPI) SetTags(tags []string) { + api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *LoadBalancerAPI) SetSizeGib(size int) { +// api.FilterBy("SizeMB", size*1024) +// } + +// func (api *LoadBalancerAPI) SetSharedScope() { +// api.FilterBy("Scope", "shared") +// } + +// func (api *LoadBalancerAPI) SetUserScope() { +// api.FilterBy("Scope", "user") +// } + +// SetSortBy 指定キーでのソート +func (api *LoadBalancerAPI) SetSortBy(key string, reverse bool) { + api.sortBy(key, reverse) +} + +// SetSortByName 名称でのソート +func (api *LoadBalancerAPI) SetSortByName(reverse bool) { + api.sortByName(reverse) +} + +// func (api *LoadBalancerAPI) SortBySize(reverse bool) { +// api.sortBy("SizeMB", reverse) +// } + +/************************************************ + To support CRUD(Create/Read/Update/Delete) +************************************************/ + +// func (api *LoadBalancerAPI) New() *sacloud.LoadBalancer { +// return &sacloud.LoadBalancer{} +// } + +// func (api *LoadBalancerAPI) Create(value *sacloud.LoadBalancer) (*sacloud.LoadBalancer, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.create(api.createRequest(value), res) +// }) +// } + +// func (api *LoadBalancerAPI) Read(id string) (*sacloud.LoadBalancer, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.read(id, nil, res) +// }) +// } + +// func (api *LoadBalancerAPI) Update(id string, value *sacloud.LoadBalancer) (*sacloud.LoadBalancer, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.update(id, api.createRequest(value), res) +// }) +// } + +// func (api *LoadBalancerAPI) Delete(id string) (*sacloud.LoadBalancer, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.delete(id, nil, res) +// }) +// } + +/************************************************ + Inner functions +************************************************/ + +func (api *LoadBalancerAPI) setStateValue(setFunc func(*sacloud.Request)) *LoadBalancerAPI { + api.baseAPI.setStateValue(setFunc) + return api +} + +//func (api *LoadBalancerAPI) request(f func(*sacloud.Response) error) (*sacloud.LoadBalancer, error) { +// res := &sacloud.Response{} +// err := f(res) +// if err != nil { +// return nil, err +// } +// return res.LoadBalancer, nil +//} +// +//func (api *LoadBalancerAPI) createRequest(value *sacloud.LoadBalancer) *sacloud.Request { +// req := &sacloud.Request{} +// req.LoadBalancer = value +// return req +//} diff --git a/vendor/github.com/sacloud/libsacloud/api/mobile_gateway.go b/vendor/github.com/sacloud/libsacloud/api/mobile_gateway.go new file mode 100644 index 00000000..27ead985 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/mobile_gateway.go @@ -0,0 +1,339 @@ +package api + +import ( + "encoding/json" + "fmt" + "github.com/sacloud/libsacloud/sacloud" + "time" +) + +// SearchMobileGatewayResponse モバイルゲートウェイ検索レスポンス +type SearchMobileGatewayResponse struct { + // Total 総件数 + Total int `json:",omitempty"` + // From ページング開始位置 + From int `json:",omitempty"` + // Count 件数 + Count int `json:",omitempty"` + // MobileGateways モバイルゲートウェイ リスト + MobileGateways []sacloud.MobileGateway `json:"Appliances,omitempty"` +} + +// MobileGatewaySIMRequest SIM一覧取得リクエスト +type MobileGatewaySIMRequest struct { + From int `json:",omitempty"` + Count int `json:",omitempty"` + Sort []string `json:",omitempty"` + Filter map[string]interface{} `json:",omitempty"` + Exclude []string `json:",omitempty"` + Include []string `json:",omitempty"` +} + +type mobileGatewayResponse struct { + *sacloud.ResultFlagValue + *sacloud.MobileGateway `json:"Appliance,omitempty"` + Success interface{} `json:",omitempty"` //HACK: さくらのAPI側仕様: 戻り値:Successがbool値へ変換できないためinterface{} +} + +type mobileGatewaySIMResponse struct { + *sacloud.ResultFlagValue + SIM []sacloud.SIMInfo `json:"sim,omitempty"` + Success interface{} `json:",omitempty"` //HACK: さくらのAPI側仕様: 戻り値:Successがbool値へ変換できないためinterface{} +} + +// MobileGatewayAPI モバイルゲートウェイAPI +type MobileGatewayAPI struct { + *baseAPI +} + +// NewMobileGatewayAPI モバイルゲートウェイAPI作成 +func NewMobileGatewayAPI(client *Client) *MobileGatewayAPI { + return &MobileGatewayAPI{ + &baseAPI{ + client: client, + FuncGetResourceURL: func() string { + return "appliance" + }, + FuncBaseSearchCondition: func() *sacloud.Request { + res := &sacloud.Request{} + res.AddFilter("Class", "mobilegateway") + return res + }, + }, + } +} + +// Find 検索 +func (api *MobileGatewayAPI) Find() (*SearchMobileGatewayResponse, error) { + data, err := api.client.newRequest("GET", api.getResourceURL(), api.getSearchState()) + if err != nil { + return nil, err + } + var res SearchMobileGatewayResponse + if err := json.Unmarshal(data, &res); err != nil { + return nil, err + } + return &res, nil +} + +func (api *MobileGatewayAPI) request(f func(*mobileGatewayResponse) error) (*sacloud.MobileGateway, error) { + res := &mobileGatewayResponse{} + err := f(res) + if err != nil { + return nil, err + } + return res.MobileGateway, nil +} + +func (api *MobileGatewayAPI) createRequest(value *sacloud.MobileGateway) *mobileGatewayResponse { + return &mobileGatewayResponse{MobileGateway: value} +} + +// Create 新規作成 +func (api *MobileGatewayAPI) Create(value *sacloud.MobileGateway) (*sacloud.MobileGateway, error) { + return api.request(func(res *mobileGatewayResponse) error { + return api.create(api.createRequest(value), res) + }) +} + +// Read 読み取り +func (api *MobileGatewayAPI) Read(id int64) (*sacloud.MobileGateway, error) { + return api.request(func(res *mobileGatewayResponse) error { + return api.read(id, nil, res) + }) +} + +// Update 更新 +func (api *MobileGatewayAPI) Update(id int64, value *sacloud.MobileGateway) (*sacloud.MobileGateway, error) { + return api.request(func(res *mobileGatewayResponse) error { + return api.update(id, api.createRequest(value), res) + }) +} + +// UpdateSetting 設定更新 +func (api *MobileGatewayAPI) UpdateSetting(id int64, value *sacloud.MobileGateway) (*sacloud.MobileGateway, error) { + req := &sacloud.MobileGateway{ + // Settings + Settings: value.Settings, + } + return api.request(func(res *mobileGatewayResponse) error { + return api.update(id, api.createRequest(req), res) + }) +} + +// Delete 削除 +func (api *MobileGatewayAPI) Delete(id int64) (*sacloud.MobileGateway, error) { + return api.request(func(res *mobileGatewayResponse) error { + return api.delete(id, nil, res) + }) +} + +// Config 設定変更の反映 +func (api *MobileGatewayAPI) Config(id int64) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/config", api.getResourceURL(), id) + ) + return api.modify(method, uri, nil) +} + +// IsUp 起動しているか判定 +func (api *MobileGatewayAPI) IsUp(id int64) (bool, error) { + lb, err := api.Read(id) + if err != nil { + return false, err + } + return lb.Instance.IsUp(), nil +} + +// IsDown ダウンしているか判定 +func (api *MobileGatewayAPI) IsDown(id int64) (bool, error) { + lb, err := api.Read(id) + if err != nil { + return false, err + } + return lb.Instance.IsDown(), nil +} + +// Boot 起動 +func (api *MobileGatewayAPI) Boot(id int64) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/power", api.getResourceURL(), id) + ) + return api.modify(method, uri, nil) +} + +// Shutdown シャットダウン(graceful) +func (api *MobileGatewayAPI) Shutdown(id int64) (bool, error) { + var ( + method = "DELETE" + uri = fmt.Sprintf("%s/%d/power", api.getResourceURL(), id) + ) + + return api.modify(method, uri, nil) +} + +// Stop シャットダウン(force) +func (api *MobileGatewayAPI) Stop(id int64) (bool, error) { + var ( + method = "DELETE" + uri = fmt.Sprintf("%s/%d/power", api.getResourceURL(), id) + ) + + return api.modify(method, uri, map[string]bool{"Force": true}) +} + +// RebootForce 再起動 +func (api *MobileGatewayAPI) RebootForce(id int64) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/reset", api.getResourceURL(), id) + ) + + return api.modify(method, uri, nil) +} + +// ResetForce リセット +func (api *MobileGatewayAPI) ResetForce(id int64, recycleProcess bool) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/reset", api.getResourceURL(), id) + ) + + return api.modify(method, uri, map[string]bool{"RecycleProcess": recycleProcess}) +} + +// SleepUntilUp 起動するまで待機 +func (api *MobileGatewayAPI) SleepUntilUp(id int64, timeout time.Duration) error { + handler := waitingForUpFunc(func() (hasUpDown, error) { + return api.Read(id) + }, 0) + return blockingPoll(handler, timeout) +} + +// SleepUntilDown ダウンするまで待機 +func (api *MobileGatewayAPI) SleepUntilDown(id int64, timeout time.Duration) error { + handler := waitingForDownFunc(func() (hasUpDown, error) { + return api.Read(id) + }, 0) + return blockingPoll(handler, timeout) +} + +// SleepWhileCopying コピー終了まで待機 +func (api *MobileGatewayAPI) SleepWhileCopying(id int64, timeout time.Duration, maxRetry int) error { + handler := waitingForAvailableFunc(func() (hasAvailable, error) { + return api.Read(id) + }, maxRetry) + return blockingPoll(handler, timeout) +} + +// AsyncSleepWhileCopying コピー終了まで待機(非同期) +func (api *MobileGatewayAPI) AsyncSleepWhileCopying(id int64, timeout time.Duration, maxRetry int) (chan (interface{}), chan (interface{}), chan (error)) { + handler := waitingForAvailableFunc(func() (hasAvailable, error) { + return api.Read(id) + }, maxRetry) + return poll(handler, timeout) +} + +// ConnectToSwitch 指定のインデックス位置のNICをスイッチへ接続 +func (api *MobileGatewayAPI) ConnectToSwitch(id int64, switchID int64) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/interface/%d/to/switch/%d", api.getResourceURL(), id, 1, switchID) + ) + return api.modify(method, uri, nil) +} + +// DisconnectFromSwitch 指定のインデックス位置のNICをスイッチから切断 +func (api *MobileGatewayAPI) DisconnectFromSwitch(id int64) (bool, error) { + var ( + method = "DELETE" + uri = fmt.Sprintf("%s/%d/interface/%d/to/switch", api.getResourceURL(), id, 1) + ) + return api.modify(method, uri, nil) +} + +// GetDNS DNSサーバ設定 取得 +func (api *MobileGatewayAPI) GetDNS(id int64) (*sacloud.MobileGatewayResolver, error) { + var ( + method = "GET" + uri = fmt.Sprintf("%s/%d/mobilegateway/dnsresolver", api.getResourceURL(), id) + ) + + data, err := api.client.newRequest(method, uri, nil) + if err != nil { + return nil, err + } + var res sacloud.MobileGatewayResolver + if err := json.Unmarshal(data, &res); err != nil { + return nil, err + } + return &res, err +} + +// SetDNS DNSサーバ設定 +func (api *MobileGatewayAPI) SetDNS(id int64, dns *sacloud.MobileGatewayResolver) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/mobilegateway/dnsresolver", api.getResourceURL(), id) + ) + + return api.modify(method, uri, dns) +} + +// ListSIM SIM一覧取得 +func (api *MobileGatewayAPI) ListSIM(id int64, req *MobileGatewaySIMRequest) ([]sacloud.SIMInfo, error) { + var ( + method = "GET" + uri = fmt.Sprintf("%s/%d/mobilegateway/sims", api.getResourceURL(), id) + ) + + data, err := api.client.newRequest(method, uri, req) + if err != nil { + return nil, err + } + var res mobileGatewaySIMResponse + if err := json.Unmarshal(data, &res); err != nil { + return nil, err + } + return res.SIM, nil +} + +// AddSIM SIM登録 +func (api *MobileGatewayAPI) AddSIM(id int64, simID int64) (bool, error) { + var ( + method = "POST" + uri = fmt.Sprintf("%s/%d/mobilegateway/sims", api.getResourceURL(), id) + ) + + return api.modify(method, uri, map[string]interface{}{ + "sim": map[string]interface{}{ + "resource_id": fmt.Sprintf("%d", simID), + }, + }) +} + +// DeleteSIM SIM登録 +func (api *MobileGatewayAPI) DeleteSIM(id int64, simID int64) (bool, error) { + var ( + method = "DELETE" + uri = fmt.Sprintf("%s/%d/mobilegateway/sims/%d", api.getResourceURL(), id, simID) + ) + return api.modify(method, uri, nil) +} + +// Logs セッションログ取得(複数SIM) +func (api *MobileGatewayAPI) Logs(id int64, body interface{}) ([]sacloud.SIMLog, error) { + var ( + method = "GET" + uri = fmt.Sprintf("%s/%d/mobilegateway/sessionlog", api.getResourceURL(), id) + ) + + res := &simLogResponse{} + err := api.baseAPI.request(method, uri, body, res) + if err != nil { + return nil, err + } + return res.Logs, nil +} diff --git a/vendor/github.com/sacloud/libsacloud/api/mobile_gateway_gen.go b/vendor/github.com/sacloud/libsacloud/api/mobile_gateway_gen.go new file mode 100644 index 00000000..d7123924 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/mobile_gateway_gen.go @@ -0,0 +1,238 @@ +package api + +/************************************************ + generated by IDE. for [MobileGatewayAPI] +************************************************/ + +import ( + "github.com/sacloud/libsacloud/sacloud" +) + +/************************************************ + To support fluent interface for Find() +************************************************/ + +// Reset 検索条件のリセット +func (api *MobileGatewayAPI) Reset() *MobileGatewayAPI { + api.reset() + return api +} + +// Offset オフセット +func (api *MobileGatewayAPI) Offset(offset int) *MobileGatewayAPI { + api.offset(offset) + return api +} + +// Limit リミット +func (api *MobileGatewayAPI) Limit(limit int) *MobileGatewayAPI { + api.limit(limit) + return api +} + +// Include 取得する項目 +func (api *MobileGatewayAPI) Include(key string) *MobileGatewayAPI { + api.include(key) + return api +} + +// Exclude 除外する項目 +func (api *MobileGatewayAPI) Exclude(key string) *MobileGatewayAPI { + api.exclude(key) + return api +} + +// FilterBy 指定キーでのフィルター +func (api *MobileGatewayAPI) FilterBy(key string, value interface{}) *MobileGatewayAPI { + api.filterBy(key, value, false) + return api +} + +// FilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *MobileGatewayAPI) FilterMultiBy(key string, value interface{}) *MobileGatewayAPI { + api.filterBy(key, value, true) + return api +} + +// WithNameLike 名称条件 +func (api *MobileGatewayAPI) WithNameLike(name string) *MobileGatewayAPI { + return api.FilterBy("Name", name) +} + +// WithTag タグ条件 +func (api *MobileGatewayAPI) WithTag(tag string) *MobileGatewayAPI { + return api.FilterBy("Tags.Name", tag) +} + +// WithTags タグ(複数)条件 +func (api *MobileGatewayAPI) WithTags(tags []string) *MobileGatewayAPI { + return api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *MobileGatewayAPI) WithSizeGib(size int) *MobileGatewayAPI { +// api.FilterBy("SizeMB", size*1024) +// return api +// } + +// func (api *MobileGatewayAPI) WithSharedScope() *MobileGatewayAPI { +// api.FilterBy("Scope", "shared") +// return api +// } + +// func (api *MobileGatewayAPI) WithUserScope() *MobileGatewayAPI { +// api.FilterBy("Scope", "user") +// return api +// } + +// SortBy 指定キーでのソート +func (api *MobileGatewayAPI) SortBy(key string, reverse bool) *MobileGatewayAPI { + api.sortBy(key, reverse) + return api +} + +// SortByName 名称でのソート +func (api *MobileGatewayAPI) SortByName(reverse bool) *MobileGatewayAPI { + api.sortByName(reverse) + return api +} + +// func (api *MobileGatewayAPI) SortBySize(reverse bool) *MobileGatewayAPI { +// api.sortBy("SizeMB", reverse) +// return api +// } + +/************************************************ + To support Setxxx interface for Find() +************************************************/ + +// SetEmpty 検索条件のリセット +func (api *MobileGatewayAPI) SetEmpty() { + api.reset() +} + +// SetOffset オフセット +func (api *MobileGatewayAPI) SetOffset(offset int) { + api.offset(offset) +} + +// SetLimit リミット +func (api *MobileGatewayAPI) SetLimit(limit int) { + api.limit(limit) +} + +// SetInclude 取得する項目 +func (api *MobileGatewayAPI) SetInclude(key string) { + api.include(key) +} + +// SetExclude 除外する項目 +func (api *MobileGatewayAPI) SetExclude(key string) { + api.exclude(key) +} + +// SetFilterBy 指定キーでのフィルター +func (api *MobileGatewayAPI) SetFilterBy(key string, value interface{}) { + api.filterBy(key, value, false) +} + +// SetFilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *MobileGatewayAPI) SetFilterMultiBy(key string, value interface{}) { + api.filterBy(key, value, true) +} + +// SetNameLike 名称条件 +func (api *MobileGatewayAPI) SetNameLike(name string) { + api.FilterBy("Name", name) +} + +// SetTag タグ条件 +func (api *MobileGatewayAPI) SetTag(tag string) { + api.FilterBy("Tags.Name", tag) +} + +// SetTags タグ(複数)条件 +func (api *MobileGatewayAPI) SetTags(tags []string) { + api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *MobileGatewayAPI) SetSizeGib(size int) { +// api.FilterBy("SizeMB", size*1024) +// } + +// func (api *MobileGatewayAPI) SetSharedScope() { +// api.FilterBy("Scope", "shared") +// } + +// func (api *MobileGatewayAPI) SetUserScope() { +// api.FilterBy("Scope", "user") +// } + +// SetSortBy 指定キーでのソート +func (api *MobileGatewayAPI) SetSortBy(key string, reverse bool) { + api.sortBy(key, reverse) +} + +// SetSortByName 名称でのソート +func (api *MobileGatewayAPI) SetSortByName(reverse bool) { + api.sortByName(reverse) +} + +// func (api *MobileGatewayAPI) SortBySize(reverse bool) { +// api.sortBy("SizeMB", reverse) +// } + +/************************************************ + To support CRUD(Create/Read/Update/Delete) +************************************************/ + +// func (api *MobileGatewayAPI) New() *sacloud.MobileGateway { +// return &sacloud.MobileGateway{} +// } + +// func (api *MobileGatewayAPI) Create(value *sacloud.MobileGateway) (*sacloud.MobileGateway, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.create(api.createRequest(value), res) +// }) +// } + +// func (api *MobileGatewayAPI) Read(id string) (*sacloud.MobileGateway, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.read(id, nil, res) +// }) +// } + +// func (api *MobileGatewayAPI) Update(id string, value *sacloud.MobileGateway) (*sacloud.MobileGateway, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.update(id, api.createRequest(value), res) +// }) +// } + +// func (api *MobileGatewayAPI) Delete(id string) (*sacloud.MobileGateway, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.delete(id, nil, res) +// }) +// } + +/************************************************ + Inner functions +************************************************/ + +func (api *MobileGatewayAPI) setStateValue(setFunc func(*sacloud.Request)) *MobileGatewayAPI { + api.baseAPI.setStateValue(setFunc) + return api +} + +//func (api *MobileGatewayAPI) request(f func(*sacloud.Response) error) (*sacloud.MobileGateway, error) { +// res := &sacloud.Response{} +// err := f(res) +// if err != nil { +// return nil, err +// } +// return res.MobileGateway, nil +//} +// +//func (api *MobileGatewayAPI) createRequest(value *sacloud.MobileGateway) *sacloud.Request { +// req := &sacloud.Request{} +// req.MobileGateway = value +// return req +//} diff --git a/vendor/github.com/sacloud/libsacloud/api/newsfeed.go b/vendor/github.com/sacloud/libsacloud/api/newsfeed.go new file mode 100644 index 00000000..4adab1ca --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/newsfeed.go @@ -0,0 +1,50 @@ +package api + +import ( + "encoding/json" + "github.com/sacloud/libsacloud/sacloud" +) + +// NewsFeedAPI フィード(障害/メンテナンス情報)API +type NewsFeedAPI struct { + client *Client +} + +// NewsFeedURL フィード取得URL +var NewsFeedURL = "https://secure.sakura.ad.jp/rss/sakuranews/getfeeds.php?service=cloud&format=json" + +// NewNewsFeedAPI フィード(障害/メンテナンス情報)API +func NewNewsFeedAPI(client *Client) *NewsFeedAPI { + return &NewsFeedAPI{ + client: client, + } +} + +// GetFeed フィード全件取得 +func (api *NewsFeedAPI) GetFeed() ([]sacloud.NewsFeed, error) { + + var res = []sacloud.NewsFeed{} + data, err := api.client.newRequest("GET", NewsFeedURL, nil) + if err != nil { + return res, err + } + + if err := json.Unmarshal(data, &res); err != nil { + return nil, err + } + return res, nil +} + +// GetFeedByURL 指定のURLを持つフィードを取得 +func (api *NewsFeedAPI) GetFeedByURL(url string) (*sacloud.NewsFeed, error) { + res, err := api.GetFeed() + if err != nil { + return nil, err + } + for _, r := range res { + if r.URL == url { + return &r, nil + } + } + return nil, nil +} diff --git a/vendor/github.com/sacloud/libsacloud/api/nfs.go b/vendor/github.com/sacloud/libsacloud/api/nfs.go new file mode 100644 index 00000000..f044fc86 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/nfs.go @@ -0,0 +1,234 @@ +package api + +import ( + "encoding/json" + "fmt" + "github.com/sacloud/libsacloud/sacloud" + "time" +) + +// SearchNFSResponse NFS検索レスポンス +type SearchNFSResponse struct { + // Total 総件数 + Total int `json:",omitempty"` + // From ページング開始位置 + From int `json:",omitempty"` + // Count 件数 + Count int `json:",omitempty"` + // NFSs NFS リスト + NFS []sacloud.NFS `json:"Appliances,omitempty"` +} + +type nfsRequest struct { + NFS *sacloud.NFS `json:"Appliance,omitempty"` + From int `json:",omitempty"` + Count int `json:",omitempty"` + Sort []string `json:",omitempty"` + Filter map[string]interface{} `json:",omitempty"` + Exclude []string `json:",omitempty"` + Include []string `json:",omitempty"` +} + +type nfsResponse struct { + *sacloud.ResultFlagValue + *sacloud.NFS `json:"Appliance,omitempty"` + Success interface{} `json:",omitempty"` //HACK: さくらのAPI側仕様: 戻り値:Successがbool値へ変換できないためinterface{} +} + +// NFSAPI NFSAPI +type NFSAPI struct { + *baseAPI +} + +// NewNFSAPI NFSAPI作成 +func NewNFSAPI(client *Client) *NFSAPI { + return &NFSAPI{ + &baseAPI{ + client: client, + FuncGetResourceURL: func() string { + return "appliance" + }, + FuncBaseSearchCondition: func() *sacloud.Request { + res := &sacloud.Request{} + res.AddFilter("Class", "nfs") + return res + }, + }, + } +} + +// Find 検索 +func (api *NFSAPI) Find() (*SearchNFSResponse, error) { + data, err := api.client.newRequest("GET", api.getResourceURL(), api.getSearchState()) + if err != nil { + return nil, err + } + var res SearchNFSResponse + if err := json.Unmarshal(data, &res); err != nil { + return nil, err + } + return &res, nil +} + +func (api *NFSAPI) request(f func(*nfsResponse) error) (*sacloud.NFS, error) { + res := &nfsResponse{} + err := f(res) + if err != nil { + return nil, err + } + return res.NFS, nil +} + +func (api *NFSAPI) createRequest(value *sacloud.NFS) *nfsResponse { + return &nfsResponse{NFS: value} +} + +//func (api *NFSAPI) New() *sacloud.NFS { +// return sacloud.CreateNewNFS() +//} + +// Create 新規作成 +func (api *NFSAPI) Create(value *sacloud.NFS) (*sacloud.NFS, error) { + return api.request(func(res *nfsResponse) error { + return api.create(api.createRequest(value), res) + }) +} + +// Read 読み取り +func (api *NFSAPI) Read(id int64) (*sacloud.NFS, error) { + return api.request(func(res *nfsResponse) error { + return api.read(id, nil, res) + }) +} + +// Update 更新 +func (api *NFSAPI) Update(id int64, value *sacloud.NFS) (*sacloud.NFS, error) { + return api.request(func(res *nfsResponse) error { + return api.update(id, api.createRequest(value), res) + }) +} + +// Delete 削除 +func (api *NFSAPI) Delete(id int64) (*sacloud.NFS, error) { + return api.request(func(res *nfsResponse) error { + return api.delete(id, nil, res) + }) +} + +// Config 設定変更の反映 +func (api *NFSAPI) Config(id int64) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/config", api.getResourceURL(), id) + ) + return api.modify(method, uri, nil) +} + +// IsUp 起動しているか判定 +func (api *NFSAPI) IsUp(id int64) (bool, error) { + lb, err := api.Read(id) + if err != nil { + return false, err + } + return lb.Instance.IsUp(), nil +} + +// IsDown ダウンしているか判定 +func (api *NFSAPI) IsDown(id int64) (bool, error) { + lb, err := api.Read(id) + if err != nil { + return false, err + } + return lb.Instance.IsDown(), nil +} + +// Boot 起動 +func (api *NFSAPI) Boot(id int64) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/power", api.getResourceURL(), id) + ) + return api.modify(method, uri, nil) +} + +// Shutdown シャットダウン(graceful) +func (api *NFSAPI) Shutdown(id int64) (bool, error) { + var ( + method = "DELETE" + uri = fmt.Sprintf("%s/%d/power", api.getResourceURL(), id) + ) + + return api.modify(method, uri, nil) +} + +// Stop シャットダウン(force) +func (api *NFSAPI) Stop(id int64) (bool, error) { + var ( + method = "DELETE" + uri = fmt.Sprintf("%s/%d/power", api.getResourceURL(), id) + ) + + return api.modify(method, uri, map[string]bool{"Force": true}) +} + +// RebootForce 再起動 +func (api *NFSAPI) RebootForce(id int64) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/reset", api.getResourceURL(), id) + ) + + return api.modify(method, uri, nil) +} + +// ResetForce リセット +func (api *NFSAPI) ResetForce(id int64, recycleProcess bool) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/reset", api.getResourceURL(), id) + ) + + return api.modify(method, uri, map[string]bool{"RecycleProcess": recycleProcess}) +} + +// SleepUntilUp 起動するまで待機 +func (api *NFSAPI) SleepUntilUp(id int64, timeout time.Duration) error { + handler := waitingForUpFunc(func() (hasUpDown, error) { + return api.Read(id) + }, 0) + return blockingPoll(handler, timeout) +} + +// SleepUntilDown ダウンするまで待機 +func (api *NFSAPI) SleepUntilDown(id int64, timeout time.Duration) error { + handler := waitingForDownFunc(func() (hasUpDown, error) { + return api.Read(id) + }, 0) + return blockingPoll(handler, timeout) +} + +// SleepWhileCopying コピー終了まで待機 +func (api *NFSAPI) SleepWhileCopying(id int64, timeout time.Duration, maxRetry int) error { + handler := waitingForAvailableFunc(func() (hasAvailable, error) { + return api.Read(id) + }, maxRetry) + return blockingPoll(handler, timeout) +} + +// AsyncSleepWhileCopying コピー終了まで待機(非同期) +func (api *NFSAPI) AsyncSleepWhileCopying(id int64, timeout time.Duration, maxRetry int) (chan (interface{}), chan (interface{}), chan (error)) { + handler := waitingForAvailableFunc(func() (hasAvailable, error) { + return api.Read(id) + }, maxRetry) + return poll(handler, timeout) +} + +// MonitorNFS NFS固有項目アクティビティモニター取得 +func (api *NFSAPI) MonitorNFS(id int64, body *sacloud.ResourceMonitorRequest) (*sacloud.MonitorValues, error) { + return api.baseAPI.applianceMonitorBy(id, "nfs", 0, body) +} + +// MonitorInterface NICアクティビティーモニター取得 +func (api *NFSAPI) MonitorInterface(id int64, body *sacloud.ResourceMonitorRequest) (*sacloud.MonitorValues, error) { + return api.baseAPI.applianceMonitorBy(id, "interface", 0, body) +} diff --git a/vendor/github.com/sacloud/libsacloud/api/nfs_gen.go b/vendor/github.com/sacloud/libsacloud/api/nfs_gen.go new file mode 100644 index 00000000..99a7f930 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/nfs_gen.go @@ -0,0 +1,238 @@ +package api + +/************************************************ + generated by IDE. for [NFSAPI] +************************************************/ + +import ( + "github.com/sacloud/libsacloud/sacloud" +) + +/************************************************ + To support fluent interface for Find() +************************************************/ + +// Reset 検索条件のリセット +func (api *NFSAPI) Reset() *NFSAPI { + api.reset() + return api +} + +// Offset オフセット +func (api *NFSAPI) Offset(offset int) *NFSAPI { + api.offset(offset) + return api +} + +// Limit リミット +func (api *NFSAPI) Limit(limit int) *NFSAPI { + api.limit(limit) + return api +} + +// Include 取得する項目 +func (api *NFSAPI) Include(key string) *NFSAPI { + api.include(key) + return api +} + +// Exclude 除外する項目 +func (api *NFSAPI) Exclude(key string) *NFSAPI { + api.exclude(key) + return api +} + +// FilterBy 指定キーでのフィルター +func (api *NFSAPI) FilterBy(key string, value interface{}) *NFSAPI { + api.filterBy(key, value, false) + return api +} + +// FilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *NFSAPI) FilterMultiBy(key string, value interface{}) *NFSAPI { + api.filterBy(key, value, true) + return api +} + +// WithNameLike 名称条件 +func (api *NFSAPI) WithNameLike(name string) *NFSAPI { + return api.FilterBy("Name", name) +} + +// WithTag タグ条件 +func (api *NFSAPI) WithTag(tag string) *NFSAPI { + return api.FilterBy("Tags.Name", tag) +} + +// WithTags タグ(複数)条件 +func (api *NFSAPI) WithTags(tags []string) *NFSAPI { + return api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *NFSAPI) WithSizeGib(size int) *NFSAPI { +// api.FilterBy("SizeMB", size*1024) +// return api +// } + +// func (api *NFSAPI) WithSharedScope() *NFSAPI { +// api.FilterBy("Scope", "shared") +// return api +// } + +// func (api *NFSAPI) WithUserScope() *NFSAPI { +// api.FilterBy("Scope", "user") +// return api +// } + +// SortBy 指定キーでのソート +func (api *NFSAPI) SortBy(key string, reverse bool) *NFSAPI { + api.sortBy(key, reverse) + return api +} + +// SortByName 名称でのソート +func (api *NFSAPI) SortByName(reverse bool) *NFSAPI { + api.sortByName(reverse) + return api +} + +// func (api *NFSAPI) SortBySize(reverse bool) *NFSAPI { +// api.sortBy("SizeMB", reverse) +// return api +// } + +/************************************************ + To support Setxxx interface for Find() +************************************************/ + +// SetEmpty 検索条件のリセット +func (api *NFSAPI) SetEmpty() { + api.reset() +} + +// SetOffset オフセット +func (api *NFSAPI) SetOffset(offset int) { + api.offset(offset) +} + +// SetLimit リミット +func (api *NFSAPI) SetLimit(limit int) { + api.limit(limit) +} + +// SetInclude 取得する項目 +func (api *NFSAPI) SetInclude(key string) { + api.include(key) +} + +// SetExclude 除外する項目 +func (api *NFSAPI) SetExclude(key string) { + api.exclude(key) +} + +// SetFilterBy 指定キーでのフィルター +func (api *NFSAPI) SetFilterBy(key string, value interface{}) { + api.filterBy(key, value, false) +} + +// SetFilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *NFSAPI) SetFilterMultiBy(key string, value interface{}) { + api.filterBy(key, value, true) +} + +// SetNameLike 名称条件 +func (api *NFSAPI) SetNameLike(name string) { + api.FilterBy("Name", name) +} + +// SetTag タグ条件 +func (api *NFSAPI) SetTag(tag string) { + api.FilterBy("Tags.Name", tag) +} + +// SetTags タグ(複数)条件 +func (api *NFSAPI) SetTags(tags []string) { + api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *NFSAPI) SetSizeGib(size int) { +// api.FilterBy("SizeMB", size*1024) +// } + +// func (api *NFSAPI) SetSharedScope() { +// api.FilterBy("Scope", "shared") +// } + +// func (api *NFSAPI) SetUserScope() { +// api.FilterBy("Scope", "user") +// } + +// SetSortBy 指定キーでのソート +func (api *NFSAPI) SetSortBy(key string, reverse bool) { + api.sortBy(key, reverse) +} + +// SetSortByName 名称でのソート +func (api *NFSAPI) SetSortByName(reverse bool) { + api.sortByName(reverse) +} + +// func (api *NFSAPI) SortBySize(reverse bool) { +// api.sortBy("SizeMB", reverse) +// } + +/************************************************ + To support CRUD(Create/Read/Update/Delete) +************************************************/ + +// func (api *NFSAPI) New() *sacloud.NFS { +// return &sacloud.NFS{} +// } + +// func (api *NFSAPI) Create(value *sacloud.NFS) (*sacloud.NFS, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.create(api.createRequest(value), res) +// }) +// } + +// func (api *NFSAPI) Read(id string) (*sacloud.NFS, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.read(id, nil, res) +// }) +// } + +// func (api *NFSAPI) Update(id string, value *sacloud.NFS) (*sacloud.NFS, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.update(id, api.createRequest(value), res) +// }) +// } + +// func (api *NFSAPI) Delete(id string) (*sacloud.NFS, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.delete(id, nil, res) +// }) +// } + +/************************************************ + Inner functions +************************************************/ + +func (api *NFSAPI) setStateValue(setFunc func(*sacloud.Request)) *NFSAPI { + api.baseAPI.setStateValue(setFunc) + return api +} + +//func (api *NFSAPI) request(f func(*sacloud.Response) error) (*sacloud.NFS, error) { +// res := &sacloud.Response{} +// err := f(res) +// if err != nil { +// return nil, err +// } +// return res.NFS, nil +//} +// +//func (api *NFSAPI) createRequest(value *sacloud.NFS) *sacloud.Request { +// req := &sacloud.Request{} +// req.NFS = value +// return req +//} diff --git a/vendor/github.com/sacloud/libsacloud/api/note.go b/vendor/github.com/sacloud/libsacloud/api/note.go new file mode 100644 index 00000000..6869a3f3 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/note.go @@ -0,0 +1,18 @@ +package api + +// NoteAPI スタートアップスクリプトAPI +type NoteAPI struct { + *baseAPI +} + +// NewNoteAPI スタートアップスクリプトAPI作成 +func NewNoteAPI(client *Client) *NoteAPI { + return &NoteAPI{ + &baseAPI{ + client: client, + FuncGetResourceURL: func() string { + return "note" + }, + }, + } +} diff --git a/vendor/github.com/sacloud/libsacloud/api/note_gen.go b/vendor/github.com/sacloud/libsacloud/api/note_gen.go new file mode 100644 index 00000000..34579e94 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/note_gen.go @@ -0,0 +1,247 @@ +package api + +/************************************************ + generated by IDE. for [NoteAPI] +************************************************/ + +import ( + "github.com/sacloud/libsacloud/sacloud" +) + +/************************************************ + To support fluent interface for Find() +************************************************/ + +// Reset 検索条件のリセット +func (api *NoteAPI) Reset() *NoteAPI { + api.reset() + return api +} + +// Offset オフセット +func (api *NoteAPI) Offset(offset int) *NoteAPI { + api.offset(offset) + return api +} + +// Limit リミット +func (api *NoteAPI) Limit(limit int) *NoteAPI { + api.limit(limit) + return api +} + +// Include 取得する項目 +func (api *NoteAPI) Include(key string) *NoteAPI { + api.include(key) + return api +} + +// Exclude 除外する項目 +func (api *NoteAPI) Exclude(key string) *NoteAPI { + api.exclude(key) + return api +} + +// FilterBy 指定キーでのフィルター +func (api *NoteAPI) FilterBy(key string, value interface{}) *NoteAPI { + api.filterBy(key, value, false) + return api +} + +// FilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *NoteAPI) FilterMultiBy(key string, value interface{}) *NoteAPI { + api.filterBy(key, value, true) + return api +} + +// WithNameLike 名称条件 +func (api *NoteAPI) WithNameLike(name string) *NoteAPI { + return api.FilterBy("Name", name) +} + +// WithTag タグ条件 +func (api *NoteAPI) WithTag(tag string) *NoteAPI { + return api.FilterBy("Tags.Name", tag) +} + +// WithTags タグ(複数)条件 +func (api *NoteAPI) WithTags(tags []string) *NoteAPI { + return api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *NoteAPI) WithSizeGib(size int) *NoteAPI { +// api.FilterBy("SizeMB", size*1024) +// return api +// } + +// WithSharedScope 公開スコープ条件 +func (api *NoteAPI) WithSharedScope() *NoteAPI { + api.FilterBy("Scope", "shared") + return api +} + +// WithUserScope ユーザースコープ条件 +func (api *NoteAPI) WithUserScope() *NoteAPI { + api.FilterBy("Scope", "user") + return api +} + +// SortBy 指定キーでのソート +func (api *NoteAPI) SortBy(key string, reverse bool) *NoteAPI { + api.sortBy(key, reverse) + return api +} + +// SortByName 名称でのソート +func (api *NoteAPI) SortByName(reverse bool) *NoteAPI { + api.sortByName(reverse) + return api +} + +// func (api *NoteAPI) SortBySize(reverse bool) *NoteAPI { +// api.sortBy("SizeMB", reverse) +// return api +// } + +/************************************************ + To support Setxxx interface for Find() +************************************************/ + +// SetEmpty 検索条件のリセット +func (api *NoteAPI) SetEmpty() { + api.reset() +} + +// SetOffset オフセット +func (api *NoteAPI) SetOffset(offset int) { + api.offset(offset) +} + +// SetLimit リミット +func (api *NoteAPI) SetLimit(limit int) { + api.limit(limit) +} + +// SetInclude 取得する項目 +func (api *NoteAPI) SetInclude(key string) { + api.include(key) +} + +// SetExclude 除外する項目 +func (api *NoteAPI) SetExclude(key string) { + api.exclude(key) +} + +// SetFilterBy 指定キーでのフィルター +func (api *NoteAPI) SetFilterBy(key string, value interface{}) { + api.filterBy(key, value, false) +} + +// SetFilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *NoteAPI) SetFilterMultiBy(key string, value interface{}) { + api.filterBy(key, value, true) +} + +// SetNameLike 名称条件 +func (api *NoteAPI) SetNameLike(name string) { + api.FilterBy("Name", name) +} + +// SetTag タグ条件 +func (api *NoteAPI) SetTag(tag string) { + api.FilterBy("Tags.Name", tag) +} + +// SetTags タグ(複数)条件 +func (api *NoteAPI) SetTags(tags []string) { + api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *NoteAPI) SetSizeGib(size int) { +// api.FilterBy("SizeMB", size*1024) +// } + +// SetSharedScope 公開スコープ条件 +func (api *NoteAPI) SetSharedScope() { + api.FilterBy("Scope", "shared") +} + +// SetUserScope ユーザースコープ条件 +func (api *NoteAPI) SetUserScope() { + api.FilterBy("Scope", "user") +} + +// SetSortBy 指定キーでのソート +func (api *NoteAPI) SetSortBy(key string, reverse bool) { + api.sortBy(key, reverse) +} + +// SetSortByName 名称でのソート +func (api *NoteAPI) SetSortByName(reverse bool) { + api.sortByName(reverse) +} + +// func (api *NoteAPI) SetSortBySize(reverse bool) { +// api.sortBy("SizeMB", reverse) +// } + +/************************************************ + To support CRUD(Create/Read/Update/Delete) +************************************************/ + +// New 新規作成用パラメーター作成 +func (api *NoteAPI) New() *sacloud.Note { + return &sacloud.Note{} +} + +// Create 新規作成 +func (api *NoteAPI) Create(value *sacloud.Note) (*sacloud.Note, error) { + return api.request(func(res *sacloud.Response) error { + return api.create(api.createRequest(value), res) + }) +} + +// Read 読み取り +func (api *NoteAPI) Read(id int64) (*sacloud.Note, error) { + return api.request(func(res *sacloud.Response) error { + return api.read(id, nil, res) + }) +} + +// Update 更新 +func (api *NoteAPI) Update(id int64, value *sacloud.Note) (*sacloud.Note, error) { + return api.request(func(res *sacloud.Response) error { + return api.update(id, api.createRequest(value), res) + }) +} + +// Delete 削除 +func (api *NoteAPI) Delete(id int64) (*sacloud.Note, error) { + return api.request(func(res *sacloud.Response) error { + return api.delete(id, nil, res) + }) +} + +/************************************************ + Inner functions +************************************************/ + +func (api *NoteAPI) setStateValue(setFunc func(*sacloud.Request)) *NoteAPI { + api.baseAPI.setStateValue(setFunc) + return api +} + +func (api *NoteAPI) request(f func(*sacloud.Response) error) (*sacloud.Note, error) { + res := &sacloud.Response{} + err := f(res) + if err != nil { + return nil, err + } + return res.Note, nil +} + +func (api *NoteAPI) createRequest(value *sacloud.Note) *sacloud.Request { + req := &sacloud.Request{} + req.Note = value + return req +} diff --git a/vendor/github.com/sacloud/libsacloud/api/packet_filter.go b/vendor/github.com/sacloud/libsacloud/api/packet_filter.go new file mode 100644 index 00000000..1b0b2797 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/packet_filter.go @@ -0,0 +1,18 @@ +package api + +// PacketFilterAPI パケットフィルターAPI +type PacketFilterAPI struct { + *baseAPI +} + +// NewPacketFilterAPI パケットフィルターAPI作成 +func NewPacketFilterAPI(client *Client) *PacketFilterAPI { + return &PacketFilterAPI{ + &baseAPI{ + client: client, + FuncGetResourceURL: func() string { + return "packetfilter" + }, + }, + } +} diff --git a/vendor/github.com/sacloud/libsacloud/api/packet_filter_gen.go b/vendor/github.com/sacloud/libsacloud/api/packet_filter_gen.go new file mode 100644 index 00000000..4e2e8f27 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/packet_filter_gen.go @@ -0,0 +1,243 @@ +package api + +/************************************************ + generated by IDE. for [PacketFilterAPI] +************************************************/ + +import ( + "github.com/sacloud/libsacloud/sacloud" +) + +/************************************************ + To support fluent interface for Find() +************************************************/ + +// Reset 検索条件のリセット +func (api *PacketFilterAPI) Reset() *PacketFilterAPI { + api.reset() + return api +} + +// Offset オフセット +func (api *PacketFilterAPI) Offset(offset int) *PacketFilterAPI { + api.offset(offset) + return api +} + +// Limit リミット +func (api *PacketFilterAPI) Limit(limit int) *PacketFilterAPI { + api.limit(limit) + return api +} + +// Include 取得する項目 +func (api *PacketFilterAPI) Include(key string) *PacketFilterAPI { + api.include(key) + return api +} + +// Exclude 除外する項目 +func (api *PacketFilterAPI) Exclude(key string) *PacketFilterAPI { + api.exclude(key) + return api +} + +// FilterBy 指定キーでのフィルター +func (api *PacketFilterAPI) FilterBy(key string, value interface{}) *PacketFilterAPI { + api.filterBy(key, value, false) + return api +} + +// FilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *PacketFilterAPI) FilterMultiBy(key string, value interface{}) *PacketFilterAPI { + api.filterBy(key, value, true) + return api +} + +// WithNameLike 名称条件 +func (api *PacketFilterAPI) WithNameLike(name string) *PacketFilterAPI { + return api.FilterBy("Name", name) +} + +// WithTag タグ条件 +func (api *PacketFilterAPI) WithTag(tag string) *PacketFilterAPI { + return api.FilterBy("Tags.Name", tag) +} + +// WithTags タグ(複数)条件 +func (api *PacketFilterAPI) WithTags(tags []string) *PacketFilterAPI { + return api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *PacketFilterAPI) WithSizeGib(size int) *PacketFilterAPI { +// api.FilterBy("SizeMB", size*1024) +// return api +// } + +// func (api *PacketFilterAPI) WithSharedScope() *PacketFilterAPI { +// api.FilterBy("Scope", "shared") +// return api +// } + +// func (api *PacketFilterAPI) WithUserScope() *PacketFilterAPI { +// api.FilterBy("Scope", "user") +// return api +// } + +// SortBy 指定キーでのソート +func (api *PacketFilterAPI) SortBy(key string, reverse bool) *PacketFilterAPI { + api.sortBy(key, reverse) + return api +} + +// SortByName 名称でのソート +func (api *PacketFilterAPI) SortByName(reverse bool) *PacketFilterAPI { + api.sortByName(reverse) + return api +} + +// func (api *PacketFilterAPI) SortBySize(reverse bool) *PacketFilterAPI { +// api.sortBy("SizeMB", reverse) +// return api +// } + +/************************************************ + To support Setxxx interface for Find() +************************************************/ + +// SetEmpty 検索条件のリセット +func (api *PacketFilterAPI) SetEmpty() { + api.reset() +} + +// SetOffset オフセット +func (api *PacketFilterAPI) SetOffset(offset int) { + api.offset(offset) +} + +// SetLimit リミット +func (api *PacketFilterAPI) SetLimit(limit int) { + api.limit(limit) +} + +// SetInclude 取得する項目 +func (api *PacketFilterAPI) SetInclude(key string) { + api.include(key) +} + +// SetExclude 除外する項目 +func (api *PacketFilterAPI) SetExclude(key string) { + api.exclude(key) +} + +// SetFilterBy 指定キーでのフィルター +func (api *PacketFilterAPI) SetFilterBy(key string, value interface{}) { + api.filterBy(key, value, false) +} + +// SetFilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *PacketFilterAPI) SetFilterMultiBy(key string, value interface{}) { + api.filterBy(key, value, true) +} + +// SetNameLike 名称条件 +func (api *PacketFilterAPI) SetNameLike(name string) { + api.FilterBy("Name", name) +} + +// SetTag タグ条件 +func (api *PacketFilterAPI) SetTag(tag string) { + api.FilterBy("Tags.Name", tag) +} + +// SetTags タグ(複数)条件 +func (api *PacketFilterAPI) SetTags(tags []string) { + api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *PacketFilterAPI) SetSizeGib(size int) { +// api.FilterBy("SizeMB", size*1024) +// } + +// func (api *PacketFilterAPI) SetSharedScope() { +// api.FilterBy("Scope", "shared") +// } + +// func (api *PacketFilterAPI) SetUserScope() { +// api.FilterBy("Scope", "user") +// } + +// SetSortBy 指定キーでのソート +func (api *PacketFilterAPI) SetSortBy(key string, reverse bool) { + api.sortBy(key, reverse) +} + +// SetSortByName 名称でのソート +func (api *PacketFilterAPI) SetSortByName(reverse bool) { + api.sortByName(reverse) +} + +// func (api *PacketFilterAPI) SetSortBySize(reverse bool) { +// api.sortBy("SizeMB", reverse) +// } + +/************************************************ + To support CRUD(Create/Read/Update/Delete) +************************************************/ + +// New 新規作成用パラメーター作成 +func (api *PacketFilterAPI) New() *sacloud.PacketFilter { + return sacloud.CreateNewPacketFilter() +} + +// Create 新規作成 +func (api *PacketFilterAPI) Create(value *sacloud.PacketFilter) (*sacloud.PacketFilter, error) { + return api.request(func(res *sacloud.Response) error { + return api.create(api.createRequest(value), res) + }) +} + +// Read 読み取り +func (api *PacketFilterAPI) Read(id int64) (*sacloud.PacketFilter, error) { + return api.request(func(res *sacloud.Response) error { + return api.read(id, nil, res) + }) +} + +// Update 更新 +func (api *PacketFilterAPI) Update(id int64, value *sacloud.PacketFilter) (*sacloud.PacketFilter, error) { + return api.request(func(res *sacloud.Response) error { + return api.update(id, api.createRequest(value), res) + }) +} + +// Delete 削除 +func (api *PacketFilterAPI) Delete(id int64) (*sacloud.PacketFilter, error) { + return api.request(func(res *sacloud.Response) error { + return api.delete(id, nil, res) + }) +} + +/************************************************ + Inner functions +************************************************/ + +func (api *PacketFilterAPI) setStateValue(setFunc func(*sacloud.Request)) *PacketFilterAPI { + api.baseAPI.setStateValue(setFunc) + return api +} + +func (api *PacketFilterAPI) request(f func(*sacloud.Response) error) (*sacloud.PacketFilter, error) { + res := &sacloud.Response{} + err := f(res) + if err != nil { + return nil, err + } + return res.PacketFilter, nil +} + +func (api *PacketFilterAPI) createRequest(value *sacloud.PacketFilter) *sacloud.Request { + req := &sacloud.Request{} + req.PacketFilter = value + return req +} diff --git a/vendor/github.com/sacloud/libsacloud/api/polling.go b/vendor/github.com/sacloud/libsacloud/api/polling.go new file mode 100644 index 00000000..bdff6bd4 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/polling.go @@ -0,0 +1,156 @@ +package api + +import ( + "fmt" + "time" +) + +type pollingHandler func() (exit bool, state interface{}, err error) + +func poll(handler pollingHandler, timeout time.Duration) (chan (interface{}), chan (interface{}), chan (error)) { + + compChan := make(chan interface{}) + progChan := make(chan interface{}) + errChan := make(chan error) + + tick := time.Tick(5 * time.Second) + bomb := time.After(timeout) + + go func() { + for { + select { + case <-tick: + exit, state, err := handler() + if err != nil { + errChan <- fmt.Errorf("Failed: poll: %s", err) + return + } + if state != nil { + progChan <- state + if exit { + compChan <- state + return + } + } + case <-bomb: + errChan <- fmt.Errorf("Timeout") + return + } + } + }() + return compChan, progChan, errChan +} + +func blockingPoll(handler pollingHandler, timeout time.Duration) error { + c, p, e := poll(handler, timeout) + for { + select { + case <-c: + return nil + case <-p: + // noop + case err := <-e: + return err + } + } +} + +type hasAvailable interface { + IsAvailable() bool +} +type hasFailed interface { + IsFailed() bool +} + +func waitingForAvailableFunc(readFunc func() (hasAvailable, error), maxRetry int) func() (bool, interface{}, error) { + counter := 0 + return func() (bool, interface{}, error) { + counter++ + v, err := readFunc() + if err != nil { + if maxRetry > 0 && counter < maxRetry { + return false, nil, nil + } + return false, nil, err + } + if v == nil { + return false, nil, fmt.Errorf("readFunc returns nil") + } + + if v.IsAvailable() { + return true, v, nil + } + if f, ok := v.(hasFailed); ok && f.IsFailed() { + return false, v, fmt.Errorf("InstanceState is failed: %#v", v) + } + + return false, v, nil + } +} + +type hasUpDown interface { + IsUp() bool + IsDown() bool +} + +func waitingForUpFunc(readFunc func() (hasUpDown, error), maxRetry int) func() (bool, interface{}, error) { + counter := 0 + return func() (bool, interface{}, error) { + counter++ + v, err := readFunc() + if err != nil { + if maxRetry > 0 && counter < maxRetry { + return false, nil, nil + } + return false, nil, err + } + if v == nil { + return false, nil, fmt.Errorf("readFunc returns nil") + } + + if v.IsUp() { + return true, v, nil + } + return false, v, nil + } +} + +func waitingForDownFunc(readFunc func() (hasUpDown, error), maxRetry int) func() (bool, interface{}, error) { + counter := 0 + return func() (bool, interface{}, error) { + counter++ + v, err := readFunc() + if err != nil { + if maxRetry > 0 && counter < maxRetry { + return false, nil, nil + } + return false, nil, err + } + if v == nil { + return false, nil, fmt.Errorf("readFunc returns nil") + } + + if v.IsDown() { + return true, v, nil + } + return false, v, nil + } +} + +func waitingForReadFunc(readFunc func() (interface{}, error), maxRetry int) func() (bool, interface{}, error) { + counter := 0 + return func() (bool, interface{}, error) { + counter++ + v, err := readFunc() + if err != nil { + if maxRetry > 0 && counter < maxRetry { + return false, nil, nil + } + return false, nil, err + } + if v != nil { + return true, v, nil + } + return false, v, nil + } +} diff --git a/vendor/github.com/sacloud/libsacloud/api/private_host.go b/vendor/github.com/sacloud/libsacloud/api/private_host.go new file mode 100644 index 00000000..18bef306 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/private_host.go @@ -0,0 +1,18 @@ +package api + +// PrivateHostAPI 専有ホストAPI +type PrivateHostAPI struct { + *baseAPI +} + +// NewPrivateHostAPI 専有ホストAPI作成 +func NewPrivateHostAPI(client *Client) *PrivateHostAPI { + return &PrivateHostAPI{ + &baseAPI{ + client: client, + FuncGetResourceURL: func() string { + return "privatehost" + }, + }, + } +} diff --git a/vendor/github.com/sacloud/libsacloud/api/private_host_gen.go b/vendor/github.com/sacloud/libsacloud/api/private_host_gen.go new file mode 100644 index 00000000..4159dc9d --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/private_host_gen.go @@ -0,0 +1,243 @@ +package api + +/************************************************ + generated by IDE. for [PrivateHostAPI] +************************************************/ + +import ( + "github.com/sacloud/libsacloud/sacloud" +) + +/************************************************ + To support fluent interface for Find() +************************************************/ + +// Reset 検索条件リセット +func (api *PrivateHostAPI) Reset() *PrivateHostAPI { + api.reset() + return api +} + +// Offset オフセット +func (api *PrivateHostAPI) Offset(offset int) *PrivateHostAPI { + api.offset(offset) + return api +} + +// Limit リミット +func (api *PrivateHostAPI) Limit(limit int) *PrivateHostAPI { + api.limit(limit) + return api +} + +// Include 取得する項目 +func (api *PrivateHostAPI) Include(key string) *PrivateHostAPI { + api.include(key) + return api +} + +// Exclude 除外する項目 +func (api *PrivateHostAPI) Exclude(key string) *PrivateHostAPI { + api.exclude(key) + return api +} + +// FilterBy 指定キーでのフィルター +func (api *PrivateHostAPI) FilterBy(key string, value interface{}) *PrivateHostAPI { + api.filterBy(key, value, false) + return api +} + +// FilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *PrivateHostAPI) FilterMultiBy(key string, value interface{}) *PrivateHostAPI { + api.filterBy(key, value, true) + return api +} + +// WithNameLike 名称条件 +func (api *PrivateHostAPI) WithNameLike(name string) *PrivateHostAPI { + return api.FilterBy("Name", name) +} + +// WithTag タグ条件 +func (api *PrivateHostAPI) WithTag(tag string) *PrivateHostAPI { + return api.FilterBy("Tags.Name", tag) +} + +// WithTags タグ(複数)条件 +func (api *PrivateHostAPI) WithTags(tags []string) *PrivateHostAPI { + return api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *PrivateHostAPI) WithSizeGib(size int) *PrivateHostAPI { +// api.FilterBy("SizeMB", size*1024) +// return api +// } + +// func (api *PrivateHostAPI) WithSharedScope() *PrivateHostAPI { +// api.FilterBy("Scope", "shared") +// return api +// } + +// func (api *PrivateHostAPI) WithUserScope() *PrivateHostAPI { +// api.FilterBy("Scope", "user") +// return api +// } + +// SortBy 指定キーでのソート +func (api *PrivateHostAPI) SortBy(key string, reverse bool) *PrivateHostAPI { + api.sortBy(key, reverse) + return api +} + +// SortByName 名称でのソート +func (api *PrivateHostAPI) SortByName(reverse bool) *PrivateHostAPI { + api.sortByName(reverse) + return api +} + +// func (api *PrivateHostAPI) SortBySize(reverse bool) *PrivateHostAPI { +// api.sortBy("SizeMB", reverse) +// return api +// } + +/************************************************ + To support Setxxx interface for Find() +************************************************/ + +// SetEmpty 検索条件リセット +func (api *PrivateHostAPI) SetEmpty() { + api.reset() +} + +// SetOffset オフセット +func (api *PrivateHostAPI) SetOffset(offset int) { + api.offset(offset) +} + +// SetLimit リミット +func (api *PrivateHostAPI) SetLimit(limit int) { + api.limit(limit) +} + +// SetInclude 取得する項目 +func (api *PrivateHostAPI) SetInclude(key string) { + api.include(key) +} + +// SetExclude 除外する項目 +func (api *PrivateHostAPI) SetExclude(key string) { + api.exclude(key) +} + +// SetFilterBy 指定キーでのフィルター +func (api *PrivateHostAPI) SetFilterBy(key string, value interface{}) { + api.filterBy(key, value, false) +} + +// SetFilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *PrivateHostAPI) SetFilterMultiBy(key string, value interface{}) { + api.filterBy(key, value, true) +} + +// SetNameLike 名称条件 +func (api *PrivateHostAPI) SetNameLike(name string) { + api.FilterBy("Name", name) +} + +// SetTag タグ条件 +func (api *PrivateHostAPI) SetTag(tag string) { + api.FilterBy("Tags.Name", tag) +} + +// SetTags タグ(複数)条件 +func (api *PrivateHostAPI) SetTags(tags []string) { + api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *PrivateHostAPI) SetSizeGib(size int) { +// api.FilterBy("SizeMB", size*1024) +// } + +// func (api *PrivateHostAPI) SetSharedScope() { +// api.FilterBy("Scope", "shared") +// } + +// func (api *PrivateHostAPI) SetUserScope() { +// api.FilterBy("Scope", "user") +// } + +// SetSortBy 指定キーでのソート +func (api *PrivateHostAPI) SetSortBy(key string, reverse bool) { + api.sortBy(key, reverse) +} + +// SetSortByName 名称でのソート +func (api *PrivateHostAPI) SetSortByName(reverse bool) { + api.sortByName(reverse) +} + +// func (api *PrivateHostAPI) SortBySize(reverse bool) { +// api.sortBy("SizeMB", reverse) +// } + +/************************************************ + To support CRUD(Create/Read/Update/Delete) +************************************************/ + +// New 新規作成用パラメーター作成 +func (api *PrivateHostAPI) New() *sacloud.PrivateHost { + return &sacloud.PrivateHost{} +} + +// Create 新規作成 +func (api *PrivateHostAPI) Create(value *sacloud.PrivateHost) (*sacloud.PrivateHost, error) { + return api.request(func(res *sacloud.Response) error { + return api.create(api.createRequest(value), res) + }) +} + +// Read 読み取り +func (api *PrivateHostAPI) Read(id int64) (*sacloud.PrivateHost, error) { + return api.request(func(res *sacloud.Response) error { + return api.read(id, nil, res) + }) +} + +// Update 更新 +func (api *PrivateHostAPI) Update(id int64, value *sacloud.PrivateHost) (*sacloud.PrivateHost, error) { + return api.request(func(res *sacloud.Response) error { + return api.update(id, api.createRequest(value), res) + }) +} + +// Delete 削除 +func (api *PrivateHostAPI) Delete(id int64) (*sacloud.PrivateHost, error) { + return api.request(func(res *sacloud.Response) error { + return api.delete(id, nil, res) + }) +} + +/************************************************ + Inner functions +************************************************/ + +func (api *PrivateHostAPI) setStateValue(setFunc func(*sacloud.Request)) *PrivateHostAPI { + api.baseAPI.setStateValue(setFunc) + return api +} + +func (api *PrivateHostAPI) request(f func(*sacloud.Response) error) (*sacloud.PrivateHost, error) { + res := &sacloud.Response{} + err := f(res) + if err != nil { + return nil, err + } + return res.PrivateHost, nil +} + +func (api *PrivateHostAPI) createRequest(value *sacloud.PrivateHost) *sacloud.Request { + req := &sacloud.Request{} + req.PrivateHost = value + return req +} diff --git a/vendor/github.com/sacloud/libsacloud/api/product_disk.go b/vendor/github.com/sacloud/libsacloud/api/product_disk.go new file mode 100644 index 00000000..1cf850d6 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/product_disk.go @@ -0,0 +1,18 @@ +package api + +// ProductDiskAPI ディスクプランAPI +type ProductDiskAPI struct { + *baseAPI +} + +// NewProductDiskAPI ディスクプランAPI作成 +func NewProductDiskAPI(client *Client) *ProductDiskAPI { + return &ProductDiskAPI{ + &baseAPI{ + client: client, + FuncGetResourceURL: func() string { + return "product/disk" + }, + }, + } +} diff --git a/vendor/github.com/sacloud/libsacloud/api/product_disk_gen.go b/vendor/github.com/sacloud/libsacloud/api/product_disk_gen.go new file mode 100644 index 00000000..5fcbd5fa --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/product_disk_gen.go @@ -0,0 +1,239 @@ +package api + +/************************************************ + generated by IDE. for [ProductDiskAPI] +************************************************/ + +import ( + "github.com/sacloud/libsacloud/sacloud" +) + +/************************************************ + To support fluent interface for Find() +************************************************/ + +// Reset 検索条件のリセット +func (api *ProductDiskAPI) Reset() *ProductDiskAPI { + api.reset() + return api +} + +// Offset オフセット +func (api *ProductDiskAPI) Offset(offset int) *ProductDiskAPI { + api.offset(offset) + return api +} + +// Limit リミット +func (api *ProductDiskAPI) Limit(limit int) *ProductDiskAPI { + api.limit(limit) + return api +} + +// Include 取得する項目 +func (api *ProductDiskAPI) Include(key string) *ProductDiskAPI { + api.include(key) + return api +} + +// Exclude 除外する項目 +func (api *ProductDiskAPI) Exclude(key string) *ProductDiskAPI { + api.exclude(key) + return api +} + +// FilterBy 指定キーでのフィルター +func (api *ProductDiskAPI) FilterBy(key string, value interface{}) *ProductDiskAPI { + api.filterBy(key, value, false) + return api +} + +// FilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *ProductDiskAPI) FilterMultiBy(key string, value interface{}) *ProductDiskAPI { + api.filterBy(key, value, true) + return api +} + +// WithNameLike 名称条件 +func (api *ProductDiskAPI) WithNameLike(name string) *ProductDiskAPI { + return api.FilterBy("Name", name) +} + +// WithTag タグ条件 +func (api *ProductDiskAPI) WithTag(tag string) *ProductDiskAPI { + return api.FilterBy("Tags.Name", tag) +} + +// WithTags タグ(複数)条件 +func (api *ProductDiskAPI) WithTags(tags []string) *ProductDiskAPI { + return api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *ProductDiskAPI) WithSizeGib(size int) *ProductDiskAPI { +// api.FilterBy("SizeMB", size*1024) +// return api +// } + +// func (api *ProductDiskAPI) WithSharedScope() *ProductDiskAPI { +// api.FilterBy("Scope", "shared") +// return api +// } + +// func (api *ProductDiskAPI) WithUserScope() *ProductDiskAPI { +// api.FilterBy("Scope", "user") +// return api +// } + +// SortBy 指定キーでのソート +func (api *ProductDiskAPI) SortBy(key string, reverse bool) *ProductDiskAPI { + api.sortBy(key, reverse) + return api +} + +// SortByName 名称でのソート +func (api *ProductDiskAPI) SortByName(reverse bool) *ProductDiskAPI { + api.sortByName(reverse) + return api +} + +// func (api *ProductDiskAPI) SortBySize(reverse bool) *ProductDiskAPI { +// api.sortBy("SizeMB", reverse) +// return api +// } + +/************************************************ + To support Setxxx interface for Find() +************************************************/ + +// SetEmpty 検索条件のリセット +func (api *ProductDiskAPI) SetEmpty() { + api.reset() +} + +// SetOffset オフセット +func (api *ProductDiskAPI) SetOffset(offset int) { + api.offset(offset) +} + +// SetLimit リミット +func (api *ProductDiskAPI) SetLimit(limit int) { + api.limit(limit) +} + +// SetInclude 取得する項目 +func (api *ProductDiskAPI) SetInclude(key string) { + api.include(key) +} + +// SetExclude 除外する項目 +func (api *ProductDiskAPI) SetExclude(key string) { + api.exclude(key) +} + +// SetFilterBy 指定キーでのフィルター +func (api *ProductDiskAPI) SetFilterBy(key string, value interface{}) { + api.filterBy(key, value, false) +} + +// SetFilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *ProductDiskAPI) SetFilterMultiBy(key string, value interface{}) { + api.filterBy(key, value, true) +} + +// SetNameLike 名称条件 +func (api *ProductDiskAPI) SetNameLike(name string) { + api.FilterBy("Name", name) +} + +// SetTag タグ条件 +func (api *ProductDiskAPI) SetTag(tag string) { + api.FilterBy("Tags.Name", tag) +} + +// SetTags タグ(複数)条件 +func (api *ProductDiskAPI) SetTags(tags []string) { + api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *ProductDiskAPI) SetSizeGib(size int) { +// api.FilterBy("SizeMB", size*1024) +// } + +// func (api *ProductDiskAPI) SetSharedScope() { +// api.FilterBy("Scope", "shared") +// } + +// func (api *ProductDiskAPI) SetUserScope() { +// api.FilterBy("Scope", "user") +// } + +// SetSortBy 指定キーでのソート +func (api *ProductDiskAPI) SetSortBy(key string, reverse bool) { + api.sortBy(key, reverse) +} + +// SetSortByName 名称でのソート +func (api *ProductDiskAPI) SetSortByName(reverse bool) { + api.sortByName(reverse) +} + +// func (api *ProductDiskAPI) SetSortBySize(reverse bool) { +// api.sortBy("SizeMB", reverse) +// } + +/************************************************ + To support CRUD(Create/Read/Update/Delete) +************************************************/ + +// func (api *ProductDiskAPI) New() *sacloud.ProductDisk { +// return &sacloud.ProductDisk{} +// } + +// func (api *ProductDiskAPI) Create(value *sacloud.ProductDisk) (*sacloud.ProductDisk, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.create(api.createRequest(value), res) +// }) +// } + +// Read 読み取り +func (api *ProductDiskAPI) Read(id int64) (*sacloud.ProductDisk, error) { + return api.request(func(res *sacloud.Response) error { + return api.read(id, nil, res) + }) +} + +// func (api *ProductDiskAPI) Update(id int64, value *sacloud.ProductDisk) (*sacloud.ProductDisk, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.update(id, api.createRequest(value), res) +// }) +// } + +// func (api *ProductDiskAPI) Delete(id int64) (*sacloud.ProductDisk, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.delete(id, nil, res) +// }) +// } + +/************************************************ + Inner functions +************************************************/ + +func (api *ProductDiskAPI) setStateValue(setFunc func(*sacloud.Request)) *ProductDiskAPI { + api.baseAPI.setStateValue(setFunc) + return api +} + +func (api *ProductDiskAPI) request(f func(*sacloud.Response) error) (*sacloud.ProductDisk, error) { + res := &sacloud.Response{} + err := f(res) + if err != nil { + return nil, err + } + return res.DiskPlan, nil +} + +func (api *ProductDiskAPI) createRequest(value *sacloud.ProductDisk) *sacloud.Request { + req := &sacloud.Request{} + req.DiskPlan = value + return req +} diff --git a/vendor/github.com/sacloud/libsacloud/api/product_internet.go b/vendor/github.com/sacloud/libsacloud/api/product_internet.go new file mode 100644 index 00000000..a80c1121 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/product_internet.go @@ -0,0 +1,18 @@ +package api + +// ProductInternetAPI ルータープランAPI +type ProductInternetAPI struct { + *baseAPI +} + +// NewProductInternetAPI ルータープランAPI作成 +func NewProductInternetAPI(client *Client) *ProductInternetAPI { + return &ProductInternetAPI{ + &baseAPI{ + client: client, + FuncGetResourceURL: func() string { + return "product/internet" + }, + }, + } +} diff --git a/vendor/github.com/sacloud/libsacloud/api/product_internet_gen.go b/vendor/github.com/sacloud/libsacloud/api/product_internet_gen.go new file mode 100644 index 00000000..c1a0d134 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/product_internet_gen.go @@ -0,0 +1,239 @@ +package api + +/************************************************ + generated by IDE. for [ProductInternetAPI] +************************************************/ + +import ( + "github.com/sacloud/libsacloud/sacloud" +) + +/************************************************ + To support Setxxx interface for Find() +************************************************/ + +// SetEmpty 検索条件のリセット +func (api *ProductInternetAPI) SetEmpty() { + api.reset() +} + +// SetOffset オフセット +func (api *ProductInternetAPI) SetOffset(offset int) { + api.offset(offset) +} + +// SetLimit リミット +func (api *ProductInternetAPI) SetLimit(limit int) { + api.limit(limit) +} + +// SetInclude 取得する項目 +func (api *ProductInternetAPI) SetInclude(key string) { + api.include(key) +} + +// SetExclude 除外する項目 +func (api *ProductInternetAPI) SetExclude(key string) { + api.exclude(key) +} + +// SetFilterBy 指定キーでのフィルター +func (api *ProductInternetAPI) SetFilterBy(key string, value interface{}) { + api.filterBy(key, value, false) +} + +// SetFilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *ProductInternetAPI) SetFilterMultiBy(key string, value interface{}) { + api.filterBy(key, value, true) +} + +// SetNameLike 名称条件 +func (api *ProductInternetAPI) SetNameLike(name string) { + api.FilterBy("Name", name) +} + +// SetTag タグ条件 +func (api *ProductInternetAPI) SetTag(tag string) { + api.FilterBy("Tags.Name", tag) +} + +// SetTags タグ(複数)条件 +func (api *ProductInternetAPI) SetTags(tags []string) { + api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *ProductInternetAPI) SetSizeGib(size int) { +// api.FilterBy("SizeMB", size*1024) +// } + +// func (api *ProductInternetAPI) SetSharedScope() { +// api.FilterBy("Scope", "shared") +// } + +// func (api *ProductInternetAPI) SetUserScope() { +// api.FilterBy("Scope", "user") +// } + +// SetSortBy 指定キーでのソート +func (api *ProductInternetAPI) SetSortBy(key string, reverse bool) { + api.sortBy(key, reverse) +} + +// SetSortByName 名称でのソート +func (api *ProductInternetAPI) SetSortByName(reverse bool) { + api.sortByName(reverse) +} + +// func (api *ProductInternetAPI) SetSortBySize(reverse bool) { +// api.sortBy("SizeMB", reverse) +// } + +/************************************************ + To support fluent interface for Find() +************************************************/ + +// Reset 検索条件のリセット +func (api *ProductInternetAPI) Reset() *ProductInternetAPI { + api.reset() + return api +} + +// Offset オフセット +func (api *ProductInternetAPI) Offset(offset int) *ProductInternetAPI { + api.offset(offset) + return api +} + +// Limit リミット +func (api *ProductInternetAPI) Limit(limit int) *ProductInternetAPI { + api.limit(limit) + return api +} + +// Include 取得する項目 +func (api *ProductInternetAPI) Include(key string) *ProductInternetAPI { + api.include(key) + return api +} + +// Exclude 除外する項目 +func (api *ProductInternetAPI) Exclude(key string) *ProductInternetAPI { + api.exclude(key) + return api +} + +// FilterBy 指定キーでのフィルター +func (api *ProductInternetAPI) FilterBy(key string, value interface{}) *ProductInternetAPI { + api.filterBy(key, value, false) + return api +} + +// FilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *ProductInternetAPI) FilterMultiBy(key string, value interface{}) *ProductInternetAPI { + api.filterBy(key, value, true) + return api +} + +// WithNameLike 名称条件 +func (api *ProductInternetAPI) WithNameLike(name string) *ProductInternetAPI { + return api.FilterBy("Name", name) +} + +// WithTag タグ条件 +func (api *ProductInternetAPI) WithTag(tag string) *ProductInternetAPI { + return api.FilterBy("Tags.Name", tag) +} + +// WithTags タグ(複数)条件 +func (api *ProductInternetAPI) WithTags(tags []string) *ProductInternetAPI { + return api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *ProductInternetAPI) WithSizeGib(size int) *ProductInternetAPI { +// api.FilterBy("SizeMB", size*1024) +// return api +// } + +// func (api *ProductInternetAPI) WithSharedScope() *ProductInternetAPI { +// api.FilterBy("Scope", "shared") +// return api +// } + +// func (api *ProductInternetAPI) WithUserScope() *ProductInternetAPI { +// api.FilterBy("Scope", "user") +// return api +// } + +// SortBy 指定キーでのソート +func (api *ProductInternetAPI) SortBy(key string, reverse bool) *ProductInternetAPI { + api.sortBy(key, reverse) + return api +} + +// SortByName 名称でのソート +func (api *ProductInternetAPI) SortByName(reverse bool) *ProductInternetAPI { + api.sortByName(reverse) + return api +} + +// func (api *ProductInternetAPI) SortBySize(reverse bool) *ProductInternetAPI { +// api.sortBy("SizeMB", reverse) +// return api +// } + +/************************************************ + To support CRUD(Create/Read/Update/Delete) +************************************************/ + +//func (api *ProductInternetAPI) New() *sacloud.ProductInternet { +// return &sacloud.ProductInternet{} +//} + +// func (api *ProductInternetAPI) Create(value *sacloud.ProductInternet) (*sacloud.ProductInternet, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.create(api.createRequest(value), res) +// }) +// } + +// Read 読み取り +func (api *ProductInternetAPI) Read(id int64) (*sacloud.ProductInternet, error) { + return api.request(func(res *sacloud.Response) error { + return api.read(id, nil, res) + }) +} + +// func (api *ProductInternetAPI) Update(id int64, value *sacloud.ProductInternet) (*sacloud.ProductInternet, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.update(id, api.createRequest(value), res) +// }) +// } + +// func (api *ProductInternetAPI) Delete(id int64) (*sacloud.ProductInternet, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.delete(id, nil, res) +// }) +// } + +/************************************************ + Inner functions +************************************************/ + +func (api *ProductInternetAPI) setStateValue(setFunc func(*sacloud.Request)) *ProductInternetAPI { + api.baseAPI.setStateValue(setFunc) + return api +} + +func (api *ProductInternetAPI) request(f func(*sacloud.Response) error) (*sacloud.ProductInternet, error) { + res := &sacloud.Response{} + err := f(res) + if err != nil { + return nil, err + } + return res.InternetPlan, nil +} + +func (api *ProductInternetAPI) createRequest(value *sacloud.ProductInternet) *sacloud.Request { + req := &sacloud.Request{} + req.InternetPlan = value + return req +} diff --git a/vendor/github.com/sacloud/libsacloud/api/product_license.go b/vendor/github.com/sacloud/libsacloud/api/product_license.go new file mode 100644 index 00000000..c4ec9298 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/product_license.go @@ -0,0 +1,18 @@ +package api + +// ProductLicenseAPI ライセンスプランAPI +type ProductLicenseAPI struct { + *baseAPI +} + +// NewProductLicenseAPI ライセンスプランAPI作成 +func NewProductLicenseAPI(client *Client) *ProductLicenseAPI { + return &ProductLicenseAPI{ + &baseAPI{ + client: client, + FuncGetResourceURL: func() string { + return "product/license" + }, + }, + } +} diff --git a/vendor/github.com/sacloud/libsacloud/api/product_license_gen.go b/vendor/github.com/sacloud/libsacloud/api/product_license_gen.go new file mode 100644 index 00000000..ad017c35 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/product_license_gen.go @@ -0,0 +1,235 @@ +package api + +/************************************************ + generated by IDE. for [ProductLicenseAPI] +************************************************/ + +import ( + "github.com/sacloud/libsacloud/sacloud" +) + +/************************************************ + To support fluent interface for Find() +************************************************/ + +// Reset 検索条件のリセット +func (api *ProductLicenseAPI) Reset() *ProductLicenseAPI { + api.reset() + return api +} + +// Offset オフセット +func (api *ProductLicenseAPI) Offset(offset int) *ProductLicenseAPI { + api.offset(offset) + return api +} + +// Limit リミット +func (api *ProductLicenseAPI) Limit(limit int) *ProductLicenseAPI { + api.limit(limit) + return api +} + +// Include 取得する項目 +func (api *ProductLicenseAPI) Include(key string) *ProductLicenseAPI { + api.include(key) + return api +} + +// Exclude 除外する項目 +func (api *ProductLicenseAPI) Exclude(key string) *ProductLicenseAPI { + api.exclude(key) + return api +} + +// FilterBy 指定キーでのフィルター +func (api *ProductLicenseAPI) FilterBy(key string, value interface{}) *ProductLicenseAPI { + api.filterBy(key, value, false) + return api +} + +// FilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *ProductLicenseAPI) FilterMultiBy(key string, value interface{}) *ProductLicenseAPI { + api.filterBy(key, value, true) + return api +} + +// WithNameLike 名称条件 +func (api *ProductLicenseAPI) WithNameLike(name string) *ProductLicenseAPI { + return api.FilterBy("Name", name) +} + +// WithTag タグ条件 +func (api *ProductLicenseAPI) WithTag(tag string) *ProductLicenseAPI { + return api.FilterBy("Tags.Name", tag) +} + +// WithTags タグ(複数)条件 +func (api *ProductLicenseAPI) WithTags(tags []string) *ProductLicenseAPI { + return api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *ProductLicenseAPI) WithSizeGib(size int) *ProductLicenseAPI { +// api.FilterBy("SizeMB", size*1024) +// return api +// } + +// func (api *ProductLicenseAPI) WithSharedScope() *ProductLicenseAPI { +// api.FilterBy("Scope", "shared") +// return api +// } + +// func (api *ProductLicenseAPI) WithUserScope() *ProductLicenseAPI { +// api.FilterBy("Scope", "user") +// return api +// } + +// SortBy 指定キーでのソート +func (api *ProductLicenseAPI) SortBy(key string, reverse bool) *ProductLicenseAPI { + api.sortBy(key, reverse) + return api +} + +// SortByName 名称でのソート +func (api *ProductLicenseAPI) SortByName(reverse bool) *ProductLicenseAPI { + api.sortByName(reverse) + return api +} + +// func (api *ProductLicenseAPI) SortBySize(reverse bool) *ProductLicenseAPI { +// api.sortBy("SizeMB", reverse) +// return api +// } + +/************************************************ + To support Setxxx interface for Find() +************************************************/ + +// SetEmpty 検索条件のリセット +func (api *ProductLicenseAPI) SetEmpty() { + api.reset() +} + +// SetOffset オフセット +func (api *ProductLicenseAPI) SetOffset(offset int) { + api.offset(offset) +} + +// SetLimit リミット +func (api *ProductLicenseAPI) SetLimit(limit int) { + api.limit(limit) +} + +// SetInclude 取得する項目 +func (api *ProductLicenseAPI) SetInclude(key string) { + api.include(key) +} + +// SetExclude 除外する項目 +func (api *ProductLicenseAPI) SetExclude(key string) { + api.exclude(key) +} + +// SetFilterBy 指定キーでのフィルター +func (api *ProductLicenseAPI) SetFilterBy(key string, value interface{}) { + api.filterBy(key, value, false) +} + +// SetFilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *ProductLicenseAPI) SetFilterMultiBy(key string, value interface{}) { + api.filterBy(key, value, true) +} + +// SetNameLike 名称条件 +func (api *ProductLicenseAPI) SetNameLike(name string) { + api.FilterBy("Name", name) +} + +// SetTag タグ条件 +func (api *ProductLicenseAPI) SetTag(tag string) { + api.FilterBy("Tags.Name", tag) +} + +// SetTags タグ(複数)条件 +func (api *ProductLicenseAPI) SetTags(tags []string) { + api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *ProductLicenseAPI) SetSizeGib(size int) { +// api.FilterBy("SizeMB", size*1024) +// } + +// func (api *ProductLicenseAPI) SetSharedScope() { +// api.FilterBy("Scope", "shared") +// } + +// func (api *ProductLicenseAPI) SetUserScope() { +// api.FilterBy("Scope", "user") +// } + +// SetSortBy 指定キーでのソート +func (api *ProductLicenseAPI) SetSortBy(key string, reverse bool) { + api.sortBy(key, reverse) +} + +// SetSortByName 名称でのソート +func (api *ProductLicenseAPI) SetSortByName(reverse bool) { + api.sortByName(reverse) +} + +// func (api *ProductLicenseAPI) SetSortBySize(reverse bool) { +// api.sortBy("SizeMB", reverse) +// } + +/************************************************ + To support CRUD(Create/Read/Update/Delete) +************************************************/ + +// func (api *ProductLicenseAPI) Create(value *sacloud.ProductLicense) (*sacloud.ProductLicense, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.create(api.createRequest(value), res) +// }) +// } + +// Read 読み取り +func (api *ProductLicenseAPI) Read(id int64) (*sacloud.ProductLicense, error) { + return api.request(func(res *sacloud.Response) error { + return api.read(id, nil, res) + }) +} + +// func (api *ProductLicenseAPI) Update(id int64, value *sacloud.ProductLicense) (*sacloud.ProductLicense, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.update(id, api.createRequest(value), res) +// }) +// } + +// func (api *ProductLicenseAPI) Delete(id int64) (*sacloud.ProductLicense, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.delete(id, nil, res) +// }) +// } + +/************************************************ + Inner functions +************************************************/ + +func (api *ProductLicenseAPI) setStateValue(setFunc func(*sacloud.Request)) *ProductLicenseAPI { + api.baseAPI.setStateValue(setFunc) + return api +} + +func (api *ProductLicenseAPI) request(f func(*sacloud.Response) error) (*sacloud.ProductLicense, error) { + res := &sacloud.Response{} + err := f(res) + if err != nil { + return nil, err + } + return res.LicenseInfo, nil +} + +func (api *ProductLicenseAPI) createRequest(value *sacloud.ProductLicense) *sacloud.Request { + req := &sacloud.Request{} + req.LicenseInfo = value + return req +} diff --git a/vendor/github.com/sacloud/libsacloud/api/product_private_host.go b/vendor/github.com/sacloud/libsacloud/api/product_private_host.go new file mode 100644 index 00000000..01f9a313 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/product_private_host.go @@ -0,0 +1,19 @@ +package api + +// ProductPrivateHostAPI 専有ホストプランAPI +type ProductPrivateHostAPI struct { + *baseAPI +} + +// NewProductPrivateHostAPI 専有ホストプランAPI作成 +func NewProductPrivateHostAPI(client *Client) *ProductPrivateHostAPI { + return &ProductPrivateHostAPI{ + &baseAPI{ + client: client, + // FuncGetResourceURL + FuncGetResourceURL: func() string { + return "product/privatehost" + }, + }, + } +} diff --git a/vendor/github.com/sacloud/libsacloud/api/product_private_host_gen.go b/vendor/github.com/sacloud/libsacloud/api/product_private_host_gen.go new file mode 100644 index 00000000..ef037709 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/product_private_host_gen.go @@ -0,0 +1,239 @@ +package api + +/************************************************ + generated by IDE. for [ProductPrivateHostAPI] +************************************************/ + +import ( + "github.com/sacloud/libsacloud/sacloud" +) + +/************************************************ + To support fluent interface for Find() +************************************************/ + +// Reset 検索条件のリセット +func (api *ProductPrivateHostAPI) Reset() *ProductPrivateHostAPI { + api.reset() + return api +} + +// Offset オフセット +func (api *ProductPrivateHostAPI) Offset(offset int) *ProductPrivateHostAPI { + api.offset(offset) + return api +} + +// Limit リミット +func (api *ProductPrivateHostAPI) Limit(limit int) *ProductPrivateHostAPI { + api.limit(limit) + return api +} + +// Include 取得する項目 +func (api *ProductPrivateHostAPI) Include(key string) *ProductPrivateHostAPI { + api.include(key) + return api +} + +// Exclude 除外する項目 +func (api *ProductPrivateHostAPI) Exclude(key string) *ProductPrivateHostAPI { + api.exclude(key) + return api +} + +// FilterBy 指定キーでのフィルター +func (api *ProductPrivateHostAPI) FilterBy(key string, value interface{}) *ProductPrivateHostAPI { + api.filterBy(key, value, false) + return api +} + +// FilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *ProductPrivateHostAPI) FilterMultiBy(key string, value interface{}) *ProductPrivateHostAPI { + api.filterBy(key, value, true) + return api +} + +// WithNameLike 名称条件 +func (api *ProductPrivateHostAPI) WithNameLike(name string) *ProductPrivateHostAPI { + return api.FilterBy("Name", name) +} + +// WithTag タグ条件 +func (api *ProductPrivateHostAPI) WithTag(tag string) *ProductPrivateHostAPI { + return api.FilterBy("Tags.Name", tag) +} + +// WithTags タグ(複数)条件 +func (api *ProductPrivateHostAPI) WithTags(tags []string) *ProductPrivateHostAPI { + return api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *ProductPrivateHostAPI) WithSizeGib(size int) *ProductPrivateHostAPI { +// api.FilterBy("SizeMB", size*1024) +// return api +// } + +// func (api *ProductPrivateHostAPI) WithSharedScope() *ProductPrivateHostAPI { +// api.FilterBy("Scope", "shared") +// return api +// } + +// func (api *ProductPrivateHostAPI) WithUserScope() *ProductPrivateHostAPI { +// api.FilterBy("Scope", "user") +// return api +// } + +// SortBy 指定キーでのソート +func (api *ProductPrivateHostAPI) SortBy(key string, reverse bool) *ProductPrivateHostAPI { + api.sortBy(key, reverse) + return api +} + +// SortByName 名称でのソート +func (api *ProductPrivateHostAPI) SortByName(reverse bool) *ProductPrivateHostAPI { + api.sortByName(reverse) + return api +} + +// func (api *ProductPrivateHostAPI) SortBySize(reverse bool) *ProductPrivateHostAPI { +// api.sortBy("SizeMB", reverse) +// return api +// } + +/************************************************ + To support Setxxx interface for Find() +************************************************/ + +// SetEmpty 検索条件のリセット +func (api *ProductPrivateHostAPI) SetEmpty() { + api.reset() +} + +// SetOffset オフセット +func (api *ProductPrivateHostAPI) SetOffset(offset int) { + api.offset(offset) +} + +// SetLimit リミット +func (api *ProductPrivateHostAPI) SetLimit(limit int) { + api.limit(limit) +} + +// SetInclude 取得する項目 +func (api *ProductPrivateHostAPI) SetInclude(key string) { + api.include(key) +} + +// SetExclude 除外する項目 +func (api *ProductPrivateHostAPI) SetExclude(key string) { + api.exclude(key) +} + +// SetFilterBy 指定キーでのフィルター +func (api *ProductPrivateHostAPI) SetFilterBy(key string, value interface{}) { + api.filterBy(key, value, false) +} + +// SetFilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *ProductPrivateHostAPI) SetFilterMultiBy(key string, value interface{}) { + api.filterBy(key, value, true) +} + +// SetNameLike 名称条件 +func (api *ProductPrivateHostAPI) SetNameLike(name string) { + api.FilterBy("Name", name) +} + +// SetTag タグ条件 +func (api *ProductPrivateHostAPI) SetTag(tag string) { + api.FilterBy("Tags.Name", tag) +} + +// SetTags タグ(複数)条件 +func (api *ProductPrivateHostAPI) SetTags(tags []string) { + api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *ProductPrivateHostAPI) SetSizeGib(size int) { +// api.FilterBy("SizeMB", size*1024) +// } + +// func (api *ProductPrivateHostAPI) SetSharedScope() { +// api.FilterBy("Scope", "shared") +// } + +// func (api *ProductPrivateHostAPI) SetUserScope() { +// api.FilterBy("Scope", "user") +// } + +// SetSortBy 指定キーでのソート +func (api *ProductPrivateHostAPI) SetSortBy(key string, reverse bool) { + api.sortBy(key, reverse) +} + +// SetSortByName 名称でのソート +func (api *ProductPrivateHostAPI) SetSortByName(reverse bool) { + api.sortByName(reverse) +} + +// func (api *ProductPrivateHostAPI) SetSortBySize(reverse bool) { +// api.sortBy("SizeMB", reverse) +// } + +/************************************************ + To support CRUD(Create/Read/Update/Delete) +************************************************/ + +//func (api *ProductPrivateHostAPI) New() *sacloud.ProductPrivateHost { +// return &sacloud.ProductPrivateHost{} +//} + +// func (api *ProductPrivateHostAPI) Create(value *sacloud.ProductPrivateHost) (*sacloud.ProductPrivateHost, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.create(api.createRequest(value), res) +// }) +// } + +// Read 読み取り +func (api *ProductPrivateHostAPI) Read(id int64) (*sacloud.ProductPrivateHost, error) { + return api.request(func(res *sacloud.Response) error { + return api.read(id, nil, res) + }) +} + +// func (api *ProductPrivateHostAPI) Update(id int64, value *sacloud.ProductPrivateHost) (*sacloud.ProductPrivateHost, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.update(id, api.createRequest(value), res) +// }) +// } + +// func (api *ProductPrivateHostAPI) Delete(id int64) (*sacloud.ProductPrivateHost, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.delete(id, nil, res) +// }) +// } + +/************************************************ + Inner functions +************************************************/ + +func (api *ProductPrivateHostAPI) setStateValue(setFunc func(*sacloud.Request)) *ProductPrivateHostAPI { + api.baseAPI.setStateValue(setFunc) + return api +} + +func (api *ProductPrivateHostAPI) request(f func(*sacloud.Response) error) (*sacloud.ProductPrivateHost, error) { + res := &sacloud.Response{} + err := f(res) + if err != nil { + return nil, err + } + return res.PrivateHostPlan, nil +} + +func (api *ProductPrivateHostAPI) createRequest(value *sacloud.ProductPrivateHost) *sacloud.Request { + req := &sacloud.Request{} + req.PrivateHostPlan = value + return req +} diff --git a/vendor/github.com/sacloud/libsacloud/api/product_server.go b/vendor/github.com/sacloud/libsacloud/api/product_server.go new file mode 100644 index 00000000..f5efff13 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/product_server.go @@ -0,0 +1,71 @@ +package api + +import ( + "fmt" + "github.com/sacloud/libsacloud/sacloud" + "strconv" +) + +// ProductServerAPI サーバープランAPI +type ProductServerAPI struct { + *baseAPI +} + +// NewProductServerAPI サーバープランAPI作成 +func NewProductServerAPI(client *Client) *ProductServerAPI { + return &ProductServerAPI{ + &baseAPI{ + client: client, + // FuncGetResourceURL + FuncGetResourceURL: func() string { + return "product/server" + }, + }, + } +} + +func (api *ProductServerAPI) getPlanIDBySpec(core int, memGB int) (int64, error) { + //assert args + if core <= 0 { + return -1, fmt.Errorf("Invalid Parameter: CPU Core") + } + if memGB <= 0 { + return -1, fmt.Errorf("Invalid Parameter: Memory Size(GB)") + } + + return strconv.ParseInt(fmt.Sprintf("%d%03d", memGB, core), 10, 64) +} + +// IsValidPlan 指定のコア数/メモリサイズのプランが存在し、有効であるか判定 +func (api *ProductServerAPI) IsValidPlan(core int, memGB int) (bool, error) { + + planID, err := api.getPlanIDBySpec(core, memGB) + if err != nil { + return false, err + } + productServer, err := api.Read(planID) + + if err != nil { + return false, err + } + + if productServer != nil { + return true, nil + } + + return false, fmt.Errorf("Server Plan[%d] Not Found", planID) + +} + +// GetBySpec 指定のコア数/メモリサイズのサーバープランを取得 +func (api *ProductServerAPI) GetBySpec(core int, memGB int) (*sacloud.ProductServer, error) { + planID, err := api.getPlanIDBySpec(core, memGB) + + productServer, err := api.Read(planID) + + if err != nil { + return nil, err + } + + return productServer, nil +} diff --git a/vendor/github.com/sacloud/libsacloud/api/product_server_gen.go b/vendor/github.com/sacloud/libsacloud/api/product_server_gen.go new file mode 100644 index 00000000..7710aab7 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/product_server_gen.go @@ -0,0 +1,239 @@ +package api + +/************************************************ + generated by IDE. for [ProductServerAPI] +************************************************/ + +import ( + "github.com/sacloud/libsacloud/sacloud" +) + +/************************************************ + To support fluent interface for Find() +************************************************/ + +// Reset 検索条件のリセット +func (api *ProductServerAPI) Reset() *ProductServerAPI { + api.reset() + return api +} + +// Offset オフセット +func (api *ProductServerAPI) Offset(offset int) *ProductServerAPI { + api.offset(offset) + return api +} + +// Limit リミット +func (api *ProductServerAPI) Limit(limit int) *ProductServerAPI { + api.limit(limit) + return api +} + +// Include 取得する項目 +func (api *ProductServerAPI) Include(key string) *ProductServerAPI { + api.include(key) + return api +} + +// Exclude 除外する項目 +func (api *ProductServerAPI) Exclude(key string) *ProductServerAPI { + api.exclude(key) + return api +} + +// FilterBy 指定キーでのフィルター +func (api *ProductServerAPI) FilterBy(key string, value interface{}) *ProductServerAPI { + api.filterBy(key, value, false) + return api +} + +// FilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *ProductServerAPI) FilterMultiBy(key string, value interface{}) *ProductServerAPI { + api.filterBy(key, value, true) + return api +} + +// WithNameLike 名称条件 +func (api *ProductServerAPI) WithNameLike(name string) *ProductServerAPI { + return api.FilterBy("Name", name) +} + +// WithTag タグ条件 +func (api *ProductServerAPI) WithTag(tag string) *ProductServerAPI { + return api.FilterBy("Tags.Name", tag) +} + +// WithTags タグ(複数)条件 +func (api *ProductServerAPI) WithTags(tags []string) *ProductServerAPI { + return api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *ProductServerAPI) WithSizeGib(size int) *ProductServerAPI { +// api.FilterBy("SizeMB", size*1024) +// return api +// } + +// func (api *ProductServerAPI) WithSharedScope() *ProductServerAPI { +// api.FilterBy("Scope", "shared") +// return api +// } + +// func (api *ProductServerAPI) WithUserScope() *ProductServerAPI { +// api.FilterBy("Scope", "user") +// return api +// } + +// SortBy 指定キーでのソート +func (api *ProductServerAPI) SortBy(key string, reverse bool) *ProductServerAPI { + api.sortBy(key, reverse) + return api +} + +// SortByName 名称でのソート +func (api *ProductServerAPI) SortByName(reverse bool) *ProductServerAPI { + api.sortByName(reverse) + return api +} + +// func (api *ProductServerAPI) SortBySize(reverse bool) *ProductServerAPI { +// api.sortBy("SizeMB", reverse) +// return api +// } + +/************************************************ + To support Setxxx interface for Find() +************************************************/ + +// SetEmpty 検索条件のリセット +func (api *ProductServerAPI) SetEmpty() { + api.reset() +} + +// SetOffset オフセット +func (api *ProductServerAPI) SetOffset(offset int) { + api.offset(offset) +} + +// SetLimit リミット +func (api *ProductServerAPI) SetLimit(limit int) { + api.limit(limit) +} + +// SetInclude 取得する項目 +func (api *ProductServerAPI) SetInclude(key string) { + api.include(key) +} + +// SetExclude 除外する項目 +func (api *ProductServerAPI) SetExclude(key string) { + api.exclude(key) +} + +// SetFilterBy 指定キーでのフィルター +func (api *ProductServerAPI) SetFilterBy(key string, value interface{}) { + api.filterBy(key, value, false) +} + +// SetFilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *ProductServerAPI) SetFilterMultiBy(key string, value interface{}) { + api.filterBy(key, value, true) +} + +// SetNameLike 名称条件 +func (api *ProductServerAPI) SetNameLike(name string) { + api.FilterBy("Name", name) +} + +// SetTag タグ条件 +func (api *ProductServerAPI) SetTag(tag string) { + api.FilterBy("Tags.Name", tag) +} + +// SetTags タグ(複数)条件 +func (api *ProductServerAPI) SetTags(tags []string) { + api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *ProductServerAPI) SetSizeGib(size int) { +// api.FilterBy("SizeMB", size*1024) +// } + +// func (api *ProductServerAPI) SetSharedScope() { +// api.FilterBy("Scope", "shared") +// } + +// func (api *ProductServerAPI) SetUserScope() { +// api.FilterBy("Scope", "user") +// } + +// SetSortBy 指定キーでのソート +func (api *ProductServerAPI) SetSortBy(key string, reverse bool) { + api.sortBy(key, reverse) +} + +// SetSortByName 名称でのソート +func (api *ProductServerAPI) SetSortByName(reverse bool) { + api.sortByName(reverse) +} + +// func (api *ProductServerAPI) SetSortBySize(reverse bool) { +// api.sortBy("SizeMB", reverse) +// } + +/************************************************ + To support CRUD(Create/Read/Update/Delete) +************************************************/ + +//func (api *ProductServerAPI) New() *sacloud.ProductServer { +// return &sacloud.ProductServer{} +//} + +// func (api *ProductServerAPI) Create(value *sacloud.ProductServer) (*sacloud.ProductServer, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.create(api.createRequest(value), res) +// }) +// } + +// Read 読み取り +func (api *ProductServerAPI) Read(id int64) (*sacloud.ProductServer, error) { + return api.request(func(res *sacloud.Response) error { + return api.read(id, nil, res) + }) +} + +// func (api *ProductServerAPI) Update(id int64, value *sacloud.ProductServer) (*sacloud.ProductServer, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.update(id, api.createRequest(value), res) +// }) +// } + +// func (api *ProductServerAPI) Delete(id int64) (*sacloud.ProductServer, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.delete(id, nil, res) +// }) +// } + +/************************************************ + Inner functions +************************************************/ + +func (api *ProductServerAPI) setStateValue(setFunc func(*sacloud.Request)) *ProductServerAPI { + api.baseAPI.setStateValue(setFunc) + return api +} + +func (api *ProductServerAPI) request(f func(*sacloud.Response) error) (*sacloud.ProductServer, error) { + res := &sacloud.Response{} + err := f(res) + if err != nil { + return nil, err + } + return res.ServerPlan, nil +} + +func (api *ProductServerAPI) createRequest(value *sacloud.ProductServer) *sacloud.Request { + req := &sacloud.Request{} + req.ServerPlan = value + return req +} diff --git a/vendor/github.com/sacloud/libsacloud/api/public_price.go b/vendor/github.com/sacloud/libsacloud/api/public_price.go new file mode 100644 index 00000000..d3b1cc9c --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/public_price.go @@ -0,0 +1,18 @@ +package api + +// PublicPriceAPI 料金情報API +type PublicPriceAPI struct { + *baseAPI +} + +// NewPublicPriceAPI 料金情報API +func NewPublicPriceAPI(client *Client) *PublicPriceAPI { + return &PublicPriceAPI{ + &baseAPI{ + client: client, + FuncGetResourceURL: func() string { + return "public/price" + }, + }, + } +} diff --git a/vendor/github.com/sacloud/libsacloud/api/public_price_gen.go b/vendor/github.com/sacloud/libsacloud/api/public_price_gen.go new file mode 100644 index 00000000..7332fdf2 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/public_price_gen.go @@ -0,0 +1,236 @@ +package api + +/************************************************ + generated by IDE. for [PublicPriceAPI] +************************************************/ + +import ( + "github.com/sacloud/libsacloud/sacloud" +) + +/************************************************ + To support fluent interface for Find() +************************************************/ + +// Reset 検索条件のリセット +func (api *PublicPriceAPI) Reset() *PublicPriceAPI { + api.reset() + return api +} + +// Offset オフセット +func (api *PublicPriceAPI) Offset(offset int) *PublicPriceAPI { + api.offset(offset) + return api +} + +// Limit リミット +func (api *PublicPriceAPI) Limit(limit int) *PublicPriceAPI { + api.limit(limit) + return api +} + +// Include 取得する項目 +func (api *PublicPriceAPI) Include(key string) *PublicPriceAPI { + api.include(key) + return api +} + +// Exclude 除外する項目 +func (api *PublicPriceAPI) Exclude(key string) *PublicPriceAPI { + api.exclude(key) + return api +} + +// FilterBy 指定キーでのフィルター +func (api *PublicPriceAPI) FilterBy(key string, value interface{}) *PublicPriceAPI { + api.filterBy(key, value, false) + return api +} + +// FilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *PublicPriceAPI) FilterMultiBy(key string, value interface{}) *PublicPriceAPI { + api.filterBy(key, value, true) + return api +} + +// WithNameLike 名称条件(DisplayName) +func (api *PublicPriceAPI) WithNameLike(name string) *PublicPriceAPI { + return api.FilterBy("DisplayName", name) +} + +//// WithTag +//func (api *PublicPriceAPI) WithTag(tag string) *PublicPriceAPI { +// return api.FilterBy("Tags.Name", tag) +//} + +//// WithTags +//func (api *PublicPriceAPI) WithTags(tags []string) *PublicPriceAPI { +// return api.FilterBy("Tags.Name", []interface{}{tags}) +//} + +// func (api *PublicPriceAPI) WithSizeGib(size int) *PublicPriceAPI { +// api.FilterBy("SizeMB", size*1024) +// return api +// } + +// func (api *PublicPriceAPI) WithSharedScope() *PublicPriceAPI { +// api.FilterBy("Scope", "shared") +// return api +// } + +// func (api *PublicPriceAPI) WithUserScope() *PublicPriceAPI { +// api.FilterBy("Scope", "user") +// return api +// } + +// SortBy 指定キーでのソート +func (api *PublicPriceAPI) SortBy(key string, reverse bool) *PublicPriceAPI { + api.sortBy(key, reverse) + return api +} + +// SortByName 名称でのソート(DisplayName) +func (api *PublicPriceAPI) SortByName(reverse bool) *PublicPriceAPI { + api.sortBy("DisplayName", reverse) + return api +} + +// func (api *PublicPriceAPI) SortBySize(reverse bool) *PublicPriceAPI { +// api.sortBy("SizeMB", reverse) +// return api +// } + +/************************************************ + To support Setxxx interface for Find() +************************************************/ + +// SetEmpty 検索条件のリセット +func (api *PublicPriceAPI) SetEmpty() { + api.reset() +} + +// SetOffset オフセット +func (api *PublicPriceAPI) SetOffset(offset int) { + api.offset(offset) +} + +// SetLimit リミット +func (api *PublicPriceAPI) SetLimit(limit int) { + api.limit(limit) +} + +// SetInclude 取得する項目 +func (api *PublicPriceAPI) SetInclude(key string) { + api.include(key) +} + +// SetExclude 除外する項目 +func (api *PublicPriceAPI) SetExclude(key string) { + api.exclude(key) +} + +// SetFilterBy 指定キーでのフィルター +func (api *PublicPriceAPI) SetFilterBy(key string, value interface{}) { + api.filterBy(key, value, false) +} + +// SetFilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *PublicPriceAPI) SetFilterMultiBy(key string, value interface{}) { + api.filterBy(key, value, true) +} + +// SetNameLike 名称条件(DisplayName) +func (api *PublicPriceAPI) SetNameLike(name string) { + api.FilterBy("DisplayName", name) +} + +//// SetTag +//func (api *PublicPriceAPI) SetTag(tag string) { +//} + +//// SetTags +//func (api *PublicPriceAPI) SetTags(tags []string) { +//} + +// func (api *PublicPriceAPI) SetSizeGib(size int) { +// api.FilterBy("SizeMB", size*1024) +// } + +// func (api *PublicPriceAPI) SetSharedScope() { +// api.FilterBy("Scope", "shared") +// } + +// func (api *PublicPriceAPI) SetUserScope() { +// api.FilterBy("Scope", "user") +// } + +// SetSortBy 指定キーでのソート +func (api *PublicPriceAPI) SetSortBy(key string, reverse bool) { + api.sortBy(key, reverse) +} + +// SetSortByName 名称でのソート(DisplayName) +func (api *PublicPriceAPI) SetSortByName(reverse bool) { + api.sortBy("DisplayName", reverse) +} + +// func (api *PublicPriceAPI) SetSortBySize(reverse bool) { +// api.sortBy("SizeMB", reverse) +// } + +/************************************************ + To support CRUD(Create/Read/Update/Delete) +************************************************/ + +// func (api *PublicPriceAPI) New() *sacloud.PublicPrice { +// return &sacloud.PublicPrice{} +// } + +// func (api *PublicPriceAPI) Create(value *sacloud.PublicPrice) (*sacloud.PublicPrice, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.create(api.createRequest(value), res) +// }) +// } + +// func (api *PublicPriceAPI) Read(id int64) (*sacloud.PublicPrice, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.read(id, nil, res) +// }) +// } + +// func (api *PublicPriceAPI) Update(id int64, value *sacloud.PublicPrice) (*sacloud.PublicPrice, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.update(id, api.createRequest(value), res) +// }) +// } + +// func (api *PublicPriceAPI) Delete(id int64) (*sacloud.PublicPrice, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.delete(id, nil, res) +// }) +// } + +/************************************************ + Inner functions +************************************************/ + +func (api *PublicPriceAPI) setStateValue(setFunc func(*sacloud.Request)) *PublicPriceAPI { + api.baseAPI.setStateValue(setFunc) + return api +} + +//func (api *PublicPriceAPI) request(f func(*sacloud.Response) error) (*sacloud.PublicPrice, error) { +// res := &sacloud.Response{} +// err := f(res) +// if err != nil { +// return nil, err +// } +// return res.ServiceClass, nil +//} +// +//func (api *PublicPriceAPI) createRequest(value *sacloud.PublicPrice) *sacloud.Request { +// req := &sacloud.Request{} +// req.ServiceClass = value +// return req +//} diff --git a/vendor/github.com/sacloud/libsacloud/api/region.go b/vendor/github.com/sacloud/libsacloud/api/region.go new file mode 100644 index 00000000..4f77c2de --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/region.go @@ -0,0 +1,18 @@ +package api + +// RegionAPI リージョンAPI +type RegionAPI struct { + *baseAPI +} + +// NewRegionAPI リージョンAPI作成 +func NewRegionAPI(client *Client) *RegionAPI { + return &RegionAPI{ + &baseAPI{ + client: client, + FuncGetResourceURL: func() string { + return "region" + }, + }, + } +} diff --git a/vendor/github.com/sacloud/libsacloud/api/region_gen.go b/vendor/github.com/sacloud/libsacloud/api/region_gen.go new file mode 100644 index 00000000..cb09050b --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/region_gen.go @@ -0,0 +1,239 @@ +package api + +/************************************************ + generated by IDE. for [RegionAPI] +************************************************/ + +import ( + "github.com/sacloud/libsacloud/sacloud" +) + +/************************************************ + To support fluent interface for Find() +************************************************/ + +// Reset 検索条件のリセット +func (api *RegionAPI) Reset() *RegionAPI { + api.reset() + return api +} + +// Offset オフセット +func (api *RegionAPI) Offset(offset int) *RegionAPI { + api.offset(offset) + return api +} + +// Limit リミット +func (api *RegionAPI) Limit(limit int) *RegionAPI { + api.limit(limit) + return api +} + +// Include 取得する項目 +func (api *RegionAPI) Include(key string) *RegionAPI { + api.include(key) + return api +} + +// Exclude 除外する項目 +func (api *RegionAPI) Exclude(key string) *RegionAPI { + api.exclude(key) + return api +} + +// FilterBy 指定キーでのフィルター +func (api *RegionAPI) FilterBy(key string, value interface{}) *RegionAPI { + api.filterBy(key, value, false) + return api +} + +// FilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *RegionAPI) FilterMultiBy(key string, value interface{}) *RegionAPI { + api.filterBy(key, value, true) + return api +} + +// WithNameLike 名称条件 +func (api *RegionAPI) WithNameLike(name string) *RegionAPI { + return api.FilterBy("Name", name) +} + +//// WithTag +//func (api *RegionAPI) WithTag(tag string) *RegionAPI { +// return api.FilterBy("Tags.Name", tag) +//} +// +//// WithTags +//func (api *RegionAPI) WithTags(tags []string) *RegionAPI { +// return api.FilterBy("Tags.Name", []interface{}{tags}) +//} + +// func (api *RegionAPI) WithSizeGib(size int) *RegionAPI { +// api.FilterBy("SizeMB", size*1024) +// return api +// } + +// func (api *RegionAPI) WithSharedScope() *RegionAPI { +// api.FilterBy("Scope", "shared") +// return api +// } + +// func (api *RegionAPI) WithUserScope() *RegionAPI { +// api.FilterBy("Scope", "user") +// return api +// } + +// SortBy 指定キーでのソート +func (api *RegionAPI) SortBy(key string, reverse bool) *RegionAPI { + api.sortBy(key, reverse) + return api +} + +// SortByName 名称でのソート +func (api *RegionAPI) SortByName(reverse bool) *RegionAPI { + api.sortByName(reverse) + return api +} + +// func (api *RegionAPI) SortBySize(reverse bool) *RegionAPI { +// api.sortBy("SizeMB", reverse) +// return api +// } + +/************************************************ + To support Setxxx interface for Find() +************************************************/ + +// SetEmpty 検索条件のリセット +func (api *RegionAPI) SetEmpty() { + api.reset() +} + +// SetOffset オフセット +func (api *RegionAPI) SetOffset(offset int) { + api.offset(offset) +} + +// SetLimit リミット +func (api *RegionAPI) SetLimit(limit int) { + api.limit(limit) +} + +// SetInclude 取得する項目 +func (api *RegionAPI) SetInclude(key string) { + api.include(key) +} + +// SetExclude 除外する項目 +func (api *RegionAPI) SetExclude(key string) { + api.exclude(key) +} + +// SetFilterBy 指定キーでのフィルター +func (api *RegionAPI) SetFilterBy(key string, value interface{}) { + api.filterBy(key, value, false) +} + +// SetFilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *RegionAPI) SetFilterMultiBy(key string, value interface{}) { + api.filterBy(key, value, true) +} + +// SetNameLike 名称条件 +func (api *RegionAPI) SetNameLike(name string) { + api.FilterBy("Name", name) +} + +//// SetTag +//func (api *RegionAPI) SetTag(tag string) { +// api.FilterBy("Tags.Name", tag) +//} +// +//// SetTags +//func (api *RegionAPI) SetTags(tags []string) { +// api.FilterBy("Tags.Name", []interface{}{tags}) +//} + +// func (api *RegionAPI) SetSizeGib(size int) { +// api.FilterBy("SizeMB", size*1024) +// } + +// func (api *RegionAPI) SetSharedScope() { +// api.FilterBy("Scope", "shared") +// } + +// func (api *RegionAPI) SetUserScope() { +// api.FilterBy("Scope", "user") +// } + +// SetSortBy 指定キーでのソート +func (api *RegionAPI) SetSortBy(key string, reverse bool) { + api.sortBy(key, reverse) +} + +// SetSortByName 名称でのソート +func (api *RegionAPI) SetSortByName(reverse bool) { + api.sortByName(reverse) +} + +// func (api *RegionAPI) SetSortBySize(reverse bool) { +// api.sortBy("SizeMB", reverse) +// } + +/************************************************ + To support CRUD(Create/Read/Update/Delete) +************************************************/ + +//func (api *RegionAPI) New() *sacloud.Region { +// return &sacloud.Region{} +//} + +// func (api *RegionAPI) Create(value *sacloud.Region) (*sacloud.Region, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.create(api.createRequest(value), res) +// }) +// } + +// Read 読み取り +func (api *RegionAPI) Read(id int64) (*sacloud.Region, error) { + return api.request(func(res *sacloud.Response) error { + return api.read(id, nil, res) + }) +} + +// func (api *RegionAPI) Update(id int64, value *sacloud.Region) (*sacloud.Region, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.update(id, api.createRequest(value), res) +// }) +// } + +// func (api *RegionAPI) Delete(id int64) (*sacloud.Region, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.delete(id, nil, res) +// }) +// } + +/************************************************ + Inner functions +************************************************/ + +func (api *RegionAPI) setStateValue(setFunc func(*sacloud.Request)) *RegionAPI { + api.baseAPI.setStateValue(setFunc) + return api +} + +func (api *RegionAPI) request(f func(*sacloud.Response) error) (*sacloud.Region, error) { + res := &sacloud.Response{} + err := f(res) + if err != nil { + return nil, err + } + return res.Region, nil +} + +func (api *RegionAPI) createRequest(value *sacloud.Region) *sacloud.Request { + req := &sacloud.Request{} + req.Region = value + return req +} diff --git a/vendor/github.com/sacloud/libsacloud/api/server.go b/vendor/github.com/sacloud/libsacloud/api/server.go new file mode 100644 index 00000000..16d81fe0 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/server.go @@ -0,0 +1,287 @@ +package api + +import ( + "fmt" + "github.com/sacloud/libsacloud/sacloud" + "time" +) + +// ServerAPI サーバーAPI +type ServerAPI struct { + *baseAPI +} + +// NewServerAPI サーバーAPI作成 +func NewServerAPI(client *Client) *ServerAPI { + return &ServerAPI{ + &baseAPI{ + client: client, + FuncGetResourceURL: func() string { + return "server" + }, + }, + } +} + +// WithPlan サーバープラン条件 +func (api *ServerAPI) WithPlan(planID string) *ServerAPI { + return api.FilterBy("ServerPlan.ID", planID) +} + +// WithStatus インスタンスステータス条件 +func (api *ServerAPI) WithStatus(status string) *ServerAPI { + return api.FilterBy("Instance.Status", status) +} + +// WithStatusUp 起動状態条件 +func (api *ServerAPI) WithStatusUp() *ServerAPI { + return api.WithStatus("up") +} + +// WithStatusDown ダウン状態条件 +func (api *ServerAPI) WithStatusDown() *ServerAPI { + return api.WithStatus("down") +} + +// WithISOImage ISOイメージ条件 +func (api *ServerAPI) WithISOImage(imageID int64) *ServerAPI { + return api.FilterBy("Instance.CDROM.ID", imageID) +} + +// SortByCPU CPUコア数でのソート +func (api *ServerAPI) SortByCPU(reverse bool) *ServerAPI { + api.sortBy("ServerPlan.CPU", reverse) + return api +} + +// SortByMemory メモリサイズでのソート +func (api *ServerAPI) SortByMemory(reverse bool) *ServerAPI { + api.sortBy("ServerPlan.MemoryMB", reverse) + return api +} + +// DeleteWithDisk 指定のディスクと共に削除する +func (api *ServerAPI) DeleteWithDisk(id int64, disks []int64) (*sacloud.Server, error) { + return api.request(func(res *sacloud.Response) error { + return api.delete(id, map[string]interface{}{"WithDisk": disks}, res) + }) +} + +// State ステータス(Availability)取得 +func (api *ServerAPI) State(id int64) (string, error) { + server, err := api.Read(id) + if err != nil { + return "", err + } + return string(server.Availability), nil +} + +// IsUp 起動しているか判定 +func (api *ServerAPI) IsUp(id int64) (bool, error) { + server, err := api.Read(id) + if err != nil { + return false, err + } + return server.Instance.IsUp(), nil +} + +// IsDown ダウンしているか判定 +func (api *ServerAPI) IsDown(id int64) (bool, error) { + server, err := api.Read(id) + if err != nil { + return false, err + } + return server.Instance.IsDown(), nil +} + +// Boot 起動 +func (api *ServerAPI) Boot(id int64) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/power", api.getResourceURL(), id) + ) + return api.modify(method, uri, nil) +} + +// Shutdown シャットダウン(graceful) +func (api *ServerAPI) Shutdown(id int64) (bool, error) { + var ( + method = "DELETE" + uri = fmt.Sprintf("%s/%d/power", api.getResourceURL(), id) + ) + + return api.modify(method, uri, nil) +} + +// Stop シャットダウン(force) +func (api *ServerAPI) Stop(id int64) (bool, error) { + var ( + method = "DELETE" + uri = fmt.Sprintf("%s/%d/power", api.getResourceURL(), id) + ) + + return api.modify(method, uri, map[string]bool{"Force": true}) +} + +// RebootForce 再起動 +func (api *ServerAPI) RebootForce(id int64) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/reset", api.getResourceURL(), id) + ) + + return api.modify(method, uri, nil) +} + +// SleepUntilUp 起動するまで待機 +func (api *ServerAPI) SleepUntilUp(id int64, timeout time.Duration) error { + handler := waitingForUpFunc(func() (hasUpDown, error) { + return api.Read(id) + }, 0) + return blockingPoll(handler, timeout) +} + +// SleepUntilDown ダウンするまで待機 +func (api *ServerAPI) SleepUntilDown(id int64, timeout time.Duration) error { + handler := waitingForDownFunc(func() (hasUpDown, error) { + return api.Read(id) + }, 0) + return blockingPoll(handler, timeout) +} + +// ChangePlan サーバープラン変更(サーバーIDが変更となるため注意) +func (api *ServerAPI) ChangePlan(serverID int64, planID string) (*sacloud.Server, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/to/plan/%s", api.getResourceURL(), serverID, planID) + ) + + return api.request(func(res *sacloud.Response) error { + return api.baseAPI.request(method, uri, nil, res) + }) +} + +// FindDisk 指定サーバーに接続されているディスク一覧を取得 +func (api *ServerAPI) FindDisk(serverID int64) ([]sacloud.Disk, error) { + server, err := api.Read(serverID) + if err != nil { + return nil, err + } + return server.Disks, nil +} + +// InsertCDROM ISOイメージを挿入 +func (api *ServerAPI) InsertCDROM(serverID int64, cdromID int64) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/cdrom", api.getResourceURL(), serverID) + ) + + req := &sacloud.Request{ + SakuraCloudResources: sacloud.SakuraCloudResources{ + CDROM: &sacloud.CDROM{Resource: &sacloud.Resource{ID: cdromID}}, + }, + } + + return api.modify(method, uri, req) +} + +// EjectCDROM ISOイメージを取り出し +func (api *ServerAPI) EjectCDROM(serverID int64, cdromID int64) (bool, error) { + var ( + method = "DELETE" + uri = fmt.Sprintf("%s/%d/cdrom", api.getResourceURL(), serverID) + ) + + req := &sacloud.Request{ + SakuraCloudResources: sacloud.SakuraCloudResources{ + CDROM: &sacloud.CDROM{Resource: &sacloud.Resource{ID: cdromID}}, + }, + } + + return api.modify(method, uri, req) +} + +// NewKeyboardRequest キーボード入力リクエストパラメーター作成 +func (api *ServerAPI) NewKeyboardRequest() *sacloud.KeyboardRequest { + return &sacloud.KeyboardRequest{} +} + +// SendKey キーボード入力送信 +func (api *ServerAPI) SendKey(serverID int64, body *sacloud.KeyboardRequest) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/keyboard", api.getResourceURL(), serverID) + ) + + return api.modify(method, uri, body) +} + +// NewMouseRequest マウス入力リクエストパラメーター作成 +func (api *ServerAPI) NewMouseRequest() *sacloud.MouseRequest { + return &sacloud.MouseRequest{ + Buttons: &sacloud.MouseRequestButtons{}, + } +} + +// SendMouse マウス入力送信 +func (api *ServerAPI) SendMouse(serverID int64, mouseIndex string, body *sacloud.MouseRequest) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/mouse/%s", api.getResourceURL(), serverID, mouseIndex) + ) + + return api.modify(method, uri, body) +} + +// NewVNCSnapshotRequest VNCスナップショット取得リクエストパラメーター作成 +func (api *ServerAPI) NewVNCSnapshotRequest() *sacloud.VNCSnapshotRequest { + return &sacloud.VNCSnapshotRequest{} +} + +// GetVNCProxy VNCプロキシ情報取得 +func (api *ServerAPI) GetVNCProxy(serverID int64) (*sacloud.VNCProxyResponse, error) { + var ( + method = "GET" + uri = fmt.Sprintf("%s/%d/vnc/proxy", api.getResourceURL(), serverID) + res = &sacloud.VNCProxyResponse{} + ) + err := api.baseAPI.request(method, uri, nil, res) + if err != nil { + return nil, err + } + return res, nil +} + +// GetVNCSize VNC画面サイズ取得 +func (api *ServerAPI) GetVNCSize(serverID int64) (*sacloud.VNCSizeResponse, error) { + var ( + method = "GET" + uri = fmt.Sprintf("%s/%d/vnc/size", api.getResourceURL(), serverID) + res = &sacloud.VNCSizeResponse{} + ) + err := api.baseAPI.request(method, uri, nil, res) + if err != nil { + return nil, err + } + return res, nil +} + +// GetVNCSnapshot VNCスナップショット取得 +func (api *ServerAPI) GetVNCSnapshot(serverID int64, body *sacloud.VNCSnapshotRequest) (*sacloud.VNCSnapshotResponse, error) { + var ( + method = "GET" + uri = fmt.Sprintf("%s/%d/vnc/snapshot", api.getResourceURL(), serverID) + res = &sacloud.VNCSnapshotResponse{} + ) + err := api.baseAPI.request(method, uri, body, res) + if err != nil { + return nil, err + } + return res, nil +} + +// Monitor アクティビティーモニター(CPU-TIME)取得 +func (api *ServerAPI) Monitor(id int64, body *sacloud.ResourceMonitorRequest) (*sacloud.MonitorValues, error) { + return api.baseAPI.monitor(id, body) +} diff --git a/vendor/github.com/sacloud/libsacloud/api/server_gen.go b/vendor/github.com/sacloud/libsacloud/api/server_gen.go new file mode 100644 index 00000000..e7e6fcae --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/server_gen.go @@ -0,0 +1,243 @@ +package api + +/************************************************ + generated by IDE. for [ServerAPI] +************************************************/ + +import ( + "github.com/sacloud/libsacloud/sacloud" +) + +/************************************************ + To support fluent interface for Find() +************************************************/ + +// Reset 検索条件のリセット +func (api *ServerAPI) Reset() *ServerAPI { + api.reset() + return api +} + +// Offset オフセット +func (api *ServerAPI) Offset(offset int) *ServerAPI { + api.offset(offset) + return api +} + +// Limit リミット +func (api *ServerAPI) Limit(limit int) *ServerAPI { + api.limit(limit) + return api +} + +// Include 取得する項目 +func (api *ServerAPI) Include(key string) *ServerAPI { + api.include(key) + return api +} + +// Exclude 除外する項目 +func (api *ServerAPI) Exclude(key string) *ServerAPI { + api.exclude(key) + return api +} + +// FilterBy 指定キーでのフィルター +func (api *ServerAPI) FilterBy(key string, value interface{}) *ServerAPI { + api.filterBy(key, value, false) + return api +} + +// FilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *ServerAPI) FilterMultiBy(key string, value interface{}) *ServerAPI { + api.filterBy(key, value, true) + return api +} + +// WithNameLike 名称条件 +func (api *ServerAPI) WithNameLike(name string) *ServerAPI { + return api.FilterBy("Name", name) +} + +// WithTag タグ条件 +func (api *ServerAPI) WithTag(tag string) *ServerAPI { + return api.FilterBy("Tags.Name", tag) +} + +// WithTags タグ(複数)条件 +func (api *ServerAPI) WithTags(tags []string) *ServerAPI { + return api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *ServerAPI) WithSizeGib(size int) *ServerAPI { +// api.FilterBy("SizeMB", size*1024) +// return api +// } + +// func (api *ServerAPI) WithSharedScope() *ServerAPI { +// api.FilterBy("Scope", "shared") +// return api +// } + +// func (api *ServerAPI) WithUserScope() *ServerAPI { +// api.FilterBy("Scope", "user") +// return api +// } + +// SortBy 指定キーでのソート +func (api *ServerAPI) SortBy(key string, reverse bool) *ServerAPI { + api.sortBy(key, reverse) + return api +} + +// SortByName 名称でのソート +func (api *ServerAPI) SortByName(reverse bool) *ServerAPI { + api.sortByName(reverse) + return api +} + +// func (api *ServerAPI) SortBySize(reverse bool) *ServerAPI { +// api.sortBy("SizeMB", reverse) +// return api +// } + +/************************************************ + To support Setxxx interface for Find() +************************************************/ + +// SetEmpty 検索条件のリセット +func (api *ServerAPI) SetEmpty() { + api.reset() +} + +// SetOffset オフセット +func (api *ServerAPI) SetOffset(offset int) { + api.offset(offset) +} + +// SetLimit リミット +func (api *ServerAPI) SetLimit(limit int) { + api.limit(limit) +} + +// SetInclude 取得する項目 +func (api *ServerAPI) SetInclude(key string) { + api.include(key) +} + +// SetExclude 除外する項目 +func (api *ServerAPI) SetExclude(key string) { + api.exclude(key) +} + +// SetFilterBy 指定キーでのフィルター +func (api *ServerAPI) SetFilterBy(key string, value interface{}) { + api.filterBy(key, value, false) +} + +// SetFilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *ServerAPI) SetFilterMultiBy(key string, value interface{}) { + api.filterBy(key, value, true) +} + +// SetNameLike 名称条件 +func (api *ServerAPI) SetNameLike(name string) { + api.FilterBy("Name", name) +} + +// SetTag タグ条件 +func (api *ServerAPI) SetTag(tag string) { + api.FilterBy("Tags.Name", tag) +} + +// SetTags タグ(複数)条件 +func (api *ServerAPI) SetTags(tags []string) { + api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *ServerAPI) SetSizeGib(size int) { +// api.FilterBy("SizeMB", size*1024) +// } + +// func (api *ServerAPI) SetSharedScope() { +// api.FilterBy("Scope", "shared") +// } + +// func (api *ServerAPI) SetUserScope() { +// api.FilterBy("Scope", "user") +// } + +// SetSortBy 指定キーでのソート +func (api *ServerAPI) SetSortBy(key string, reverse bool) { + api.sortBy(key, reverse) +} + +// SetSortByName 名称でのソート +func (api *ServerAPI) SetSortByName(reverse bool) { + api.sortByName(reverse) +} + +// func (api *ServerAPI) SetSortBySize(reverse bool) { +// api.sortBy("SizeMB", reverse) +// } + +/************************************************ + To support CRUD(Create/Read/Update/Delete) +************************************************/ + +// New 新規作成用パラメーター作成 +func (api *ServerAPI) New() *sacloud.Server { + return &sacloud.Server{} +} + +// Create 新規作成 +func (api *ServerAPI) Create(value *sacloud.Server) (*sacloud.Server, error) { + return api.request(func(res *sacloud.Response) error { + return api.create(api.createRequest(value), res) + }) +} + +// Read 読み取り +func (api *ServerAPI) Read(id int64) (*sacloud.Server, error) { + return api.request(func(res *sacloud.Response) error { + return api.read(id, nil, res) + }) +} + +// Update 更新 +func (api *ServerAPI) Update(id int64, value *sacloud.Server) (*sacloud.Server, error) { + return api.request(func(res *sacloud.Response) error { + return api.update(id, api.createRequest(value), res) + }) +} + +// Delete 削除 +func (api *ServerAPI) Delete(id int64) (*sacloud.Server, error) { + return api.request(func(res *sacloud.Response) error { + return api.delete(id, nil, res) + }) +} + +/************************************************ + Inner functions +************************************************/ + +func (api *ServerAPI) setStateValue(setFunc func(*sacloud.Request)) *ServerAPI { + api.baseAPI.setStateValue(setFunc) + return api +} + +func (api *ServerAPI) request(f func(*sacloud.Response) error) (*sacloud.Server, error) { + res := &sacloud.Response{} + err := f(res) + if err != nil { + return nil, err + } + return res.Server, nil +} + +func (api *ServerAPI) createRequest(value *sacloud.Server) *sacloud.Request { + req := &sacloud.Request{} + req.Server = value + return req +} diff --git a/vendor/github.com/sacloud/libsacloud/api/sim.go b/vendor/github.com/sacloud/libsacloud/api/sim.go new file mode 100644 index 00000000..23c55780 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/sim.go @@ -0,0 +1,217 @@ +package api + +import ( + "encoding/json" + "fmt" + + "github.com/sacloud/libsacloud/sacloud" +) + +// SearchSIMResponse SIM検索レスポンス +type SearchSIMResponse struct { + // Total 総件数 + Total int `json:",omitempty"` + // From ページング開始位置 + From int `json:",omitempty"` + // Count 件数 + Count int `json:",omitempty"` + // CommonServiceSIMItems SIMリスト + CommonServiceSIMItems []sacloud.SIM `json:"CommonServiceItems,omitempty"` +} +type simRequest struct { + CommonServiceSIMItem *sacloud.SIM `json:"CommonServiceItem,omitempty"` + From int `json:",omitempty"` + Count int `json:",omitempty"` + Sort []string `json:",omitempty"` + Filter map[string]interface{} `json:",omitempty"` + Exclude []string `json:",omitempty"` + Include []string `json:",omitempty"` +} +type simResponse struct { + *sacloud.ResultFlagValue + *sacloud.SIM `json:"CommonServiceItem,omitempty"` +} + +type simLogResponse struct { + Logs []sacloud.SIMLog `json:"logs,omitempty"` + IsOk bool `json:"is_ok,omitempty"` +} + +// SIMAPI SIM API +type SIMAPI struct { + *baseAPI +} + +// NewSIMAPI SIM API作成 +func NewSIMAPI(client *Client) *SIMAPI { + return &SIMAPI{ + &baseAPI{ + client: client, + FuncGetResourceURL: func() string { + return "commonserviceitem" + }, + FuncBaseSearchCondition: func() *sacloud.Request { + res := &sacloud.Request{} + res.AddFilter("Provider.Class", "sim") + return res + }, + }, + } +} + +// Find 検索 +func (api *SIMAPI) Find() (*SearchSIMResponse, error) { + + data, err := api.client.newRequest("GET", api.getResourceURL(), api.getSearchState()) + if err != nil { + return nil, err + } + var res SearchSIMResponse + if err := json.Unmarshal(data, &res); err != nil { + return nil, err + } + return &res, nil +} + +func (api *SIMAPI) request(f func(*simResponse) error) (*sacloud.SIM, error) { + res := &simResponse{} + err := f(res) + if err != nil { + return nil, err + } + return res.SIM, nil +} + +func (api *SIMAPI) createRequest(value *sacloud.SIM) *simRequest { + req := &simRequest{} + req.CommonServiceSIMItem = value + return req +} + +// Create 新規作成 +func (api *SIMAPI) Create(value *sacloud.SIM) (*sacloud.SIM, error) { + return api.request(func(res *simResponse) error { + return api.create(api.createRequest(value), res) + }) +} + +// New 新規作成用パラメーター作成 +func (api *SIMAPI) New(name, iccID, passcode string) *sacloud.SIM { + return sacloud.CreateNewSIM(name, iccID, passcode) +} + +// Read 読み取り +func (api *SIMAPI) Read(id int64) (*sacloud.SIM, error) { + return api.request(func(res *simResponse) error { + return api.read(id, nil, res) + }) +} + +// Update 更新 +func (api *SIMAPI) Update(id int64, value *sacloud.SIM) (*sacloud.SIM, error) { + return api.request(func(res *simResponse) error { + return api.update(id, api.createRequest(value), res) + }) +} + +// Delete 削除 +func (api *SIMAPI) Delete(id int64) (*sacloud.SIM, error) { + return api.request(func(res *simResponse) error { + return api.delete(id, nil, res) + }) +} + +// Activate SIM有効化 +func (api *SIMAPI) Activate(id int64) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/sim/activate", api.getResourceURL(), id) + ) + + return api.modify(method, uri, nil) +} + +// Deactivate SIM無効化 +func (api *SIMAPI) Deactivate(id int64) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/sim/deactivate", api.getResourceURL(), id) + ) + + return api.modify(method, uri, nil) +} + +// AssignIP SIMへのIP割り当て +func (api *SIMAPI) AssignIP(id int64, ip string) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/sim/ip", api.getResourceURL(), id) + ) + + return api.modify(method, uri, map[string]interface{}{ + "sim": map[string]interface{}{ + "ip": ip, + }, + }) +} + +// ClearIP SIMからのIP割り当て解除 +func (api *SIMAPI) ClearIP(id int64) (bool, error) { + var ( + method = "DELETE" + uri = fmt.Sprintf("%s/%d/sim/ip", api.getResourceURL(), id) + ) + return api.modify(method, uri, nil) +} + +// IMEILock IMEIロック +func (api *SIMAPI) IMEILock(id int64, imei string) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/sim/imeilock", api.getResourceURL(), id) + ) + + return api.modify(method, uri, map[string]interface{}{ + "sim": map[string]interface{}{ + "imei": imei, + }, + }) +} + +// IMEIUnlock IMEIアンロック +func (api *SIMAPI) IMEIUnlock(id int64) (bool, error) { + var ( + method = "DELETE" + uri = fmt.Sprintf("%s/%d/sim/imeilock", api.getResourceURL(), id) + ) + return api.modify(method, uri, nil) +} + +// Logs セッションログ取得 +func (api *SIMAPI) Logs(id int64, body interface{}) ([]sacloud.SIMLog, error) { + var ( + method = "GET" + uri = fmt.Sprintf("%s/%d/sim/sessionlog", api.getResourceURL(), id) + ) + + res := &simLogResponse{} + err := api.baseAPI.request(method, uri, body, res) + if err != nil { + return nil, err + } + return res.Logs, nil +} + +// Monitor アクティビティーモニター(Up/Down link BPS)取得 +func (api *SIMAPI) Monitor(id int64, body *sacloud.ResourceMonitorRequest) (*sacloud.MonitorValues, error) { + var ( + method = "GET" + uri = fmt.Sprintf("%s/%d/sim/metrics", api.getResourceURL(), id) + ) + res := &sacloud.ResourceMonitorResponse{} + err := api.baseAPI.request(method, uri, body, res) + if err != nil { + return nil, err + } + return res.Data, nil +} diff --git a/vendor/github.com/sacloud/libsacloud/api/sim_gen.go b/vendor/github.com/sacloud/libsacloud/api/sim_gen.go new file mode 100644 index 00000000..2bb05cc0 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/sim_gen.go @@ -0,0 +1,238 @@ +package api + +/************************************************ + generated by IDE. for [SIMAPI] +************************************************/ + +import ( + "github.com/sacloud/libsacloud/sacloud" +) + +/************************************************ + To support fluent interface for Find() +************************************************/ + +// Reset 検索条件のリセット +func (api *SIMAPI) Reset() *SIMAPI { + api.reset() + return api +} + +// Offset オフセット +func (api *SIMAPI) Offset(offset int) *SIMAPI { + api.offset(offset) + return api +} + +// Limit リミット +func (api *SIMAPI) Limit(limit int) *SIMAPI { + api.limit(limit) + return api +} + +// Include 取得する項目 +func (api *SIMAPI) Include(key string) *SIMAPI { + api.include(key) + return api +} + +// Exclude 除外する項目 +func (api *SIMAPI) Exclude(key string) *SIMAPI { + api.exclude(key) + return api +} + +// FilterBy 指定キーでのフィルター +func (api *SIMAPI) FilterBy(key string, value interface{}) *SIMAPI { + api.filterBy(key, value, false) + return api +} + +// FilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *SIMAPI) FilterMultiBy(key string, value interface{}) *SIMAPI { + api.filterBy(key, value, true) + return api +} + +// WithNameLike 名称条件 +func (api *SIMAPI) WithNameLike(name string) *SIMAPI { + return api.FilterBy("Name", name) +} + +// WithTag タグ条件 +func (api *SIMAPI) WithTag(tag string) *SIMAPI { + return api.FilterBy("Tags.Name", tag) +} + +// WithTags タグ(複数)条件 +func (api *SIMAPI) WithTags(tags []string) *SIMAPI { + return api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *SIMAPI) WithSizeGib(size int) *SIMAPI { +// api.FilterBy("SizeMB", size*1024) +// return api +// } + +// func (api *SIMAPI) WithSharedScope() *SIMAPI { +// api.FilterBy("Scope", "shared") +// return api +// } + +// func (api *SIMAPI) WithUserScope() *SIMAPI { +// api.FilterBy("Scope", "user") +// return api +// } + +// SortBy 指定キーでのソート +func (api *SIMAPI) SortBy(key string, reverse bool) *SIMAPI { + api.sortBy(key, reverse) + return api +} + +// SortByName 名称でのソート +func (api *SIMAPI) SortByName(reverse bool) *SIMAPI { + api.sortByName(reverse) + return api +} + +// func (api *SIMAPI) SortBySize(reverse bool) *SIMAPI { +// api.sortBy("SizeMB", reverse) +// return api +// } + +/************************************************ + To support Setxxx interface for Find() +************************************************/ + +// SetEmpty 検索条件のリセット +func (api *SIMAPI) SetEmpty() { + api.reset() +} + +// SetOffset オフセット +func (api *SIMAPI) SetOffset(offset int) { + api.offset(offset) +} + +// SetLimit リミット +func (api *SIMAPI) SetLimit(limit int) { + api.limit(limit) +} + +// SetInclude 取得する項目 +func (api *SIMAPI) SetInclude(key string) { + api.include(key) +} + +// SetExclude 除外する項目 +func (api *SIMAPI) SetExclude(key string) { + api.exclude(key) +} + +// SetFilterBy 指定キーでのフィルター +func (api *SIMAPI) SetFilterBy(key string, value interface{}) { + api.filterBy(key, value, false) +} + +// SetFilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *SIMAPI) SetFilterMultiBy(key string, value interface{}) { + api.filterBy(key, value, true) +} + +// SetNameLike 名称条件 +func (api *SIMAPI) SetNameLike(name string) { + api.FilterBy("Name", name) +} + +// SetTag タグ条件 +func (api *SIMAPI) SetTag(tag string) { + api.FilterBy("Tags.Name", tag) +} + +// SetTags タグ(複数)条件 +func (api *SIMAPI) SetTags(tags []string) { + api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *SIMAPI) SetSizeGib(size int) { +// api.FilterBy("SizeMB", size*1024) +// } + +// func (api *SIMAPI) SetSharedScope() { +// api.FilterBy("Scope", "shared") +// } + +// func (api *SIMAPI) SetUserScope() { +// api.FilterBy("Scope", "user") +// } + +// SetSortBy 指定キーでのソート +func (api *SIMAPI) SetSortBy(key string, reverse bool) { + api.sortBy(key, reverse) +} + +// SetSortByName 名称でのソート +func (api *SIMAPI) SetSortByName(reverse bool) { + api.sortByName(reverse) +} + +// func (api *SIMAPI) SetSortBySize(reverse bool) { +// api.sortBy("SizeMB", reverse) +// } + +/************************************************ + To support CRUD(Create/Read/Update/Delete) +************************************************/ + +// func (api *SIMAPI) New() *sacloud.SIM { +// return &sacloud.SIM{} +// } + +// func (api *SIMAPI) Create(value *sacloud.SIM) (*sacloud.SIM, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.create(api.createRequest(value), res) +// }) +// } + +// func (api *SIMAPI) Read(id string) (*sacloud.SIM, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.read(id, nil, res) +// }) +// } + +// func (api *SIMAPI) Update(id string, value *sacloud.SIM) (*sacloud.SIM, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.update(id, api.createRequest(value), res) +// }) +// } + +// func (api *SIMAPI) Delete(id string) (*sacloud.SIM, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.delete(id, nil, res) +// }) +// } + +/************************************************ + Inner functions +************************************************/ + +func (api *SIMAPI) setStateValue(setFunc func(*sacloud.Request)) *SIMAPI { + api.baseAPI.setStateValue(setFunc) + return api +} + +//func (api *SIMAPI) request(f func(*sacloud.Response) error) (*sacloud.SIM, error) { +// res := &sacloud.Response{} +// err := f(res) +// if err != nil { +// return nil, err +// } +// return res.SIM, nil +//} +// +//func (api *SIMAPI) createRequest(value *sacloud.SIM) *simRequest { +// req := &simRequest{} +// req.CommonServiceSIMItem = value +// return req +//} diff --git a/vendor/github.com/sacloud/libsacloud/api/simple_monitor.go b/vendor/github.com/sacloud/libsacloud/api/simple_monitor.go new file mode 100644 index 00000000..8e1a45b2 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/simple_monitor.go @@ -0,0 +1,133 @@ +package api + +import ( + "encoding/json" + // "strings" + "fmt" + "github.com/sacloud/libsacloud/sacloud" +) + +//HACK: さくらのAPI側仕様: CommonServiceItemsの内容によってJSONフォーマットが異なるため +// DNS/GSLB/シンプル監視それぞれでリクエスト/レスポンスデータ型を定義する。 + +// SearchSimpleMonitorResponse シンプル監視検索レスポンス +type SearchSimpleMonitorResponse struct { + // Total 総件数 + Total int `json:",omitempty"` + // From ページング開始位置 + From int `json:",omitempty"` + // Count 件数 + Count int `json:",omitempty"` + // SimpleMonitors シンプル監視 リスト + SimpleMonitors []sacloud.SimpleMonitor `json:"CommonServiceItems,omitempty"` +} + +type simpleMonitorRequest struct { + SimpleMonitor *sacloud.SimpleMonitor `json:"CommonServiceItem,omitempty"` + From int `json:",omitempty"` + Count int `json:",omitempty"` + Sort []string `json:",omitempty"` + Filter map[string]interface{} `json:",omitempty"` + Exclude []string `json:",omitempty"` + Include []string `json:",omitempty"` +} + +type simpleMonitorResponse struct { + *sacloud.ResultFlagValue + *sacloud.SimpleMonitor `json:"CommonServiceItem,omitempty"` +} + +// SimpleMonitorAPI シンプル監視API +type SimpleMonitorAPI struct { + *baseAPI +} + +// NewSimpleMonitorAPI シンプル監視API作成 +func NewSimpleMonitorAPI(client *Client) *SimpleMonitorAPI { + return &SimpleMonitorAPI{ + &baseAPI{ + client: client, + FuncGetResourceURL: func() string { + return "commonserviceitem" + }, + FuncBaseSearchCondition: func() *sacloud.Request { + res := &sacloud.Request{} + res.AddFilter("Provider.Class", "simplemon") + return res + }, + }, + } +} + +// Find 検索 +func (api *SimpleMonitorAPI) Find() (*SearchSimpleMonitorResponse, error) { + data, err := api.client.newRequest("GET", api.getResourceURL(), api.getSearchState()) + if err != nil { + return nil, err + } + var res SearchSimpleMonitorResponse + if err := json.Unmarshal(data, &res); err != nil { + return nil, err + } + return &res, nil +} + +func (api *SimpleMonitorAPI) request(f func(*simpleMonitorResponse) error) (*sacloud.SimpleMonitor, error) { + res := &simpleMonitorResponse{} + err := f(res) + if err != nil { + return nil, err + } + return res.SimpleMonitor, nil +} + +func (api *SimpleMonitorAPI) createRequest(value *sacloud.SimpleMonitor) *simpleMonitorResponse { + return &simpleMonitorResponse{SimpleMonitor: value} +} + +// New 新規作成用パラメーター作成 +func (api *SimpleMonitorAPI) New(target string) *sacloud.SimpleMonitor { + return sacloud.CreateNewSimpleMonitor(target) +} + +// Create 新規作成 +func (api *SimpleMonitorAPI) Create(value *sacloud.SimpleMonitor) (*sacloud.SimpleMonitor, error) { + return api.request(func(res *simpleMonitorResponse) error { + return api.create(api.createRequest(value), res) + }) +} + +// Read 読み取り +func (api *SimpleMonitorAPI) Read(id int64) (*sacloud.SimpleMonitor, error) { + return api.request(func(res *simpleMonitorResponse) error { + return api.read(id, nil, res) + }) +} + +// Update 更新 +func (api *SimpleMonitorAPI) Update(id int64, value *sacloud.SimpleMonitor) (*sacloud.SimpleMonitor, error) { + return api.request(func(res *simpleMonitorResponse) error { + return api.update(id, api.createRequest(value), res) + }) +} + +// Delete 削除 +func (api *SimpleMonitorAPI) Delete(id int64) (*sacloud.SimpleMonitor, error) { + return api.request(func(res *simpleMonitorResponse) error { + return api.delete(id, nil, res) + }) +} + +// MonitorResponseTimeSec アクティビティーモニター(レスポンスタイム)取得 +func (api *SimpleMonitorAPI) MonitorResponseTimeSec(id int64, body *sacloud.ResourceMonitorRequest) (*sacloud.MonitorValues, error) { + var ( + method = "GET" + uri = fmt.Sprintf("%s/%d/activity/responsetimesec/monitor", api.getResourceURL(), id) + ) + res := &sacloud.ResourceMonitorResponse{} + err := api.baseAPI.request(method, uri, body, res) + if err != nil { + return nil, err + } + return res.Data, nil +} diff --git a/vendor/github.com/sacloud/libsacloud/api/simple_monitor_gen.go b/vendor/github.com/sacloud/libsacloud/api/simple_monitor_gen.go new file mode 100644 index 00000000..5c5279f5 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/simple_monitor_gen.go @@ -0,0 +1,238 @@ +package api + +/************************************************ + generated by IDE. for [SimpleMonitorAPI] +************************************************/ + +import ( + "github.com/sacloud/libsacloud/sacloud" +) + +/************************************************ + To support fluent interface for Find() +************************************************/ + +// Reset 検索条件のリセット +func (api *SimpleMonitorAPI) Reset() *SimpleMonitorAPI { + api.reset() + return api +} + +// Offset オフセット +func (api *SimpleMonitorAPI) Offset(offset int) *SimpleMonitorAPI { + api.offset(offset) + return api +} + +// Limit リミット +func (api *SimpleMonitorAPI) Limit(limit int) *SimpleMonitorAPI { + api.limit(limit) + return api +} + +// Include 取得する項目 +func (api *SimpleMonitorAPI) Include(key string) *SimpleMonitorAPI { + api.include(key) + return api +} + +// Exclude 除外する項目 +func (api *SimpleMonitorAPI) Exclude(key string) *SimpleMonitorAPI { + api.exclude(key) + return api +} + +// FilterBy 指定キーでのフィルター +func (api *SimpleMonitorAPI) FilterBy(key string, value interface{}) *SimpleMonitorAPI { + api.filterBy(key, value, false) + return api +} + +// FilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *SimpleMonitorAPI) FilterMultiBy(key string, value interface{}) *SimpleMonitorAPI { + api.filterBy(key, value, true) + return api +} + +// WithNameLike 名称条件 +func (api *SimpleMonitorAPI) WithNameLike(name string) *SimpleMonitorAPI { + return api.FilterBy("Name", name) +} + +// WithTag タグ条件 +func (api *SimpleMonitorAPI) WithTag(tag string) *SimpleMonitorAPI { + return api.FilterBy("Tags.Name", tag) +} + +// WithTags タグ(複数)条件 +func (api *SimpleMonitorAPI) WithTags(tags []string) *SimpleMonitorAPI { + return api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *SimpleMonitorAPI) WithSizeGib(size int) *SimpleMonitorAPI { +// api.FilterBy("SizeMB", size*1024) +// return api +// } + +// func (api *SimpleMonitorAPI) WithSharedScope() *SimpleMonitorAPI { +// api.FilterBy("Scope", "shared") +// return api +// } + +// func (api *SimpleMonitorAPI) WithUserScope() *SimpleMonitorAPI { +// api.FilterBy("Scope", "user") +// return api +// } + +// SortBy 指定キーでのソート +func (api *SimpleMonitorAPI) SortBy(key string, reverse bool) *SimpleMonitorAPI { + api.sortBy(key, reverse) + return api +} + +// SortByName 名称でのソート +func (api *SimpleMonitorAPI) SortByName(reverse bool) *SimpleMonitorAPI { + api.sortByName(reverse) + return api +} + +// func (api *SimpleMonitorAPI) SortBySize(reverse bool) *SimpleMonitorAPI { +// api.sortBy("SizeMB", reverse) +// return api +// } + +/************************************************ + To support Setxxx interface for Find() +************************************************/ + +// SetEmpty 検索条件のリセット +func (api *SimpleMonitorAPI) SetEmpty() { + api.reset() +} + +// SetOffset オフセット +func (api *SimpleMonitorAPI) SetOffset(offset int) { + api.offset(offset) +} + +// SetLimit リミット +func (api *SimpleMonitorAPI) SetLimit(limit int) { + api.limit(limit) +} + +// SetInclude 取得する項目 +func (api *SimpleMonitorAPI) SetInclude(key string) { + api.include(key) +} + +// SetExclude 除外する項目 +func (api *SimpleMonitorAPI) SetExclude(key string) { + api.exclude(key) +} + +// SetFilterBy 指定キーでのフィルター +func (api *SimpleMonitorAPI) SetFilterBy(key string, value interface{}) { + api.filterBy(key, value, false) +} + +// SetFilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *SimpleMonitorAPI) SetFilterMultiBy(key string, value interface{}) { + api.filterBy(key, value, true) +} + +// SetNameLike 名称条件 +func (api *SimpleMonitorAPI) SetNameLike(name string) { + api.FilterBy("Name", name) +} + +// SetTag タグ条件 +func (api *SimpleMonitorAPI) SetTag(tag string) { + api.FilterBy("Tags.Name", tag) +} + +// SetTags タグ(複数)条件 +func (api *SimpleMonitorAPI) SetTags(tags []string) { + api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *SimpleMonitorAPI) SetSizeGib(size int) { +// api.FilterBy("SizeMB", size*1024) +// } + +// func (api *SimpleMonitorAPI) SetSharedScope() { +// api.FilterBy("Scope", "shared") +// } + +// func (api *SimpleMonitorAPI) SetUserScope() { +// api.FilterBy("Scope", "user") +// } + +// SetSortBy 指定キーでのソート +func (api *SimpleMonitorAPI) SetSortBy(key string, reverse bool) { + api.sortBy(key, reverse) +} + +// SetSortByName 名称でのソート +func (api *SimpleMonitorAPI) SetSortByName(reverse bool) { + api.sortByName(reverse) +} + +// func (api *SimpleMonitorAPI) SetSortBySize(reverse bool) { +// api.sortBy("SizeMB", reverse) +// } + +/************************************************ + To support CRUD(Create/Read/Update/Delete) +************************************************/ + +// func (api *SimpleMonitorAPI) New() *sacloud.SimpleMonitor { +// return &sacloud.SimpleMonitor{} +// } + +// func (api *SimpleMonitorAPI) Create(value *sacloud.SimpleMonitor) (*sacloud.SimpleMonitor, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.create(api.createRequest(value), res) +// }) +// } + +// func (api *SimpleMonitorAPI) Read(id string) (*sacloud.SimpleMonitor, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.read(id, nil, res) +// }) +// } + +// func (api *SimpleMonitorAPI) Update(id string, value *sacloud.SimpleMonitor) (*sacloud.SimpleMonitor, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.update(id, api.createRequest(value), res) +// }) +// } + +// func (api *SimpleMonitorAPI) Delete(id string) (*sacloud.SimpleMonitor, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.delete(id, nil, res) +// }) +// } + +/************************************************ + Inner functions +************************************************/ + +func (api *SimpleMonitorAPI) setStateValue(setFunc func(*sacloud.Request)) *SimpleMonitorAPI { + api.baseAPI.setStateValue(setFunc) + return api +} + +//func (api *SimpleMonitorAPI) request(f func(*sacloud.Response) error) (*sacloud.SimpleMonitor, error) { +// res := &sacloud.Response{} +// err := f(res) +// if err != nil { +// return nil, err +// } +// return res.SimpleMonitor, nil +//} +// +//func (api *SimpleMonitorAPI) createRequest(value *sacloud.SimpleMonitor) *sacloud.Request { +// req := &sacloud.Request{} +// req.SimpleMonitor = value +// return req +//} diff --git a/vendor/github.com/sacloud/libsacloud/api/ssh_key.go b/vendor/github.com/sacloud/libsacloud/api/ssh_key.go new file mode 100644 index 00000000..63148286 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/ssh_key.go @@ -0,0 +1,64 @@ +package api + +import ( + "fmt" + "github.com/sacloud/libsacloud/sacloud" +) + +// SSHKeyAPI 公開鍵API +type SSHKeyAPI struct { + *baseAPI +} + +// NewSSHKeyAPI 公開鍵API作成 +func NewSSHKeyAPI(client *Client) *SSHKeyAPI { + return &SSHKeyAPI{ + &baseAPI{ + client: client, + FuncGetResourceURL: func() string { + return "sshkey" + }, + }, + } +} + +// Generate 公開鍵の作成 +func (api *SSHKeyAPI) Generate(name string, passPhrase string, desc string) (*sacloud.SSHKeyGenerated, error) { + + var ( + method = "POST" + uri = fmt.Sprintf("%s/generate", api.getResourceURL()) + ) + + type genRequest struct { + Name string + GenerateFormat string + Description string + PassPhrase string + } + + type request struct { + SSHKey genRequest + } + type response struct { + *sacloud.ResultFlagValue + SSHKey *sacloud.SSHKeyGenerated + } + + body := &request{ + SSHKey: genRequest{ + Name: name, + GenerateFormat: "openssh", + PassPhrase: passPhrase, + Description: desc, + }, + } + + res := &response{} + + _, err := api.action(method, uri, body, res) + if err != nil { + return nil, fmt.Errorf("SSHKeyAPI: generate SSHKey is failed: %s", err) + } + return res.SSHKey, nil +} diff --git a/vendor/github.com/sacloud/libsacloud/api/ssh_key_gen.go b/vendor/github.com/sacloud/libsacloud/api/ssh_key_gen.go new file mode 100644 index 00000000..84388f8e --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/ssh_key_gen.go @@ -0,0 +1,243 @@ +package api + +/************************************************ + generated by IDE. for [SSHKeyAPI] +************************************************/ + +import ( + "github.com/sacloud/libsacloud/sacloud" +) + +/************************************************ + To support fluent interface for Find() +************************************************/ + +// Reset 検索条件のリセット +func (api *SSHKeyAPI) Reset() *SSHKeyAPI { + api.reset() + return api +} + +// Offset オフセット +func (api *SSHKeyAPI) Offset(offset int) *SSHKeyAPI { + api.offset(offset) + return api +} + +// Limit リミット +func (api *SSHKeyAPI) Limit(limit int) *SSHKeyAPI { + api.limit(limit) + return api +} + +// Include 取得する項目 +func (api *SSHKeyAPI) Include(key string) *SSHKeyAPI { + api.include(key) + return api +} + +// Exclude 除外する項目 +func (api *SSHKeyAPI) Exclude(key string) *SSHKeyAPI { + api.exclude(key) + return api +} + +// FilterBy 指定キーでのフィルター +func (api *SSHKeyAPI) FilterBy(key string, value interface{}) *SSHKeyAPI { + api.filterBy(key, value, false) + return api +} + +// FilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *SSHKeyAPI) FilterMultiBy(key string, value interface{}) *SSHKeyAPI { + api.filterBy(key, value, true) + return api +} + +// WithNameLike 名称条件 +func (api *SSHKeyAPI) WithNameLike(name string) *SSHKeyAPI { + return api.FilterBy("Name", name) +} + +// WithTag タグ条件 +func (api *SSHKeyAPI) WithTag(tag string) *SSHKeyAPI { + return api.FilterBy("Tags.Name", tag) +} + +// WithTags タグ(複数)条件 +func (api *SSHKeyAPI) WithTags(tags []string) *SSHKeyAPI { + return api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *SSHKeyAPI) WithSizeGib(size int) *SSHKeyAPI { +// api.FilterBy("SizeMB", size*1024) +// return api +// } + +// func (api *SSHKeyAPI) WithSharedScope() *SSHKeyAPI { +// api.FilterBy("Scope", "shared") +// return api +// } + +// func (api *SSHKeyAPI) WithUserScope() *SSHKeyAPI { +// api.FilterBy("Scope", "user") +// return api +// } + +// SortBy 指定キーでのソート +func (api *SSHKeyAPI) SortBy(key string, reverse bool) *SSHKeyAPI { + api.sortBy(key, reverse) + return api +} + +// SortByName 名称でのソート +func (api *SSHKeyAPI) SortByName(reverse bool) *SSHKeyAPI { + api.sortByName(reverse) + return api +} + +// func (api *SSHKeyAPI) SortBySize(reverse bool) *SSHKeyAPI { +// api.sortBy("SizeMB", reverse) +// return api +// } + +/************************************************ + To support Setxxx interface for Find() +************************************************/ + +// SetEmpty 検索条件のリセット +func (api *SSHKeyAPI) SetEmpty() { + api.reset() +} + +// SetOffset オフセット +func (api *SSHKeyAPI) SetOffset(offset int) { + api.offset(offset) +} + +// SetLimit リミット +func (api *SSHKeyAPI) SetLimit(limit int) { + api.limit(limit) +} + +// SetInclude 取得する項目 +func (api *SSHKeyAPI) SetInclude(key string) { + api.include(key) +} + +// SetExclude 除外する項目 +func (api *SSHKeyAPI) SetExclude(key string) { + api.exclude(key) +} + +// SetFilterBy 指定キーでのフィルター +func (api *SSHKeyAPI) SetFilterBy(key string, value interface{}) { + api.filterBy(key, value, false) +} + +// SetFilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *SSHKeyAPI) SetFilterMultiBy(key string, value interface{}) { + api.filterBy(key, value, true) +} + +// SetNameLike 名称条件 +func (api *SSHKeyAPI) SetNameLike(name string) { + api.FilterBy("Name", name) +} + +// SetTag タグ条件 +func (api *SSHKeyAPI) SetTag(tag string) { + api.FilterBy("Tags.Name", tag) +} + +// SetTags タグ(複数)条件 +func (api *SSHKeyAPI) SetTags(tags []string) { + api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *SSHKeyAPI) SetSizeGib(size int) { +// api.FilterBy("SizeMB", size*1024) +// } + +// func (api *SSHKeyAPI) SetSharedScope() { +// api.FilterBy("Scope", "shared") +// } + +// func (api *SSHKeyAPI) SetUserScope() { +// api.FilterBy("Scope", "user") +// } + +// SetSortBy 指定キーでのソート +func (api *SSHKeyAPI) SetSortBy(key string, reverse bool) { + api.sortBy(key, reverse) +} + +// SetSortByName 名称でのソート +func (api *SSHKeyAPI) SetSortByName(reverse bool) { + api.sortByName(reverse) +} + +// func (api *SSHKeyAPI) SetSortBySize(reverse bool) { +// api.sortBy("SizeMB", reverse) +// } + +/************************************************ + To support CRUD(Create/Read/Update/Delete) +************************************************/ + +// New 新規作成用パラメーター作成 +func (api *SSHKeyAPI) New() *sacloud.SSHKey { + return &sacloud.SSHKey{} +} + +// Create 新規作成 +func (api *SSHKeyAPI) Create(value *sacloud.SSHKey) (*sacloud.SSHKey, error) { + return api.request(func(res *sacloud.Response) error { + return api.create(api.createRequest(value), res) + }) +} + +// Read 読み取り +func (api *SSHKeyAPI) Read(id int64) (*sacloud.SSHKey, error) { + return api.request(func(res *sacloud.Response) error { + return api.read(id, nil, res) + }) +} + +// Update 更新 +func (api *SSHKeyAPI) Update(id int64, value *sacloud.SSHKey) (*sacloud.SSHKey, error) { + return api.request(func(res *sacloud.Response) error { + return api.update(id, api.createRequest(value), res) + }) +} + +// Delete 削除 +func (api *SSHKeyAPI) Delete(id int64) (*sacloud.SSHKey, error) { + return api.request(func(res *sacloud.Response) error { + return api.delete(id, nil, res) + }) +} + +/************************************************ + Inner functions +************************************************/ + +func (api *SSHKeyAPI) setStateValue(setFunc func(*sacloud.Request)) *SSHKeyAPI { + api.baseAPI.setStateValue(setFunc) + return api +} + +func (api *SSHKeyAPI) request(f func(*sacloud.Response) error) (*sacloud.SSHKey, error) { + res := &sacloud.Response{} + err := f(res) + if err != nil { + return nil, err + } + return res.SSHKey, nil +} + +func (api *SSHKeyAPI) createRequest(value *sacloud.SSHKey) *sacloud.Request { + req := &sacloud.Request{} + req.SSHKey = value + return req +} diff --git a/vendor/github.com/sacloud/libsacloud/api/subnet.go b/vendor/github.com/sacloud/libsacloud/api/subnet.go new file mode 100644 index 00000000..a56d84c2 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/subnet.go @@ -0,0 +1,18 @@ +package api + +// SubnetAPI サブネットAPI +type SubnetAPI struct { + *baseAPI +} + +// NewSubnetAPI サブネットAPI作成 +func NewSubnetAPI(client *Client) *SubnetAPI { + return &SubnetAPI{ + &baseAPI{ + client: client, + FuncGetResourceURL: func() string { + return "subnet" + }, + }, + } +} diff --git a/vendor/github.com/sacloud/libsacloud/api/subnet_gen.go b/vendor/github.com/sacloud/libsacloud/api/subnet_gen.go new file mode 100644 index 00000000..025a75e6 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/subnet_gen.go @@ -0,0 +1,229 @@ +package api + +/************************************************ + generated by IDE. for [SubnetAPI] +************************************************/ + +import ( + "github.com/sacloud/libsacloud/sacloud" +) + +/************************************************ + To support fluent interface for Find() +************************************************/ + +// Reset 検索条件のリセット +func (api *SubnetAPI) Reset() *SubnetAPI { + api.reset() + return api +} + +// Offset オフセット +func (api *SubnetAPI) Offset(offset int) *SubnetAPI { + api.offset(offset) + return api +} + +// Limit リミット +func (api *SubnetAPI) Limit(limit int) *SubnetAPI { + api.limit(limit) + return api +} + +// Include 取得する項目 +func (api *SubnetAPI) Include(key string) *SubnetAPI { + api.include(key) + return api +} + +// Exclude 除外する項目 +func (api *SubnetAPI) Exclude(key string) *SubnetAPI { + api.exclude(key) + return api +} + +// FilterBy 指定キーでのフィルター +func (api *SubnetAPI) FilterBy(key string, value interface{}) *SubnetAPI { + api.filterBy(key, value, false) + return api +} + +// FilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *SubnetAPI) FilterMultiBy(key string, value interface{}) *SubnetAPI { + api.filterBy(key, value, true) + return api +} + +//func (api *SubnetAPI) WithNameLike(name string) *SubnetAPI { +// return api.FilterBy("Name", name) +//} +// +//func (api *SubnetAPI) WithTag(tag string) *SubnetAPI { +// return api.FilterBy("Tags.Name", tag) +//} +//func (api *SubnetAPI) WithTags(tags []string) *SubnetAPI { +// return api.FilterBy("Tags.Name", []interface{}{tags}) +//} + +// func (api *SubnetAPI) WithSizeGib(size int) *SubnetAPI { +// api.FilterBy("SizeMB", size*1024) +// return api +// } + +// func (api *SubnetAPI) WithSharedScope() *SubnetAPI { +// api.FilterBy("Scope", "shared") +// return api +// } + +// func (api *SubnetAPI) WithUserScope() *SubnetAPI { +// api.FilterBy("Scope", "user") +// return api +// } + +// SortBy 指定キーでのソート +func (api *SubnetAPI) SortBy(key string, reverse bool) *SubnetAPI { + api.sortBy(key, reverse) + return api +} + +//func (api *SubnetAPI) SortByName(reverse bool) *SubnetAPI { +// api.sortByName(reverse) +// return api +//} + +// func (api *SubnetAPI) SortBySize(reverse bool) *SubnetAPI { +// api.sortBy("SizeMB", reverse) +// return api +// } + +/************************************************ + To support Setxxx interface for Find() +************************************************/ + +// SetEmpty 検索条件のリセット +func (api *SubnetAPI) SetEmpty() { + api.reset() +} + +// SetOffset オフセット +func (api *SubnetAPI) SetOffset(offset int) { + api.offset(offset) +} + +// SetLimit リミット +func (api *SubnetAPI) SetLimit(limit int) { + api.limit(limit) +} + +// SetInclude 取得する項目 +func (api *SubnetAPI) SetInclude(key string) { + api.include(key) +} + +// SetExclude 除外する項目 +func (api *SubnetAPI) SetExclude(key string) { + api.exclude(key) +} + +// SetFilterBy 指定キーでのフィルター +func (api *SubnetAPI) SetFilterBy(key string, value interface{}) { + api.filterBy(key, value, false) +} + +// SetFilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *SubnetAPI) SetFilterMultiBy(key string, value interface{}) { + api.filterBy(key, value, true) +} + +//func (api *SubnetAPI) SetNameLike(name string) { +// api.FilterBy("Name", name) +//} +// +//func (api *SubnetAPI) SetTag(tag string) { +// api.FilterBy("Tags.Name", tag) +//} +//func (api *SubnetAPI) SetTags(tags []string) { +// api.FilterBy("Tags.Name", []interface{}{tags}) +//} + +// func (api *SubnetAPI) SetSizeGib(size int) { +// api.FilterBy("SizeMB", size*1024) +// } + +// func (api *SubnetAPI) SetSharedScope() { +// api.FilterBy("Scope", "shared") +// } + +// func (api *SubnetAPI) SetUserScope() { +// api.FilterBy("Scope", "user") +// } + +// SetSortBy 指定キーでのソート +func (api *SubnetAPI) SetSortBy(key string, reverse bool) { + api.sortBy(key, reverse) +} + +//func (api *SubnetAPI) SetSortByName(reverse bool) { +// api.sortByName(reverse) +//} + +// func (api *SubnetAPI) SetSortBySize(reverse bool) { +// api.sortBy("SizeMB", reverse) +// } + +/************************************************ + To support CRUD(Create/Read/Update/Delete) +************************************************/ + +//func (api *SubnetAPI) New() *sacloud.Subnet { +// return &sacloud.Subnet{} +//} + +//func (api *SubnetAPI) Create(value *sacloud.Subnet) (*sacloud.Subnet, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.create(api.createRequest(value), res) +// }) +//} + +// Read 読み取り +func (api *SubnetAPI) Read(id int64) (*sacloud.Subnet, error) { + return api.request(func(res *sacloud.Response) error { + return api.read(id, nil, res) + }) +} + +//func (api *SubnetAPI) Update(id int64, value *sacloud.Subnet) (*sacloud.Subnet, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.update(id, api.createRequest(value), res) +// }) +//} +// +//func (api *SubnetAPI) Delete(id int64) (*sacloud.Subnet, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.delete(id, nil, res) +// }) +//} + +/************************************************ + Inner functions +************************************************/ + +func (api *SubnetAPI) setStateValue(setFunc func(*sacloud.Request)) *SubnetAPI { + api.baseAPI.setStateValue(setFunc) + return api +} + +func (api *SubnetAPI) request(f func(*sacloud.Response) error) (*sacloud.Subnet, error) { + res := &sacloud.Response{} + err := f(res) + if err != nil { + return nil, err + } + return res.Subnet, nil +} + +func (api *SubnetAPI) createRequest(value *sacloud.Subnet) *sacloud.Request { + req := &sacloud.Request{} + req.Subnet = value + return req +} diff --git a/vendor/github.com/sacloud/libsacloud/api/switch.go b/vendor/github.com/sacloud/libsacloud/api/switch.go new file mode 100644 index 00000000..b646c10d --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/switch.go @@ -0,0 +1,55 @@ +package api + +import ( + "fmt" + "github.com/sacloud/libsacloud/sacloud" +) + +// SwitchAPI スイッチAPI +type SwitchAPI struct { + *baseAPI +} + +// NewSwitchAPI スイッチAPI作成 +func NewSwitchAPI(client *Client) *SwitchAPI { + return &SwitchAPI{ + &baseAPI{ + client: client, + FuncGetResourceURL: func() string { + return "switch" + }, + }, + } +} + +// DisconnectFromBridge ブリッジとの切断 +func (api *SwitchAPI) DisconnectFromBridge(switchID int64) (bool, error) { + var ( + method = "DELETE" + uri = fmt.Sprintf("%s/%d/to/bridge", api.getResourceURL(), switchID) + ) + return api.modify(method, uri, nil) +} + +// ConnectToBridge ブリッジとの接続 +func (api *SwitchAPI) ConnectToBridge(switchID int64, bridgeID int64) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/to/bridge/%d", api.getResourceURL(), switchID, bridgeID) + ) + return api.modify(method, uri, nil) +} + +// GetServers スイッチに接続されているサーバー一覧取得 +func (api *SwitchAPI) GetServers(switchID int64) ([]sacloud.Server, error) { + var ( + method = "GET" + uri = fmt.Sprintf("%s/%d/server", api.getResourceURL(), switchID) + res = &sacloud.SearchResponse{} + ) + err := api.baseAPI.request(method, uri, nil, res) + if err != nil { + return nil, err + } + return res.Servers, nil +} diff --git a/vendor/github.com/sacloud/libsacloud/api/switch_gen.go b/vendor/github.com/sacloud/libsacloud/api/switch_gen.go new file mode 100644 index 00000000..c7777155 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/switch_gen.go @@ -0,0 +1,243 @@ +package api + +/************************************************ + generated by IDE. for [SwitchAPI] +************************************************/ + +import ( + "github.com/sacloud/libsacloud/sacloud" +) + +/************************************************ + To support fluent interface for Find() +************************************************/ + +// Reset 検索条件のリセット +func (api *SwitchAPI) Reset() *SwitchAPI { + api.reset() + return api +} + +// Offset オフセット +func (api *SwitchAPI) Offset(offset int) *SwitchAPI { + api.offset(offset) + return api +} + +// Limit リミット +func (api *SwitchAPI) Limit(limit int) *SwitchAPI { + api.limit(limit) + return api +} + +// Include 取得する項目 +func (api *SwitchAPI) Include(key string) *SwitchAPI { + api.include(key) + return api +} + +// Exclude 除外する項目 +func (api *SwitchAPI) Exclude(key string) *SwitchAPI { + api.exclude(key) + return api +} + +// FilterBy 指定キーでのフィルター +func (api *SwitchAPI) FilterBy(key string, value interface{}) *SwitchAPI { + api.filterBy(key, value, false) + return api +} + +// FilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *SwitchAPI) FilterMultiBy(key string, value interface{}) *SwitchAPI { + api.filterBy(key, value, true) + return api +} + +// WithNameLike 名称条件 +func (api *SwitchAPI) WithNameLike(name string) *SwitchAPI { + return api.FilterBy("Name", name) +} + +// WithTag タグ条件 +func (api *SwitchAPI) WithTag(tag string) *SwitchAPI { + return api.FilterBy("Tags.Name", tag) +} + +// WithTags タグ(複数)条件 +func (api *SwitchAPI) WithTags(tags []string) *SwitchAPI { + return api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *SwitchAPI) WithSizeGib(size int) *SwitchAPI { +// api.FilterBy("SizeMB", size*1024) +// return api +// } + +// func (api *SwitchAPI) WithSharedScope() *SwitchAPI { +// api.FilterBy("Scope", "shared") +// return api +// } + +// func (api *SwitchAPI) WithUserScope() *SwitchAPI { +// api.FilterBy("Scope", "user") +// return api +// } + +// SortBy 指定キーでのソート +func (api *SwitchAPI) SortBy(key string, reverse bool) *SwitchAPI { + api.sortBy(key, reverse) + return api +} + +// SortByName 名称でのソート +func (api *SwitchAPI) SortByName(reverse bool) *SwitchAPI { + api.sortByName(reverse) + return api +} + +// func (api *SwitchAPI) SortBySize(reverse bool) *SwitchAPI { +// api.sortBy("SizeMB", reverse) +// return api +// } + +/************************************************ + To support Setxxx interface for Find() +************************************************/ + +// SetEmpty 検索条件のリセット +func (api *SwitchAPI) SetEmpty() { + api.reset() +} + +// SetOffset オフセット +func (api *SwitchAPI) SetOffset(offset int) { + api.offset(offset) +} + +// SetLimit リミット +func (api *SwitchAPI) SetLimit(limit int) { + api.limit(limit) +} + +// SetInclude 取得する項目 +func (api *SwitchAPI) SetInclude(key string) { + api.include(key) +} + +// SetExclude 除外する項目 +func (api *SwitchAPI) SetExclude(key string) { + api.exclude(key) +} + +// SetFilterBy 指定キーでのフィルター +func (api *SwitchAPI) SetFilterBy(key string, value interface{}) { + api.filterBy(key, value, false) +} + +// SetFilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *SwitchAPI) SetFilterMultiBy(key string, value interface{}) { + api.filterBy(key, value, true) +} + +// SetNameLike 名称条件 +func (api *SwitchAPI) SetNameLike(name string) { + api.FilterBy("Name", name) +} + +// SetTag タグ条件 +func (api *SwitchAPI) SetTag(tag string) { + api.FilterBy("Tags.Name", tag) +} + +// SetTags タグ(複数)条件 +func (api *SwitchAPI) SetTags(tags []string) { + api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *SwitchAPI) SetSizeGib(size int) { +// api.FilterBy("SizeMB", size*1024) +// } + +// func (api *SwitchAPI) SetSharedScope() { +// api.FilterBy("Scope", "shared") +// } + +// func (api *SwitchAPI) SetUserScope() { +// api.FilterBy("Scope", "user") +// } + +// SetSortBy 指定キーでのソート +func (api *SwitchAPI) SetSortBy(key string, reverse bool) { + api.sortBy(key, reverse) +} + +// SetSortByName 名称でのソート +func (api *SwitchAPI) SetSortByName(reverse bool) { + api.sortByName(reverse) +} + +// func (api *SwitchAPI) SetSortBySize(reverse bool) { +// api.sortBy("SizeMB", reverse) +// } + +/************************************************ + To support CRUD(Create/Read/Update/Delete) +************************************************/ + +// New 新規作成用パラメーター作成 +func (api *SwitchAPI) New() *sacloud.Switch { + return &sacloud.Switch{} +} + +// Create 新規作成 +func (api *SwitchAPI) Create(value *sacloud.Switch) (*sacloud.Switch, error) { + return api.request(func(res *sacloud.Response) error { + return api.create(api.createRequest(value), res) + }) +} + +// Read 読み取り +func (api *SwitchAPI) Read(id int64) (*sacloud.Switch, error) { + return api.request(func(res *sacloud.Response) error { + return api.read(id, nil, res) + }) +} + +// Update 更新 +func (api *SwitchAPI) Update(id int64, value *sacloud.Switch) (*sacloud.Switch, error) { + return api.request(func(res *sacloud.Response) error { + return api.update(id, api.createRequest(value), res) + }) +} + +// Delete 削除 +func (api *SwitchAPI) Delete(id int64) (*sacloud.Switch, error) { + return api.request(func(res *sacloud.Response) error { + return api.delete(id, nil, res) + }) +} + +/************************************************ + Inner functions +************************************************/ + +func (api *SwitchAPI) setStateValue(setFunc func(*sacloud.Request)) *SwitchAPI { + api.baseAPI.setStateValue(setFunc) + return api +} + +func (api *SwitchAPI) request(f func(*sacloud.Response) error) (*sacloud.Switch, error) { + res := &sacloud.Response{} + err := f(res) + if err != nil { + return nil, err + } + return res.Switch, nil +} + +func (api *SwitchAPI) createRequest(value *sacloud.Switch) *sacloud.Request { + req := &sacloud.Request{} + req.Switch = value + return req +} diff --git a/vendor/github.com/sacloud/libsacloud/api/vpc_router.go b/vendor/github.com/sacloud/libsacloud/api/vpc_router.go new file mode 100644 index 00000000..43ad1513 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/vpc_router.go @@ -0,0 +1,437 @@ +package api + +import ( + "encoding/json" + "fmt" + "github.com/sacloud/libsacloud/sacloud" + "time" +) + +//HACK: さくらのAPI側仕様: Applianceの内容によってJSONフォーマットが異なるため +// ロードバランサ/VPCルータそれぞれでリクエスト/レスポンスデータ型を定義する。 + +// SearchVPCRouterResponse VPCルーター検索レスポンス +type SearchVPCRouterResponse struct { + // Total 総件数 + Total int `json:",omitempty"` + // From ページング開始位置 + From int `json:",omitempty"` + // Count 件数 + Count int `json:",omitempty"` + // VPCRouters VPCルーター リスト + VPCRouters []sacloud.VPCRouter `json:"Appliances,omitempty"` +} + +type vpcRouterRequest struct { + VPCRouter *sacloud.VPCRouter `json:"Appliance,omitempty"` + From int `json:",omitempty"` + Count int `json:",omitempty"` + Sort []string `json:",omitempty"` + Filter map[string]interface{} `json:",omitempty"` + Exclude []string `json:",omitempty"` + Include []string `json:",omitempty"` +} + +type vpcRouterResponse struct { + *sacloud.ResultFlagValue + *sacloud.VPCRouter `json:"Appliance,omitempty"` + Success interface{} `json:",omitempty"` //HACK: さくらのAPI側仕様: 戻り値:Successがbool値へ変換できないためinterface{} +} + +type vpcRouterStatusResponse struct { + *sacloud.ResultFlagValue + *sacloud.VPCRouterStatus `json:"Router"` + Success interface{} `json:",omitempty"` //HACK: さくらのAPI側仕様: 戻り値:Successがbool値へ変換できないためinterface{} +} + +type vpcRouterS2sConnInfoResponse struct { + *sacloud.ResultFlagValue + *sacloud.SiteToSiteConnectionInfo + Name string +} + +// VPCRouterAPI VPCルーターAPI +type VPCRouterAPI struct { + *baseAPI +} + +// NewVPCRouterAPI VPCルーターAPI作成 +func NewVPCRouterAPI(client *Client) *VPCRouterAPI { + return &VPCRouterAPI{ + &baseAPI{ + client: client, + FuncGetResourceURL: func() string { + return "appliance" + }, + FuncBaseSearchCondition: func() *sacloud.Request { + res := &sacloud.Request{} + res.AddFilter("Class", "vpcrouter") + return res + }, + }, + } +} + +// Find 検索 +func (api *VPCRouterAPI) Find() (*SearchVPCRouterResponse, error) { + data, err := api.client.newRequest("GET", api.getResourceURL(), api.getSearchState()) + if err != nil { + return nil, err + } + var res SearchVPCRouterResponse + if err := json.Unmarshal(data, &res); err != nil { + return nil, err + } + return &res, nil +} + +func (api *VPCRouterAPI) request(f func(*vpcRouterResponse) error) (*sacloud.VPCRouter, error) { + res := &vpcRouterResponse{} + err := f(res) + if err != nil { + return nil, err + } + return res.VPCRouter, nil +} + +func (api *VPCRouterAPI) createRequest(value *sacloud.VPCRouter) *vpcRouterResponse { + return &vpcRouterResponse{VPCRouter: value} +} + +// New 新規作成用パラメーター作成 +func (api *VPCRouterAPI) New() *sacloud.VPCRouter { + return sacloud.CreateNewVPCRouter() +} + +// Create 新規作成 +func (api *VPCRouterAPI) Create(value *sacloud.VPCRouter) (*sacloud.VPCRouter, error) { + return api.request(func(res *vpcRouterResponse) error { + return api.create(api.createRequest(value), res) + }) +} + +// Read 読み取り +func (api *VPCRouterAPI) Read(id int64) (*sacloud.VPCRouter, error) { + return api.request(func(res *vpcRouterResponse) error { + return api.read(id, nil, res) + }) +} + +// Update 更新 +func (api *VPCRouterAPI) Update(id int64, value *sacloud.VPCRouter) (*sacloud.VPCRouter, error) { + return api.request(func(res *vpcRouterResponse) error { + return api.update(id, api.createRequest(value), res) + }) +} + +// UpdateSetting 設定更新 +func (api *VPCRouterAPI) UpdateSetting(id int64, value *sacloud.VPCRouter) (*sacloud.VPCRouter, error) { + req := &sacloud.VPCRouter{ + // Settings + Settings: value.Settings, + } + return api.request(func(res *vpcRouterResponse) error { + return api.update(id, api.createRequest(req), res) + }) +} + +// Delete 削除 +func (api *VPCRouterAPI) Delete(id int64) (*sacloud.VPCRouter, error) { + return api.request(func(res *vpcRouterResponse) error { + return api.delete(id, nil, res) + }) +} + +// Config 設定変更の反映 +func (api *VPCRouterAPI) Config(id int64) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/config", api.getResourceURL(), id) + ) + return api.modify(method, uri, nil) +} + +// ConnectToSwitch 指定のインデックス位置のNICをスイッチへ接続 +func (api *VPCRouterAPI) ConnectToSwitch(id int64, switchID int64, nicIndex int) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/interface/%d/to/switch/%d", api.getResourceURL(), id, nicIndex, switchID) + ) + return api.modify(method, uri, nil) +} + +// DisconnectFromSwitch 指定のインデックス位置のNICをスイッチから切断 +func (api *VPCRouterAPI) DisconnectFromSwitch(id int64, nicIndex int) (bool, error) { + var ( + method = "DELETE" + uri = fmt.Sprintf("%s/%d/interface/%d/to/switch", api.getResourceURL(), id, nicIndex) + ) + return api.modify(method, uri, nil) +} + +// IsUp 起動しているか判定 +func (api *VPCRouterAPI) IsUp(id int64) (bool, error) { + router, err := api.Read(id) + if err != nil { + return false, err + } + return router.Instance.IsUp(), nil +} + +// IsDown ダウンしているか判定 +func (api *VPCRouterAPI) IsDown(id int64) (bool, error) { + router, err := api.Read(id) + if err != nil { + return false, err + } + return router.Instance.IsDown(), nil +} + +// Boot 起動 +func (api *VPCRouterAPI) Boot(id int64) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/power", api.getResourceURL(), id) + ) + return api.modify(method, uri, nil) +} + +// Shutdown シャットダウン(graceful) +func (api *VPCRouterAPI) Shutdown(id int64) (bool, error) { + var ( + method = "DELETE" + uri = fmt.Sprintf("%s/%d/power", api.getResourceURL(), id) + ) + + return api.modify(method, uri, nil) +} + +// Stop シャットダウン(force) +func (api *VPCRouterAPI) Stop(id int64) (bool, error) { + var ( + method = "DELETE" + uri = fmt.Sprintf("%s/%d/power", api.getResourceURL(), id) + ) + + return api.modify(method, uri, map[string]bool{"Force": true}) +} + +// RebootForce 再起動 +func (api *VPCRouterAPI) RebootForce(id int64) (bool, error) { + var ( + method = "PUT" + uri = fmt.Sprintf("%s/%d/reset", api.getResourceURL(), id) + ) + + return api.modify(method, uri, nil) +} + +// SleepUntilUp 起動するまで待機 +func (api *VPCRouterAPI) SleepUntilUp(id int64, timeout time.Duration) error { + handler := waitingForUpFunc(func() (hasUpDown, error) { + return api.Read(id) + }, 0) + return blockingPoll(handler, timeout) +} + +// SleepUntilDown ダウンするまで待機 +func (api *VPCRouterAPI) SleepUntilDown(id int64, timeout time.Duration) error { + handler := waitingForDownFunc(func() (hasUpDown, error) { + return api.Read(id) + }, 0) + return blockingPoll(handler, timeout) +} + +// SleepWhileCopying コピー終了まで待機 +// +// maxRetry: リクエストタイミングによって、コピー完了までの間に404エラーとなる場合がある。 +// 通常そのまま待てばコピー完了するため、404エラーが発生してもmaxRetryで指定した回数分は待機する。 +func (api *VPCRouterAPI) SleepWhileCopying(id int64, timeout time.Duration, maxRetry int) error { + handler := waitingForAvailableFunc(func() (hasAvailable, error) { + return api.Read(id) + }, maxRetry) + return blockingPoll(handler, timeout) +} + +// AsyncSleepWhileCopying コピー終了まで待機(非同期) +func (api *VPCRouterAPI) AsyncSleepWhileCopying(id int64, timeout time.Duration, maxRetry int) (chan (interface{}), chan (interface{}), chan (error)) { + handler := waitingForAvailableFunc(func() (hasAvailable, error) { + return api.Read(id) + }, maxRetry) + return poll(handler, timeout) +} + +// AddStandardInterface スタンダードプランでのインターフェース追加 +func (api *VPCRouterAPI) AddStandardInterface(routerID int64, switchID int64, ipaddress string, maskLen int) (*sacloud.VPCRouter, error) { + return api.addInterface(routerID, switchID, &sacloud.VPCRouterInterface{ + IPAddress: []string{ipaddress}, + NetworkMaskLen: maskLen, + VirtualIPAddress: "", + }) +} + +// AddPremiumInterface プレミアムプランでのインターフェース追加 +func (api *VPCRouterAPI) AddPremiumInterface(routerID int64, switchID int64, ipaddresses []string, maskLen int, virtualIP string) (*sacloud.VPCRouter, error) { + return api.addInterface(routerID, switchID, &sacloud.VPCRouterInterface{ + IPAddress: ipaddresses, + NetworkMaskLen: maskLen, + VirtualIPAddress: virtualIP, + }) +} + +func (api *VPCRouterAPI) addInterface(routerID int64, switchID int64, routerNIC *sacloud.VPCRouterInterface) (*sacloud.VPCRouter, error) { + router, err := api.Read(routerID) + if err != nil { + return nil, err + } + req := &sacloud.VPCRouter{Settings: &sacloud.VPCRouterSettings{}} + + if router.Settings == nil { + req.Settings = &sacloud.VPCRouterSettings{ + Router: &sacloud.VPCRouterSetting{ + Interfaces: []*sacloud.VPCRouterInterface{nil}, + }, + } + } else { + req.Settings.Router = router.Settings.Router + } + + index := len(req.Settings.Router.Interfaces) // add to last + return api.addInterfaceAt(routerID, switchID, routerNIC, index) +} + +// AddStandardInterfaceAt スタンダードプランでの指定位置へのインターフェース追加 +func (api *VPCRouterAPI) AddStandardInterfaceAt(routerID int64, switchID int64, ipaddress string, maskLen int, index int) (*sacloud.VPCRouter, error) { + return api.addInterfaceAt(routerID, switchID, &sacloud.VPCRouterInterface{ + IPAddress: []string{ipaddress}, + NetworkMaskLen: maskLen, + VirtualIPAddress: "", + }, index) +} + +// AddPremiumInterfaceAt プレミアムプランでの指定位置へのインターフェース追加 +func (api *VPCRouterAPI) AddPremiumInterfaceAt(routerID int64, switchID int64, ipaddresses []string, maskLen int, virtualIP string, index int) (*sacloud.VPCRouter, error) { + return api.addInterfaceAt(routerID, switchID, &sacloud.VPCRouterInterface{ + IPAddress: ipaddresses, + NetworkMaskLen: maskLen, + VirtualIPAddress: virtualIP, + }, index) +} + +func (api *VPCRouterAPI) addInterfaceAt(routerID int64, switchID int64, routerNIC *sacloud.VPCRouterInterface, index int) (*sacloud.VPCRouter, error) { + router, err := api.Read(routerID) + if err != nil { + return nil, err + } + + req := &sacloud.VPCRouter{Settings: &sacloud.VPCRouterSettings{}} + + if router.Settings == nil { + req.Settings = &sacloud.VPCRouterSettings{ + Router: &sacloud.VPCRouterSetting{ + Interfaces: []*sacloud.VPCRouterInterface{nil}, + }, + } + } else { + req.Settings.Router = router.Settings.Router + } + + //connect to switch + _, err = api.ConnectToSwitch(routerID, switchID, index) + if err != nil { + return nil, err + } + + for i := 0; i < index; i++ { + if len(req.Settings.Router.Interfaces) < index { + req.Settings.Router.Interfaces = append(req.Settings.Router.Interfaces, nil) + } + } + + if len(req.Settings.Router.Interfaces) < index+1 { + req.Settings.Router.Interfaces = append(req.Settings.Router.Interfaces, routerNIC) + } else { + req.Settings.Router.Interfaces[index] = routerNIC + } + + res, err := api.UpdateSetting(routerID, req) + if err != nil { + return nil, err + } + + return res, nil + +} + +// DeleteInterfaceAt 指定位置のインターフェース削除 +func (api *VPCRouterAPI) DeleteInterfaceAt(routerID int64, index int) (*sacloud.VPCRouter, error) { + router, err := api.Read(routerID) + if err != nil { + return nil, err + } + + req := &sacloud.VPCRouter{Settings: &sacloud.VPCRouterSettings{}} + + if router.Settings == nil { + req.Settings = &sacloud.VPCRouterSettings{ + // Router + Router: &sacloud.VPCRouterSetting{ + // Interfaces + Interfaces: []*sacloud.VPCRouterInterface{nil}, + }, + } + } else { + req.Settings.Router = router.Settings.Router + } + + //disconnect to switch + _, err = api.DisconnectFromSwitch(routerID, index) + if err != nil { + return nil, err + } + + if index < len(req.Settings.Router.Interfaces) { + req.Settings.Router.Interfaces[index] = nil + } + + res, err := api.UpdateSetting(routerID, req) + if err != nil { + return nil, err + } + + return res, nil + +} + +// MonitorBy 指定位置のインターフェースのアクティビティーモニター取得 +func (api *VPCRouterAPI) MonitorBy(id int64, nicIndex int, body *sacloud.ResourceMonitorRequest) (*sacloud.MonitorValues, error) { + return api.baseAPI.applianceMonitorBy(id, "interface", nicIndex, body) +} + +// Status ログなどのステータス情報 取得 +func (api *VPCRouterAPI) Status(id int64) (*sacloud.VPCRouterStatus, error) { + var ( + method = "GET" + uri = fmt.Sprintf("%s/%d/status", api.getResourceURL(), id) + res = &vpcRouterStatusResponse{} + ) + err := api.baseAPI.request(method, uri, nil, res) + if err != nil { + return nil, err + } + return res.VPCRouterStatus, nil +} + +// SiteToSiteConnectionDetails サイト間VPN接続情報を取得 +func (api *VPCRouterAPI) SiteToSiteConnectionDetails(id int64) (*sacloud.SiteToSiteConnectionInfo, error) { + var ( + method = "GET" + uri = fmt.Sprintf("%s/%d/vpcrouter/sitetosite/connectiondetails", api.getResourceURL(), id) + res = &vpcRouterS2sConnInfoResponse{} + ) + err := api.baseAPI.request(method, uri, nil, res) + if err != nil { + return nil, err + } + return res.SiteToSiteConnectionInfo, nil +} diff --git a/vendor/github.com/sacloud/libsacloud/api/vpc_router_gen.go b/vendor/github.com/sacloud/libsacloud/api/vpc_router_gen.go new file mode 100644 index 00000000..a913e189 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/vpc_router_gen.go @@ -0,0 +1,238 @@ +package api + +/************************************************ + generated by IDE. for [VPCRouterAPI] +************************************************/ + +import ( + "github.com/sacloud/libsacloud/sacloud" +) + +/************************************************ + To support fluent interface for Find() +************************************************/ + +// Reset 検索条件のリセット +func (api *VPCRouterAPI) Reset() *VPCRouterAPI { + api.reset() + return api +} + +// Offset オフセット +func (api *VPCRouterAPI) Offset(offset int) *VPCRouterAPI { + api.offset(offset) + return api +} + +// Limit リミット +func (api *VPCRouterAPI) Limit(limit int) *VPCRouterAPI { + api.limit(limit) + return api +} + +// Include 取得する項目 +func (api *VPCRouterAPI) Include(key string) *VPCRouterAPI { + api.include(key) + return api +} + +// Exclude 除外する項目 +func (api *VPCRouterAPI) Exclude(key string) *VPCRouterAPI { + api.exclude(key) + return api +} + +// FilterBy 指定キーでのフィルター +func (api *VPCRouterAPI) FilterBy(key string, value interface{}) *VPCRouterAPI { + api.filterBy(key, value, false) + return api +} + +// FilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *VPCRouterAPI) FilterMultiBy(key string, value interface{}) *VPCRouterAPI { + api.filterBy(key, value, true) + return api +} + +// WithNameLike 名称条件 +func (api *VPCRouterAPI) WithNameLike(name string) *VPCRouterAPI { + return api.FilterBy("Name", name) +} + +// WithTag タグ条件 +func (api *VPCRouterAPI) WithTag(tag string) *VPCRouterAPI { + return api.FilterBy("Tags.Name", tag) +} + +// WithTags タグ(複数)条件 +func (api *VPCRouterAPI) WithTags(tags []string) *VPCRouterAPI { + return api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *VPCRouterAPI) WithSizeGib(size int) *VPCRouterAPI { +// api.FilterBy("SizeMB", size*1024) +// return api +// } + +// func (api *VPCRouterAPI) WithSharedScope() *VPCRouterAPI { +// api.FilterBy("Scope", "shared") +// return api +// } + +// func (api *VPCRouterAPI) WithUserScope() *VPCRouterAPI { +// api.FilterBy("Scope", "user") +// return api +// } + +// SortBy 指定キーでのソート +func (api *VPCRouterAPI) SortBy(key string, reverse bool) *VPCRouterAPI { + api.sortBy(key, reverse) + return api +} + +// SortByName 名称でのソート +func (api *VPCRouterAPI) SortByName(reverse bool) *VPCRouterAPI { + api.sortByName(reverse) + return api +} + +// func (api *VPCRouterAPI) SortBySize(reverse bool) *VPCRouterAPI { +// api.sortBy("SizeMB", reverse) +// return api +// } + +/************************************************ + To support Setxxx interface for Find() +************************************************/ + +// SetEmpty 検索条件のリセット +func (api *VPCRouterAPI) SetEmpty() { + api.reset() +} + +// SetOffset オフセット +func (api *VPCRouterAPI) SetOffset(offset int) { + api.offset(offset) +} + +// SetLimit リミット +func (api *VPCRouterAPI) SetLimit(limit int) { + api.limit(limit) +} + +// SetInclude 取得する項目 +func (api *VPCRouterAPI) SetInclude(key string) { + api.include(key) +} + +// SetExclude 除外する項目 +func (api *VPCRouterAPI) SetExclude(key string) { + api.exclude(key) +} + +// SetFilterBy 指定キーでのフィルター +func (api *VPCRouterAPI) SetFilterBy(key string, value interface{}) { + api.filterBy(key, value, false) +} + +// SetFilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *VPCRouterAPI) SetFilterMultiBy(key string, value interface{}) { + api.filterBy(key, value, true) +} + +// SetNameLike 名称条件 +func (api *VPCRouterAPI) SetNameLike(name string) { + api.FilterBy("Name", name) +} + +// SetTag タグ条件 +func (api *VPCRouterAPI) SetTag(tag string) { + api.FilterBy("Tags.Name", tag) +} + +// SetTags タグ(複数)条件 +func (api *VPCRouterAPI) SetTags(tags []string) { + api.FilterBy("Tags.Name", []interface{}{tags}) +} + +// func (api *VPCRouterAPI) SetSizeGib(size int) { +// api.FilterBy("SizeMB", size*1024) +// } + +// func (api *VPCRouterAPI) SetSharedScope() { +// api.FilterBy("Scope", "shared") +// } + +// func (api *VPCRouterAPI) SetUserScope() { +// api.FilterBy("Scope", "user") +// } + +// SetSortBy 指定キーでのソート +func (api *VPCRouterAPI) SetSortBy(key string, reverse bool) { + api.sortBy(key, reverse) +} + +// SetSortByName 名称でのソート +func (api *VPCRouterAPI) SetSortByName(reverse bool) { + api.sortByName(reverse) +} + +// func (api *VPCRouterAPI) SetSortBySize(reverse bool) { +// api.sortBy("SizeMB", reverse) +// } + +/************************************************ + To support CRUD(Create/Read/Update/Delete) +************************************************/ + +// func (api *VPCRouterAPI) New() *sacloud.VPCRouter { +// return &sacloud.VPCRouter{} +// } + +// func (api *VPCRouterAPI) Create(value *sacloud.VPCRouter) (*sacloud.VPCRouter, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.create(api.createRequest(value), res) +// }) +// } + +// func (api *VPCRouterAPI) Read(id string) (*sacloud.VPCRouter, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.read(id, nil, res) +// }) +// } + +// func (api *VPCRouterAPI) Update(id string, value *sacloud.VPCRouter) (*sacloud.VPCRouter, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.update(id, api.createRequest(value), res) +// }) +// } + +// func (api *VPCRouterAPI) Delete(id string) (*sacloud.VPCRouter, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.delete(id, nil, res) +// }) +// } + +/************************************************ + Inner functions +************************************************/ + +func (api *VPCRouterAPI) setStateValue(setFunc func(*sacloud.Request)) *VPCRouterAPI { + api.baseAPI.setStateValue(setFunc) + return api +} + +//func (api *VPCRouterAPI) request(f func(*sacloud.Response) error) (*sacloud.VPCRouter, error) { +// res := &sacloud.Response{} +// err := f(res) +// if err != nil { +// return nil, err +// } +// return res.VPCRouter, nil +//} +// +//func (api *VPCRouterAPI) createRequest(value *sacloud.VPCRouter) *sacloud.Request { +// req := &sacloud.Request{} +// req.VPCRouter = value +// return req +//} diff --git a/vendor/github.com/sacloud/libsacloud/api/webaccel.go b/vendor/github.com/sacloud/libsacloud/api/webaccel.go new file mode 100644 index 00000000..e3b924b2 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/webaccel.go @@ -0,0 +1,114 @@ +package api + +import ( + "encoding/json" + "fmt" + "github.com/sacloud/libsacloud/sacloud" + "strings" +) + +// WebAccelAPI ウェブアクセラレータAPI +type WebAccelAPI struct { + *baseAPI +} + +// NewWebAccelAPI ウェブアクセラレータAPI +func NewWebAccelAPI(client *Client) *WebAccelAPI { + return &WebAccelAPI{ + &baseAPI{ + client: client, + apiRootSuffix: sakuraWebAccelAPIRootSuffix, + FuncGetResourceURL: func() string { + return "" + }, + }, + } +} + +// WebAccelDeleteCacheResponse ウェブアクセラレータ キャッシュ削除レスポンス +type WebAccelDeleteCacheResponse struct { + *sacloud.ResultFlagValue + Results []*sacloud.DeleteCacheResult +} + +// Read サイト情報取得 +func (api *WebAccelAPI) Read(id string) (*sacloud.WebAccelSite, error) { + + uri := fmt.Sprintf("%s/site/%s", api.getResourceURL(), id) + + data, err := api.client.newRequest("GET", uri, nil) + if err != nil { + return nil, err + } + + var res struct { + Site sacloud.WebAccelSite + } + if err := json.Unmarshal(data, &res); err != nil { + return nil, err + } + return &res.Site, nil +} + +// ReadCertificate 証明書 参照 +func (api *WebAccelAPI) ReadCertificate(id string) (*sacloud.WebAccelCertResponseBody, error) { + uri := fmt.Sprintf("%s/site/%s/certificate", api.getResourceURL(), id) + + data, err := api.client.newRequest("GET", uri, nil) + if err != nil { + return nil, err + } + + var res sacloud.WebAccelCertResponse + if err := json.Unmarshal(data, &res); err != nil { + return nil, err + } + return res.Certificate, nil +} + +// UpdateCertificate 証明書 更新 +func (api *WebAccelAPI) UpdateCertificate(id string, request *sacloud.WebAccelCertRequest) (*sacloud.WebAccelCertResponse, error) { + uri := fmt.Sprintf("%s/site/%s/certificate", api.getResourceURL(), id) + + if request.CertificateChain != "" { + request.CertificateChain = strings.TrimRight(request.CertificateChain, "\n") + } + if request.Key != "" { + request.Key = strings.TrimRight(request.Key, "\n") + } + + data, err := api.client.newRequest("PUT", uri, map[string]interface{}{ + "Certificate": request, + }) + if err != nil { + return nil, err + } + + var res sacloud.WebAccelCertResponse + if err := json.Unmarshal(data, &res); err != nil { + return nil, err + } + return &res, nil +} + +// DeleteCache キャッシュ削除 +func (api *WebAccelAPI) DeleteCache(urls ...string) (*WebAccelDeleteCacheResponse, error) { + + type request struct { + // URL + URL []string + } + + uri := fmt.Sprintf("%s/deletecache", api.getResourceURL()) + + data, err := api.client.newRequest("POST", uri, &request{URL: urls}) + if err != nil { + return nil, err + } + + var res WebAccelDeleteCacheResponse + if err := json.Unmarshal(data, &res); err != nil { + return nil, err + } + return &res, nil +} diff --git a/vendor/github.com/sacloud/libsacloud/api/webaccel_search.go b/vendor/github.com/sacloud/libsacloud/api/webaccel_search.go new file mode 100644 index 00000000..fc8884b6 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/webaccel_search.go @@ -0,0 +1,85 @@ +package api + +import ( + "encoding/json" + "fmt" + "github.com/sacloud/libsacloud/sacloud" + "net/url" + "strings" +) + +// Reset 検索条件のリセット +func (api *WebAccelAPI) Reset() *WebAccelAPI { + api.SetEmpty() + return api +} + +// SetEmpty 検索条件のリセット +func (api *WebAccelAPI) SetEmpty() { + api.reset() +} + +// FilterBy 指定キーでのフィルター +func (api *WebAccelAPI) FilterBy(key string, value interface{}) *WebAccelAPI { + api.filterBy(key, value, false) + return api +} + +// WithNameLike 名称条件 +func (api *WebAccelAPI) WithNameLike(name string) *WebAccelAPI { + return api.FilterBy("Name", name) +} + +// SetFilterBy 指定キーでのフィルター +func (api *WebAccelAPI) SetFilterBy(key string, value interface{}) { + api.filterBy(key, value, false) +} + +// SetNameLike 名称条件 +func (api *WebAccelAPI) SetNameLike(name string) { + api.FilterBy("Name", name) +} + +// Find サイト一覧取得 +func (api *WebAccelAPI) Find() (*sacloud.SearchResponse, error) { + + uri := fmt.Sprintf("%s/site", api.getResourceURL()) + + data, err := api.client.newRequest("GET", uri, nil) + if err != nil { + return nil, err + } + + var res sacloud.SearchResponse + if err := json.Unmarshal(data, &res); err != nil { + return nil, err + } + + // handle filter(API側がFilterに対応していないためここでフィルタリング) + for key, filter := range api.getSearchState().Filter { + if key != "Name" { + continue + } + strNames, ok := filter.(string) + if !ok { + continue + } + + names := strings.Split(strNames, " ") + filtered := []sacloud.WebAccelSite{} + for _, site := range res.WebAccelSites { + for _, name := range names { + + u, _ := url.Parse(name) + + if strings.Contains(site.Name, u.Path) { + filtered = append(filtered, site) + break + } + } + } + res.WebAccelSites = filtered + } + + return &res, nil +} diff --git a/vendor/github.com/sacloud/libsacloud/api/zone.go b/vendor/github.com/sacloud/libsacloud/api/zone.go new file mode 100644 index 00000000..214de1e0 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/zone.go @@ -0,0 +1,19 @@ +package api + +// ZoneAPI ゾーンAPI +type ZoneAPI struct { + *baseAPI +} + +// NewZoneAPI ゾーンAPI作成 +func NewZoneAPI(client *Client) *ZoneAPI { + return &ZoneAPI{ + &baseAPI{ + client: client, + // FuncGetResourceURL + FuncGetResourceURL: func() string { + return "zone" + }, + }, + } +} diff --git a/vendor/github.com/sacloud/libsacloud/api/zone_gen.go b/vendor/github.com/sacloud/libsacloud/api/zone_gen.go new file mode 100644 index 00000000..dfaabeac --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/api/zone_gen.go @@ -0,0 +1,239 @@ +package api + +/************************************************ + generated by IDE. for [ZoneAPI] +************************************************/ + +import ( + "github.com/sacloud/libsacloud/sacloud" +) + +/************************************************ + To support fluent interface for Find() +************************************************/ + +// Reset 検索条件のリセット +func (api *ZoneAPI) Reset() *ZoneAPI { + api.reset() + return api +} + +// Offset オフセット +func (api *ZoneAPI) Offset(offset int) *ZoneAPI { + api.offset(offset) + return api +} + +// Limit リミット +func (api *ZoneAPI) Limit(limit int) *ZoneAPI { + api.limit(limit) + return api +} + +// Include 取得する項目 +func (api *ZoneAPI) Include(key string) *ZoneAPI { + api.include(key) + return api +} + +// Exclude 除外する項目 +func (api *ZoneAPI) Exclude(key string) *ZoneAPI { + api.exclude(key) + return api +} + +// FilterBy 指定キーでのフィルター +func (api *ZoneAPI) FilterBy(key string, value interface{}) *ZoneAPI { + api.filterBy(key, value, false) + return api +} + +// FilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *ZoneAPI) FilterMultiBy(key string, value interface{}) *ZoneAPI { + api.filterBy(key, value, true) + return api +} + +// WithNameLike 名称条件 +func (api *ZoneAPI) WithNameLike(name string) *ZoneAPI { + return api.FilterBy("Name", name) +} + +//// WithTag タグ条件 +//func (api *ZoneAPI) WithTag(tag string) *ZoneAPI { +// return api.FilterBy("Tags.Name", tag) +//} +// +//// WithTags タグ(複数)条件 +//func (api *ZoneAPI) WithTags(tags []string) *ZoneAPI { +// return api.FilterBy("Tags.Name", []interface{}{tags}) +//} + +// func (api *ZoneAPI) WithSizeGib(size int) *ZoneAPI { +// api.FilterBy("SizeMB", size*1024) +// return api +// } + +// func (api *ZoneAPI) WithSharedScope() *ZoneAPI { +// api.FilterBy("Scope", "shared") +// return api +// } + +// func (api *ZoneAPI) WithUserScope() *ZoneAPI { +// api.FilterBy("Scope", "user") +// return api +// } + +// SortBy 指定キーでのソート +func (api *ZoneAPI) SortBy(key string, reverse bool) *ZoneAPI { + api.sortBy(key, reverse) + return api +} + +// SortByName 名称でのソート +func (api *ZoneAPI) SortByName(reverse bool) *ZoneAPI { + api.sortByName(reverse) + return api +} + +// func (api *ZoneAPI) SortBySize(reverse bool) *ZoneAPI { +// api.sortBy("SizeMB", reverse) +// return api +// } + +/************************************************ + To support Setxxx interface for Find() +************************************************/ + +// SetEmpty 検索条件のリセット +func (api *ZoneAPI) SetEmpty() { + api.reset() +} + +// SetOffset オフセット +func (api *ZoneAPI) SetOffset(offset int) { + api.offset(offset) +} + +// SetLimit リミット +func (api *ZoneAPI) SetLimit(limit int) { + api.limit(limit) +} + +// SetInclude 取得する項目 +func (api *ZoneAPI) SetInclude(key string) { + api.include(key) +} + +// SetExclude 除外する項目 +func (api *ZoneAPI) SetExclude(key string) { + api.exclude(key) +} + +// SetFilterBy 指定キーでのフィルター +func (api *ZoneAPI) SetFilterBy(key string, value interface{}) { + api.filterBy(key, value, false) +} + +// SetFilterMultiBy 任意項目でのフィルタ(完全一致 OR条件) +func (api *ZoneAPI) SetFilterMultiBy(key string, value interface{}) { + api.filterBy(key, value, true) +} + +// SetNameLike 名称条件 +func (api *ZoneAPI) SetNameLike(name string) { + api.FilterBy("Name", name) +} + +//// SetTag タグ条件 +//func (api *ZoneAPI) SetTag(tag string) { +// api.FilterBy("Tags.Name", tag) +//} +// +//// SetTags タグ(複数)条件 +//func (api *ZoneAPI) SetTags(tags []string) { +// api.FilterBy("Tags.Name", []interface{}{tags}) +//} + +// func (api *ZoneAPI) SetSizeGib(size int) { +// api.FilterBy("SizeMB", size*1024) +// } + +// func (api *ZoneAPI) SetSharedScope() { +// api.FilterBy("Scope", "shared") +// } + +// func (api *ZoneAPI) SetUserScope() { +// api.FilterBy("Scope", "user") +// } + +// SetSortBy 指定キーでのソート +func (api *ZoneAPI) SetSortBy(key string, reverse bool) { + api.sortBy(key, reverse) +} + +// SetSortByName 名称でのソート +func (api *ZoneAPI) SetSortByName(reverse bool) { + api.sortByName(reverse) +} + +// func (api *ZoneAPI) SetSortBySize(reverse bool) { +// api.sortBy("SizeMB", reverse) +// } + +/************************************************ + To support CRUD(Create/Read/Update/Delete) +************************************************/ + +// func (api *ZoneAPI) New() *sacloud.Zone { +// return &sacloud.Zone{} +// } + +// func (api *ZoneAPI) Create(value *sacloud.Zone) (*sacloud.Zone, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.create(api.createRequest(value), res) +// }) +// } + +// Read 読み取り +func (api *ZoneAPI) Read(id int64) (*sacloud.Zone, error) { + return api.request(func(res *sacloud.Response) error { + return api.read(id, nil, res) + }) +} + +// func (api *ZoneAPI) Update(id string, value *sacloud.Zone) (*sacloud.Zone, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.update(id, api.createRequest(value), res) +// }) +// } + +// func (api *ZoneAPI) Delete(id string) (*sacloud.Zone, error) { +// return api.request(func(res *sacloud.Response) error { +// return api.delete(id, nil, res) +// }) +// } + +/************************************************ + Inner functions +************************************************/ + +func (api *ZoneAPI) setStateValue(setFunc func(*sacloud.Request)) *ZoneAPI { + api.baseAPI.setStateValue(setFunc) + return api +} + +func (api *ZoneAPI) request(f func(*sacloud.Response) error) (*sacloud.Zone, error) { + res := &sacloud.Response{} + err := f(res) + if err != nil { + return nil, err + } + return res.Zone, nil +} + +func (api *ZoneAPI) createRequest(value *sacloud.Zone) *sacloud.Request { + req := &sacloud.Request{} + req.Zone = value + return req +} diff --git a/vendor/github.com/sacloud/libsacloud/libsacloud.go b/vendor/github.com/sacloud/libsacloud/libsacloud.go new file mode 100644 index 00000000..1981b502 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/libsacloud.go @@ -0,0 +1,5 @@ +// Package libsacloud is the SAKURA CLOUD API v1.1 Client for Go. +package libsacloud + +// Version バージョン +const Version = "1.0.0-rc5" diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/account.go b/vendor/github.com/sacloud/libsacloud/sacloud/account.go new file mode 100644 index 00000000..8ece8f44 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/account.go @@ -0,0 +1,9 @@ +package sacloud + +// Account さくらのクラウド アカウント +type Account struct { + *Resource + propName // 名称 + Class string `json:",omitempty"` // リソースクラス + Code string `json:",omitempty"` // アカウントコード +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/appliance.go b/vendor/github.com/sacloud/libsacloud/sacloud/appliance.go new file mode 100644 index 00000000..89243926 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/appliance.go @@ -0,0 +1,57 @@ +package sacloud + +// Appliance アプライアンス基底クラス +type Appliance struct { + *Resource // ID + propAvailability // 有功状態 + propName // 名称 + propDescription // 説明 + propPlanID // プラン + propServiceClass // サービスクラス + propInstance // インスタンス + propSwitch // スイッチ + propInterfaces // インターフェース配列 + propIcon // アイコン + propTags // タグ + propCreatedAt // 作成日時 + Class string `json:",omitempty"` // リソースクラス + SettingHash string `json:",omitempty"` // 設定ハッシュ値 + +} + +//HACK Appliance:Zone.IDがRoute/LoadBalancerの場合でデータ型が異なるため +//それぞれのstruct定義でZoneだけ上書きした構造体を定義して使う + +// ApplianceRemarkBase アプライアンス Remark 基底クラス +type ApplianceRemarkBase struct { + Servers []interface{} // 配下のサーバー群 + + Switch *ApplianceRemarkSwitch `json:",omitempty"` // 接続先スイッチ + VRRP *ApplianceRemarkVRRP `json:",omitempty"` // VRRP + Network *ApplianceRemarkNetwork `json:",omitempty"` // ネットワーク + + //Zone *Resource `json:",omitempty"` + //Plan *Resource +} + +//type ApplianceServer struct { +// IPAddress string `json:",omitempty"` +//} + +// ApplianceRemarkSwitch スイッチ +type ApplianceRemarkSwitch struct { + ID string `json:",omitempty"` // リソースID + propScope // スコープ +} + +// ApplianceRemarkVRRP VRRP +type ApplianceRemarkVRRP struct { + VRID int // VRID +} + +// ApplianceRemarkNetwork ネットワーク +type ApplianceRemarkNetwork struct { + NetworkMaskLen int `json:",omitempty"` // ネットワークマスク長 + DefaultRoute string // デフォルトルート + +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/archive.go b/vendor/github.com/sacloud/libsacloud/sacloud/archive.go new file mode 100644 index 00000000..65797004 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/archive.go @@ -0,0 +1,22 @@ +package sacloud + +// Archive アーカイブ +type Archive struct { + *Resource // ID + propAvailability // 有功状態 + propName // 名称 + propDescription // 説明 + propSizeMB // サイズ(MB単位) + propMigratedMB // コピー済みデータサイズ(MB単位) + propScope // スコープ + propCopySource // コピー元情報 + propServiceClass // サービスクラス + propPlanID // プランID + propJobStatus // マイグレーションジョブステータス + propOriginalArchiveID // オリジナルアーカイブID + propStorage // ストレージ + propBundleInfo // バンドル情報 + propTags // タグ + propIcon // アイコン + propCreatedAt // 作成日時 +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/auth_status.go b/vendor/github.com/sacloud/libsacloud/sacloud/auth_status.go new file mode 100644 index 00000000..d1a56269 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/auth_status.go @@ -0,0 +1,79 @@ +package sacloud + +// AuthStatus 現在の認証状態 +type AuthStatus struct { + Account *Account // アカウント + Member *Member // 会員情報 + AuthClass EAuthClass `json:",omitempty"` // 認証クラス + AuthMethod EAuthMethod `json:",omitempty"` // 認証方法 + ExternalPermission string `json:",omitempty"` // 他サービスへのアクセス権 + IsAPIKey bool `json:",omitempty"` // APIキーでのアクセスフラグ + OperationPenalty string `json:",omitempty"` // オペレーションペナルティ + Permission EPermission `json:",omitempty"` // 権限 + IsOk bool `json:"is_ok,omitempty"` // 結果 + + // RESTFilter [unknown type] `json:",omitempty"` + // User [unknown type] `json:",omitempty"` + +} + +// -------------------------------------------------------- + +// EAuthClass 認証種別 +type EAuthClass string + +var ( + // EAuthClassAccount アカウント認証 + EAuthClassAccount = EAuthClass("account") +) + +// -------------------------------------------------------- + +// EAuthMethod 認証方法 +type EAuthMethod string + +var ( + // EAuthMethodAPIKey APIキー認証 + EAuthMethodAPIKey = EAuthMethod("apikey") +) + +// -------------------------------------------------------- + +// EExternalPermission 他サービスへのアクセス権 +type EExternalPermission string + +var ( + // EExternalPermissionBill 請求情報 + EExternalPermissionBill = EExternalPermission("bill") + // EExternalPermissionCDN ウェブアクセラレータ + EExternalPermissionCDN = EExternalPermission("cdn") +) + +// -------------------------------------------------------- + +// EOperationPenalty ペナルティ +type EOperationPenalty string + +var ( + // EOperationPenaltyNone ペナルティなし + EOperationPenaltyNone = EOperationPenalty("none") +) + +// -------------------------------------------------------- + +// EPermission アクセスレベル +type EPermission string + +var ( + // EPermissionCreate 作成・削除権限 + EPermissionCreate = EPermission("create") + + // EPermissionArrange 設定変更権限 + EPermissionArrange = EPermission("arrange") + + // EPermissionPower 電源操作権限 + EPermissionPower = EPermission("power") + + // EPermissionView リソース閲覧権限 + EPermissionView = EPermission("view") +) diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/auto_backup.go b/vendor/github.com/sacloud/libsacloud/sacloud/auto_backup.go new file mode 100644 index 00000000..d626fe82 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/auto_backup.go @@ -0,0 +1,88 @@ +package sacloud + +import ( + "encoding/json" + "fmt" +) + +// AutoBackup 自動バックアップ(CommonServiceItem) +type AutoBackup struct { + *Resource // ID + propName // 名称 + propDescription // 説明 + propServiceClass // サービスクラス + propIcon // アイコン + propTags // タグ + propCreatedAt // 作成日時 + propModifiedAt // 変更日時 + + Status *AutoBackupStatus `json:",omitempty"` // ステータス + Provider *AutoBackupProvider `json:",omitempty"` // プロバイダ + Settings *AutoBackupSettings `json:",omitempty"` // 設定 + +} + +// AutoBackupSettings 自動バックアップ設定 +type AutoBackupSettings struct { + AccountID json.Number `json:"AccountId,omitempty"` // アカウントID + DiskID string `json:"DiskId,omitempty"` // ディスクID + ZoneID int64 `json:"ZoneId,omitempty"` // ゾーンID + ZoneName string `json:",omitempty"` // ゾーン名称 + Autobackup *AutoBackupRecordSets `json:",omitempty"` // 自動バックアップ定義 + +} + +// AutoBackupStatus 自動バックアップステータス +type AutoBackupStatus struct { + AccountID json.Number `json:"AccountId,omitempty"` // アカウントID + DiskID string `json:"DiskId,omitempty"` // ディスクID + ZoneID int64 `json:"ZoneId,omitempty"` // ゾーンID + ZoneName string `json:",omitempty"` // ゾーン名称 +} + +// AutoBackupProvider 自動バックアッププロバイダ +type AutoBackupProvider struct { + Class string `json:",omitempty"` // クラス +} + +// CreateNewAutoBackup 自動バックアップ 作成(CommonServiceItem) +func CreateNewAutoBackup(backupName string, diskID int64) *AutoBackup { + return &AutoBackup{ + Resource: &Resource{}, + propName: propName{Name: backupName}, + Status: &AutoBackupStatus{ + DiskID: fmt.Sprintf("%d", diskID), + }, + Provider: &AutoBackupProvider{ + Class: "autobackup", + }, + Settings: &AutoBackupSettings{ + Autobackup: &AutoBackupRecordSets{ + BackupSpanType: "weekdays", + }, + }, + } +} + +// AllowAutoBackupWeekdays 自動バックアップ実行曜日リスト +func AllowAutoBackupWeekdays() []string { + return []string{"mon", "tue", "wed", "thu", "fri", "sat", "sun"} +} + +// AutoBackupRecordSets 自動バックアップ定義 +type AutoBackupRecordSets struct { + BackupSpanType string // バックアップ間隔タイプ + BackupSpanWeekdays []string // バックアップ実施曜日 + MaximumNumberOfArchives int // 世代数 + +} + +// SetBackupSpanWeekdays バックアップ実行曜日設定 +func (a *AutoBackup) SetBackupSpanWeekdays(weekdays []string) { + a.Settings.Autobackup.BackupSpanWeekdays = weekdays +} + +// SetBackupMaximumNumberOfArchives 世代数設定 +func (a *AutoBackup) SetBackupMaximumNumberOfArchives(max int) { + a.Settings.Autobackup.MaximumNumberOfArchives = max +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/bill.go b/vendor/github.com/sacloud/libsacloud/sacloud/bill.go new file mode 100644 index 00000000..45143acf --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/bill.go @@ -0,0 +1,32 @@ +package sacloud + +import "time" + +// Bill 請求情報 +type Bill struct { + Amount int64 `json:",omitempty"` // 金額 + BillID int64 `json:",omitempty"` // 請求ID + Date *time.Time `json:",omitempty"` // 請求日 + MemberID string `json:",omitempty"` // 会員ID + Paid bool `json:",omitempty"` // 支払済フラグ + PayLimit *time.Time `json:",omitempty"` // 支払い期限 + PaymentClassID int `json:",omitempty"` // 支払いクラスID + +} + +// BillDetail 支払い明細情報 +type BillDetail struct { + Amount int64 `json:",omitempty"` // 金額 + ContractID int64 `json:",omitempty"` // 契約ID + Description string `json:",omitempty"` // 説明 + Index int `json:",omitempty"` // インデックス + ServiceClassID int64 `json:",omitempty"` // サービスクラスID + Usage int64 `json:",omitempty"` // 秒数 + Zone string `json:",omitempty"` // ゾーン + ContractEndAt *time.Time `json:",omitempty"` // 契約終了日時 +} + +// IsContractEnded 支払済か判定 +func (d *BillDetail) IsContractEnded(t time.Time) bool { + return d.ContractEndAt != nil && d.ContractEndAt.Before(t) +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/bridge.go b/vendor/github.com/sacloud/libsacloud/sacloud/bridge.go new file mode 100644 index 00000000..b9a22d8a --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/bridge.go @@ -0,0 +1,30 @@ +package sacloud + +import ( + "encoding/json" +) + +// Bridge ブリッジ +type Bridge struct { + *Resource // ID + propName // 名称 + propDescription // 説明 + propServiceClass // サービスクラス + propRegion // リージョン + propCreatedAt // 作成日時 + + Info *struct { // インフォ + Switches []*struct { // 接続スイッチリスト + *Switch // スイッチ + ID json.Number `json:",omitempty"` // (HACK) ID + } + } + + SwitchInZone *struct { // ゾーン内接続スイッチ + *Resource // ID + propScope // スコープ + Name string `json:",omitempty"` // 名称 + ServerCount int `json:",omitempty"` // 接続サーバー数 + ApplianceCount int `json:",omitempty"` // 接続アプライアンス数 + } +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/cdrom.go b/vendor/github.com/sacloud/libsacloud/sacloud/cdrom.go new file mode 100644 index 00000000..dc80768e --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/cdrom.go @@ -0,0 +1,17 @@ +package sacloud + +// CDROM ISOイメージ(CDROM) +type CDROM struct { + *Resource // ID + propName // 名称 + propDescription // 説明 + propAvailability // 有功状態 + propSizeMB // サイズ(MB単位) + propScope // スコープ + propServiceClass // サービスクラス + propStorageClass // ストレージクラス + propStorage // ストレージ + propIcon // アイコン + propTags // タグ + propCreatedAt // 作成日時 +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/common_types.go b/vendor/github.com/sacloud/libsacloud/sacloud/common_types.go new file mode 100644 index 00000000..35e88afe --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/common_types.go @@ -0,0 +1,326 @@ +package sacloud + +import ( + "fmt" + "strconv" + "time" +) + +// Resource IDを持つ、さくらのクラウド上のリソース +type Resource struct { + ID int64 // ID +} + +// ResourceIDHolder ID保持インターフェース +type ResourceIDHolder interface { + SetID(int64) + GetID() int64 +} + +// EmptyID 空ID +const EmptyID int64 = 0 + +// NewResource 新規リソース作成 +func NewResource(id int64) *Resource { + return &Resource{ID: id} +} + +// NewResourceByStringID ID文字列からリソース作成 +func NewResourceByStringID(id string) *Resource { + intID, err := strconv.ParseInt(id, 10, 64) + if err != nil { + panic(err) + } + return &Resource{ID: intID} +} + +// SetID ID 設定 +func (n *Resource) SetID(id int64) { + n.ID = id +} + +// GetID ID 取得 +func (n *Resource) GetID() int64 { + if n == nil { + return -1 + } + return n.ID +} + +// GetStrID 文字列でID取得 +func (n *Resource) GetStrID() string { + if n == nil { + return "" + } + return fmt.Sprintf("%d", n.ID) +} + +// EAvailability 有効状態 +type EAvailability string + +var ( + // EAAvailable 有効 + EAAvailable = EAvailability("available") + // EAUploading アップロード中 + EAUploading = EAvailability("uploading") + // EAFailed 失敗 + EAFailed = EAvailability("failed") + // EAMigrating マイグレーション中 + EAMigrating = EAvailability("migrating") +) + +// IsAvailable 有効状態が"有効"か判定 +func (e EAvailability) IsAvailable() bool { + return e == EAAvailable +} + +// IsUploading 有効状態が"アップロード中"か判定 +func (e EAvailability) IsUploading() bool { + return e == EAUploading +} + +// IsFailed 有効状態が"失敗"か判定 +func (e EAvailability) IsFailed() bool { + return e == EAFailed +} + +// IsMigrating 有効状態が"マイグレーション中"か判定 +func (e EAvailability) IsMigrating() bool { + return e == EAMigrating +} + +// EInterfaceDriver インターフェースドライバ +type EInterfaceDriver string + +var ( + // InterfaceDriverVirtIO virtio + InterfaceDriverVirtIO = EInterfaceDriver("virtio") + // InterfaceDriverE1000 e1000 + InterfaceDriverE1000 = EInterfaceDriver("e1000") +) + +// EServerInstanceStatus サーバーインスタンスステータス +type EServerInstanceStatus struct { + Status string `json:",omitempty"` // 現在のステータス + BeforeStatus string `json:",omitempty"` // 前のステータス +} + +// IsUp インスタンスが起動しているか判定 +func (e *EServerInstanceStatus) IsUp() bool { + return e.Status == "up" +} + +// IsDown インスタンスがダウンしているか確認 +func (e *EServerInstanceStatus) IsDown() bool { + return e.Status == "down" +} + +// GetStatus ステータス 取得 +func (e *EServerInstanceStatus) GetStatus() string { + return e.Status +} + +// GetBeforeStatus 以前のステータス 取得 +func (e *EServerInstanceStatus) GetBeforeStatus() string { + return e.BeforeStatus +} + +// EScope スコープ +type EScope string + +var ( + // ESCopeShared sharedスコープ + ESCopeShared = EScope("shared") + // ESCopeUser userスコープ + ESCopeUser = EScope("user") +) + +// EDiskConnection ディスク接続方法 +type EDiskConnection string + +// SakuraCloudResources さくらのクラウド上のリソース種別一覧 +type SakuraCloudResources struct { + Server *Server `json:",omitempty"` // サーバー + Disk *Disk `json:",omitempty"` // ディスク + Note *Note `json:",omitempty"` // スタートアップスクリプト + Archive *Archive `json:",omitempty"` // アーカイブ + PacketFilter *PacketFilter `json:",omitempty"` // パケットフィルタ + PrivateHost *PrivateHost `json:",omitempty"` // 専有ホスト + Bridge *Bridge `json:",omitempty"` // ブリッジ + Icon *Icon `json:",omitempty"` // アイコン + Image *Image `json:",omitempty"` // 画像 + Interface *Interface `json:",omitempty"` // インターフェース + Internet *Internet `json:",omitempty"` // ルーター + IPAddress *IPAddress `json:",omitempty"` // IPv4アドレス + IPv6Addr *IPv6Addr `json:",omitempty"` // IPv6アドレス + IPv6Net *IPv6Net `json:",omitempty"` // IPv6ネットワーク + License *License `json:",omitempty"` // ライセンス + Switch *Switch `json:",omitempty"` // スイッチ + CDROM *CDROM `json:",omitempty"` // ISOイメージ + SSHKey *SSHKey `json:",omitempty"` // 公開鍵 + Subnet *Subnet `json:",omitempty"` // IPv4ネットワーク + DiskPlan *ProductDisk `json:",omitempty"` // ディスクプラン + InternetPlan *ProductInternet `json:",omitempty"` // ルータープラン + LicenseInfo *ProductLicense `json:",omitempty"` // ライセンス情報 + ServerPlan *ProductServer `json:",omitempty"` // サーバープラン + PrivateHostPlan *ProductPrivateHost `json:",omitempty"` // 専有ホストプラン + Region *Region `json:",omitempty"` // リージョン + Zone *Zone `json:",omitempty"` // ゾーン + FTPServer *FTPServer `json:",omitempty"` // FTPサーバー情報 + WebAccelSite *WebAccelSite `json:"Site,omitempty"` // ウェブアクセラレータ サイト + //REMARK: CommonServiceItemとApplianceはapiパッケージにて別途定義 +} + +// SakuraCloudResourceList さくらのクラウド上のリソース種別一覧(複数形) +type SakuraCloudResourceList struct { + Servers []Server `json:",omitempty"` // サーバー + Disks []Disk `json:",omitempty"` // ディスク + Notes []Note `json:",omitempty"` // スタートアップスクリプト + Archives []Archive `json:",omitempty"` // アーカイブ + PacketFilters []PacketFilter `json:",omitempty"` // パケットフィルタ + PrivateHosts []PrivateHost `json:",omitempty"` // 専有ホスト + Bridges []Bridge `json:",omitempty"` // ブリッジ + Icons []Icon `json:",omitempty"` // アイコン + Interfaces []Interface `json:",omitempty"` // インターフェース + Internet []Internet `json:",omitempty"` // ルーター + IPAddress []IPAddress `json:",omitempty"` // IPv4アドレス + IPv6Addrs []IPv6Addr `json:",omitempty"` // IPv6アドレス + IPv6Nets []IPv6Net `json:",omitempty"` // IPv6ネットワーク + Licenses []License `json:",omitempty"` // ライセンス + Switches []Switch `json:",omitempty"` // スイッチ + CDROMs []CDROM `json:",omitempty"` // ISOイメージ + SSHKeys []SSHKey `json:",omitempty"` // 公開鍵 + Subnets []Subnet `json:",omitempty"` // IPv4ネットワーク + DiskPlans []ProductDisk `json:",omitempty"` // ディスクプラン + InternetPlans []ProductInternet `json:",omitempty"` // ルータープラン + LicenseInfo []ProductLicense `json:",omitempty"` // ライセンス情報 + ServerPlans []ProductServer `json:",omitempty"` // サーバープラン + PrivateHostPlans []ProductPrivateHost `json:",omitempty"` // 専有ホストプラン + Regions []Region `json:",omitempty"` // リージョン + Zones []Zone `json:",omitempty"` // ゾーン + ServiceClasses []PublicPrice `json:",omitempty"` // サービスクラス(価格情報) + WebAccelSites []WebAccelSite `json:"Sites,omitempty"` // ウェブアクセラレータ サイト + + //REMARK:CommonServiceItemとApplianceはapiパッケージにて別途定義 +} + +// Request APIリクエスト型 +type Request struct { + SakuraCloudResources // さくらのクラウドリソース + From int `json:",omitempty"` // ページング FROM + Count int `json:",omitempty"` // 取得件数 + Sort []string `json:",omitempty"` // ソート + Filter map[string]interface{} `json:",omitempty"` // フィルタ + Exclude []string `json:",omitempty"` // 除外する項目 + Include []string `json:",omitempty"` // 取得する項目 + +} + +// AddFilter フィルタの追加 +func (r *Request) AddFilter(key string, value interface{}) *Request { + if r.Filter == nil { + r.Filter = map[string]interface{}{} + } + r.Filter[key] = value + return r +} + +// AddSort ソートの追加 +func (r *Request) AddSort(keyName string) *Request { + if r.Sort == nil { + r.Sort = []string{} + } + r.Sort = append(r.Sort, keyName) + return r +} + +// AddExclude 除外対象の追加 +func (r *Request) AddExclude(keyName string) *Request { + if r.Exclude == nil { + r.Exclude = []string{} + } + r.Exclude = append(r.Exclude, keyName) + return r +} + +// AddInclude 選択対象の追加 +func (r *Request) AddInclude(keyName string) *Request { + if r.Include == nil { + r.Include = []string{} + } + r.Include = append(r.Include, keyName) + return r +} + +// ResultFlagValue レスポンス値でのフラグ項目 +type ResultFlagValue struct { + IsOk bool `json:"is_ok,omitempty"` // is_ok項目 + Success bool `json:",omitempty"` // success項目 +} + +// SearchResponse 検索レスポンス +type SearchResponse struct { + Total int `json:",omitempty"` // トータル件数 + From int `json:",omitempty"` // ページング開始ページ + Count int `json:",omitempty"` // 件数 + ResponsedAt *time.Time `json:",omitempty"` // 応答日時 + *SakuraCloudResourceList // さくらのクラウドリソース(複数形) +} + +// Response レスポンス型 +type Response struct { + *ResultFlagValue // フラグ値 + *SakuraCloudResources // さくらのクラウドリソース(単数形) +} + +// ResultErrorValue レスポンスエラー型 +type ResultErrorValue struct { + IsFatal bool `json:"is_fatal,omitempty"` // IsFatal + Serial string `json:"serial,omitempty"` // Serial + Status string `json:"status,omitempty"` // Status + ErrorCode string `json:"error_code,omitempty"` // ErrorCode + ErrorMessage string `json:"error_msg,omitempty"` // ErrorMessage + +} + +// MigrationJobStatus マイグレーションジョブステータス +type MigrationJobStatus struct { + Status string `json:",omitempty"` // ステータス + + Delays *struct { // Delays + Start *struct { // 開始 + Max int `json:",omitempty"` // 最大 + Min int `json:",omitempty"` // 最小 + } `json:",omitempty"` + + Finish *struct { // 終了 + Max int `json:",omitempty"` // 最大 + Min int `json:",omitempty"` // 最小 + } `json:",omitempty"` + } +} + +var ( + // TagGroupA サーバをグループ化し起動ホストを分離します(グループA) + TagGroupA = "@group=a" + // TagGroupB サーバをグループ化し起動ホストを分離します(グループB) + TagGroupB = "@group=b" + // TagGroupC サーバをグループ化し起動ホストを分離します(グループC) + TagGroupC = "@group=b" + // TagGroupD サーバをグループ化し起動ホストを分離します(グループD) + TagGroupD = "@group=b" + + // TagAutoReboot サーバ停止時に自動起動します + TagAutoReboot = "@auto-reboot" + + // TagKeyboardUS リモートスクリーン画面でUSキーボード入力します + TagKeyboardUS = "@keyboard-us" + + // TagBootCDROM 優先ブートデバイスをCD-ROMに設定します + TagBootCDROM = "@boot-cdrom" + // TagBootNetwork 優先ブートデバイスをPXE bootに設定します + TagBootNetwork = "@boot-network" +) + +// DatetimeLayout さくらのクラウドAPIで利用される日付型のレイアウト(RFC3339) +var DatetimeLayout = "2006-01-02T15:04:05-07:00" diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/database.go b/vendor/github.com/sacloud/libsacloud/sacloud/database.go new file mode 100644 index 00000000..447f9cd9 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/database.go @@ -0,0 +1,435 @@ +package sacloud + +import ( + "encoding/json" + "strings" +) + +// Database データベース(appliance) +type Database struct { + *Appliance // アプライアンス共通属性 + + Remark *DatabaseRemark `json:",omitempty"` // リマーク + Settings *DatabaseSettings `json:",omitempty"` // データベース設定 +} + +// DatabaseRemark データベースリマーク +type DatabaseRemark struct { + *ApplianceRemarkBase + propPlanID // プランID + DBConf *DatabaseCommonRemarks // コンフィグ + Network *DatabaseRemarkNetwork // ネットワーク + SourceAppliance *Resource // クローン元DB + Zone struct { // ゾーン + ID json.Number `json:",omitempty"` // ゾーンID + } +} + +// DatabaseRemarkNetwork ネットワーク +type DatabaseRemarkNetwork struct { + NetworkMaskLen int `json:",omitempty"` // ネットワークマスク長 + DefaultRoute string `json:",omitempty"` // デフォルトルート +} + +// UnmarshalJSON JSONアンマーシャル(配列、オブジェクトが混在するためここで対応) +func (s *DatabaseRemarkNetwork) UnmarshalJSON(data []byte) error { + targetData := strings.Replace(strings.Replace(string(data), " ", "", -1), "\n", "", -1) + if targetData == `[]` { + return nil + } + + tmp := &struct { + // NetworkMaskLen + NetworkMaskLen int `json:",omitempty"` + // DefaultRoute + DefaultRoute string `json:",omitempty"` + }{} + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + s.NetworkMaskLen = tmp.NetworkMaskLen + s.DefaultRoute = tmp.DefaultRoute + return nil +} + +// DatabaseCommonRemarks リマークリスト +type DatabaseCommonRemarks struct { + Common *DatabaseCommonRemark // Common +} + +// DatabaseCommonRemark リマーク +type DatabaseCommonRemark struct { + DatabaseName string `json:",omitempty"` // 名称 + DatabaseRevision string `json:",omitempty"` // リビジョン + DatabaseTitle string `json:",omitempty"` // タイトル + DatabaseVersion string `json:",omitempty"` // バージョン + ReplicaPassword string `json:",omitempty"` // レプリケーションパスワード + ReplicaUser string `json:",omitempty"` // レプリケーションユーザー +} + +// DatabaseSettings データベース設定リスト +type DatabaseSettings struct { + DBConf *DatabaseSetting `json:",omitempty"` // コンフィグ +} + +// DatabaseSetting データベース設定 +type DatabaseSetting struct { + Backup *DatabaseBackupSetting `json:",omitempty"` // バックアップ設定 + Common *DatabaseCommonSetting `json:",oitempty"` // 共通設定 +} + +// DatabaseServer データベースサーバー情報 +type DatabaseServer struct { + IPAddress string `json:",omitempty"` // IPアドレス + Port string `json:",omitempty"` // ポート + Enabled string `json:",omitempty"` // 有効/無効 + Status string `json:",omitempty"` // ステータス + ActiveConn string `json:",omitempty"` // アクティブコネクション +} + +// DatabasePlan プラン +type DatabasePlan int + +var ( + // DatabasePlanMini ミニプラン(後方互換用) + DatabasePlanMini = DatabasePlan(10) + // DatabasePlan10G 10Gプラン + DatabasePlan10G = DatabasePlan(10) + // DatabasePlan30G 30Gプラン + DatabasePlan30G = DatabasePlan(30) + // DatabasePlan90G 90Gプラン + DatabasePlan90G = DatabasePlan(90) + // DatabasePlan240G 240Gプラン + DatabasePlan240G = DatabasePlan(240) + // DatabasePlan500G 500Gプラン + DatabasePlan500G = DatabasePlan(500) + // DatabasePlan1T 1Tプラン + DatabasePlan1T = DatabasePlan(1000) +) + +// AllowDatabasePlans 指定可能なデータベースプラン +func AllowDatabasePlans() []int { + return []int{ + int(DatabasePlan10G), + int(DatabasePlan30G), + int(DatabasePlan90G), + int(DatabasePlan240G), + int(DatabasePlan500G), + int(DatabasePlan1T), + } +} + +// DatabaseBackupSetting バックアップ設定 +type DatabaseBackupSetting struct { + Rotate int `json:",omitempty"` // ローテーション世代数 + Time string `json:",omitempty"` // 開始時刻 +} + +// DatabaseCommonSetting 共通設定 +type DatabaseCommonSetting struct { + DefaultUser string `json:",omitempty"` // ユーザー名 + UserPassword string `json:",omitempty"` // ユーザーパスワード + WebUI interface{} `json:",omitempty"` // WebUIのIPアドレス or FQDN + ServicePort string // ポート番号 + SourceNetwork SourceNetwork // 接続許可ネットワーク +} + +// SourceNetwork 接続許可ネットワーク +type SourceNetwork []string + +// UnmarshalJSON JSONアンマーシャル(配列と文字列が混在するためここで対応) +func (s *SourceNetwork) UnmarshalJSON(data []byte) error { + // SourceNetworkが未設定の場合、APIレスポンスが""となるため回避する + if string(data) == `""` { + return nil + } + + tmp := []string{} + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + source := SourceNetwork(tmp) + *s = source + return nil +} + +// MarshalJSON JSONマーシャル(配列と文字列が混在するためここで対応) +func (s *SourceNetwork) MarshalJSON() ([]byte, error) { + if s == nil { + return []byte(""), nil + } + + list := []string(*s) + if len(list) == 0 || (len(list) == 1 && list[0] == "") { + return []byte(`""`), nil + } + + return json.Marshal(list) +} + +// CreateDatabaseValue データベース作成用パラメータ +type CreateDatabaseValue struct { + Plan DatabasePlan // プラン + AdminPassword string // 管理者パスワード + DefaultUser string // ユーザー名 + UserPassword string // パスワード + SourceNetwork []string // 接続許可ネットワーク + ServicePort string // ポート + // BackupRotate int // バックアップ世代数 + BackupTime string // バックアップ開始時間 + SwitchID string // 接続先スイッチ + IPAddress1 string // IPアドレス1 + MaskLen int // ネットワークマスク長 + DefaultRoute string // デフォルトルート + Name string // 名称 + Description string // 説明 + Tags []string // タグ + Icon *Resource // アイコン + WebUI bool // WebUI有効 + DatabaseName string // データベース名 + DatabaseRevision string // リビジョン + DatabaseTitle string // データベースタイトル + DatabaseVersion string // データベースバージョン + ReplicaUser string // ReplicaUser レプリケーションユーザー + SourceAppliance *Resource // クローン元DB + //ReplicaPassword string // in current API version , setted admin password +} + +// NewCreatePostgreSQLDatabaseValue PostgreSQL作成用パラメーター +func NewCreatePostgreSQLDatabaseValue() *CreateDatabaseValue { + return &CreateDatabaseValue{ + DatabaseName: "postgres", + DatabaseVersion: "10", + } +} + +// NewCreateMariaDBDatabaseValue MariaDB作成用パラメーター +func NewCreateMariaDBDatabaseValue() *CreateDatabaseValue { + return &CreateDatabaseValue{ + DatabaseName: "MariaDB", + DatabaseVersion: "10.2", + } +} + +// NewCloneDatabaseValue クローンDB作成用パラメータ +func NewCloneDatabaseValue(db *Database) *CreateDatabaseValue { + return &CreateDatabaseValue{ + DatabaseName: db.Remark.DBConf.Common.DatabaseName, + DatabaseVersion: db.Remark.DBConf.Common.DatabaseVersion, + SourceAppliance: NewResource(db.ID), + } +} + +// CreateNewDatabase データベース作成 +func CreateNewDatabase(values *CreateDatabaseValue) *Database { + + db := &Database{ + // Appliance + Appliance: &Appliance{ + // Class + Class: "database", + // Name + propName: propName{Name: values.Name}, + // Description + propDescription: propDescription{Description: values.Description}, + // TagsType + propTags: propTags{ + // Tags + Tags: values.Tags, + }, + // Icon + propIcon: propIcon{ + &Icon{ + // Resource + Resource: values.Icon, + }, + }, + // Plan + //propPlanID: propPlanID{Plan: &Resource{ID: int64(values.Plan)}}, + }, + // Remark + Remark: &DatabaseRemark{ + // ApplianceRemarkBase + ApplianceRemarkBase: &ApplianceRemarkBase{ + // Servers + Servers: []interface{}{""}, + }, + // DBConf + DBConf: &DatabaseCommonRemarks{ + // Common + Common: &DatabaseCommonRemark{ + // DatabaseName + DatabaseName: values.DatabaseName, + // DatabaseRevision + DatabaseRevision: values.DatabaseRevision, + // DatabaseTitle + DatabaseTitle: values.DatabaseTitle, + // DatabaseVersion + DatabaseVersion: values.DatabaseVersion, + // ReplicaUser + // ReplicaUser: values.ReplicaUser, + // ReplicaPassword + // ReplicaPassword: values.AdminPassword, + }, + }, + // Plan + propPlanID: propPlanID{Plan: &Resource{ID: int64(values.Plan)}}, + SourceAppliance: values.SourceAppliance, + }, + // Settings + Settings: &DatabaseSettings{ + // DBConf + DBConf: &DatabaseSetting{ + // Backup + Backup: &DatabaseBackupSetting{ + // Rotate + // Rotate: values.BackupRotate, + Rotate: 8, + // Time + Time: values.BackupTime, + }, + // Common + Common: &DatabaseCommonSetting{ + // DefaultUser + DefaultUser: values.DefaultUser, + // UserPassword + UserPassword: values.UserPassword, + // SourceNetwork + SourceNetwork: SourceNetwork(values.SourceNetwork), + // ServicePort + ServicePort: values.ServicePort, + }, + }, + }, + } + + db.Remark.Switch = &ApplianceRemarkSwitch{ + // ID + ID: values.SwitchID, + } + db.Remark.Network = &DatabaseRemarkNetwork{ + // NetworkMaskLen + NetworkMaskLen: values.MaskLen, + // DefaultRoute + DefaultRoute: values.DefaultRoute, + } + + db.Remark.Servers = []interface{}{ + map[string]interface{}{"IPAddress": values.IPAddress1}, + } + + if values.WebUI { + db.Settings.DBConf.Common.WebUI = values.WebUI + } + + return db +} + +// CloneNewDatabase データベース作成 +func CloneNewDatabase(values *CreateDatabaseValue) *Database { + db := &Database{ + // Appliance + Appliance: &Appliance{ + // Class + Class: "database", + // Name + propName: propName{Name: values.Name}, + // Description + propDescription: propDescription{Description: values.Description}, + // TagsType + propTags: propTags{ + // Tags + Tags: values.Tags, + }, + // Icon + propIcon: propIcon{ + &Icon{ + // Resource + Resource: values.Icon, + }, + }, + // Plan + //propPlanID: propPlanID{Plan: &Resource{ID: int64(values.Plan)}}, + }, + // Remark + Remark: &DatabaseRemark{ + // ApplianceRemarkBase + ApplianceRemarkBase: &ApplianceRemarkBase{ + // Servers + Servers: []interface{}{""}, + }, + // DBConf + DBConf: &DatabaseCommonRemarks{ + // Common + Common: &DatabaseCommonRemark{ + DatabaseName: values.DatabaseName, + DatabaseVersion: values.DatabaseVersion, + }, + }, + // Plan + propPlanID: propPlanID{Plan: &Resource{ID: int64(values.Plan)}}, + SourceAppliance: values.SourceAppliance, + }, + // Settings + Settings: &DatabaseSettings{ + // DBConf + DBConf: &DatabaseSetting{ + // Backup + Backup: &DatabaseBackupSetting{ + // Rotate + // Rotate: values.BackupRotate, + Rotate: 8, + // Time + Time: values.BackupTime, + }, + // Common + Common: &DatabaseCommonSetting{ + // SourceNetwork + SourceNetwork: SourceNetwork(values.SourceNetwork), + // ServicePort + ServicePort: values.ServicePort, + }, + }, + }, + } + + db.Remark.Switch = &ApplianceRemarkSwitch{ + // ID + ID: values.SwitchID, + } + db.Remark.Network = &DatabaseRemarkNetwork{ + // NetworkMaskLen + NetworkMaskLen: values.MaskLen, + // DefaultRoute + DefaultRoute: values.DefaultRoute, + } + + db.Remark.Servers = []interface{}{ + map[string]interface{}{"IPAddress": values.IPAddress1}, + } + + if values.WebUI { + db.Settings.DBConf.Common.WebUI = values.WebUI + } + + return db +} + +// AddSourceNetwork 接続許可ネットワーク 追加 +func (s *Database) AddSourceNetwork(nw string) { + res := []string(s.Settings.DBConf.Common.SourceNetwork) + res = append(res, nw) + s.Settings.DBConf.Common.SourceNetwork = SourceNetwork(res) +} + +// DeleteSourceNetwork 接続許可ネットワーク 削除 +func (s *Database) DeleteSourceNetwork(nw string) { + res := []string{} + for _, s := range s.Settings.DBConf.Common.SourceNetwork { + if s != nw { + res = append(res, s) + } + } + s.Settings.DBConf.Common.SourceNetwork = SourceNetwork(res) +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/database_status.go b/vendor/github.com/sacloud/libsacloud/sacloud/database_status.go new file mode 100644 index 00000000..26ed1ef3 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/database_status.go @@ -0,0 +1,128 @@ +package sacloud + +import ( + "encoding/json" + "strconv" + "strings" + "time" +) + +// DatabaseStatus データベース ステータス +type DatabaseStatus struct { + *EServerInstanceStatus + DBConf *DatabaseStatusDBConf `json:",omitempty"` +} + +// DatabaseStatusDBConf データベース設定 +type DatabaseStatusDBConf struct { + Version *DatabaseStatusVersion `json:"version,omitempty"` + Log []*DatabaseLog `json:"log,omitempty"` + Backup *DatabaseBackupInfo `json:"backup,omitempty"` +} + +// DatabaseStatusVersion データベース設定バージョン情報 +type DatabaseStatusVersion struct { + LastModified string `json:"lastmodified,omitempty"` + CommitHash string `json:"commithash,omitempty"` + Status string `json:"status,omitempty"` + Tag string `json:"tag,omitempty"` + Expire string `json:"expire,omitempty"` +} + +// DatabaseLog データベースログ +type DatabaseLog struct { + Name string `json:"name,omitempty"` + Data string `json:"data,omitempty"` +} + +// IsSystemdLog systemcltのログか判定 +func (l *DatabaseLog) IsSystemdLog() bool { + return l.Name == "systemctl" +} + +// Logs ログボディ取得 +func (l *DatabaseLog) Logs() []string { + return strings.Split(l.Data, "\n") +} + +// ID ログのID取得 +func (l *DatabaseLog) ID() string { + return l.Name +} + +// DatabaseBackupInfo データベースバックアップ情報 +type DatabaseBackupInfo struct { + History []*DatabaseBackupHistory `json:"history,omitempty"` +} + +// DatabaseBackupHistory データベースバックアップ履歴情報 +type DatabaseBackupHistory struct { + CreatedAt time.Time `json:"createdat,omitempty"` + Availability string `json:"availability,omitempty"` + RecoveredAt *time.Time `json:"recoveredat,omitempty"` + Size int64 `json:"size,omitempty"` +} + +// ID バックアップ履歴のID取得 +func (h *DatabaseBackupHistory) ID() string { + return h.CreatedAt.Format(time.RFC3339) +} + +// FormatCreatedAt 指定のレイアウトで作成日時を文字列化 +func (h *DatabaseBackupHistory) FormatCreatedAt(layout string) string { + return h.CreatedAt.Format(layout) +} + +// FormatRecoveredAt 指定のレイアウトで復元日時を文字列化 +// +// 復元日時がnilの場合は空の文字列を返す +func (h *DatabaseBackupHistory) FormatRecoveredAt(layout string) string { + if h.RecoveredAt == nil { + return "" + } + return h.RecoveredAt.Format(layout) +} + +// UnmarshalJSON JSON復号処理 +func (h *DatabaseBackupHistory) UnmarshalJSON(data []byte) error { + + var tmpMap = map[string]interface{}{} + if err := json.Unmarshal(data, &tmpMap); err != nil { + return err + } + + if recoveredAt, ok := tmpMap["recoveredat"]; ok { + if strRecoveredAt, ok := recoveredAt.(string); ok { + if _, err := time.Parse(time.RFC3339, strRecoveredAt); err != nil { + tmpMap["recoveredat"] = nil + } + } + } + + data, err := json.Marshal(tmpMap) + if err != nil { + return err + } + + tmp := &struct { + CreatedAt time.Time `json:"createdat,omitempty"` + Availability string `json:"availability,omitempty"` + RecoveredAt *time.Time `json:"recoveredat,omitempty"` + Size string `json:"size,omitempty"` + }{} + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + h.CreatedAt = tmp.CreatedAt + h.Availability = tmp.Availability + h.RecoveredAt = tmp.RecoveredAt + s, err := strconv.ParseInt(tmp.Size, 10, 64) + if err == nil { + h.Size = s + } else { + return err + } + + return nil +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/delete_cache_result.go b/vendor/github.com/sacloud/libsacloud/sacloud/delete_cache_result.go new file mode 100644 index 00000000..aa0cea46 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/delete_cache_result.go @@ -0,0 +1,8 @@ +package sacloud + +// DeleteCacheResult ウェブアクセラレータ キャッシュ削除APIレスポンス +type DeleteCacheResult struct { + URL string `json:",omitempty"` // URL + Status int `json:",omitempty"` // ステータス + Result string `json:",omitempty"` // 結果 +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/disk.go b/vendor/github.com/sacloud/libsacloud/sacloud/disk.go new file mode 100644 index 00000000..9deb36ef --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/disk.go @@ -0,0 +1,202 @@ +package sacloud + +import "fmt" + +// Disk ディスク +type Disk struct { + *Resource // ID + propAvailability // 有功状態 + propName // 名称 + propDescription // 説明 + propSizeMB // サイズ(MB単位) + propMigratedMB // コピー済みデータサイズ(MB単位) + propCopySource // コピー元情報 + propJobStatus // マイグレーションジョブステータス + propBundleInfo // バンドル情報 + propServer // サーバー + propIcon // アイコン + propTags // タグ + propCreatedAt // 作成日時 + propPlanID // プランID + propDiskConnection // ディスク接続情報 + propDistantFrom // ストレージ隔離対象ディスク + + ReinstallCount int `json:",omitempty"` // 再インストール回数 + + Storage struct { // ストレージ + *Resource // ID + Name string `json:",omitempty"` // 名称 + DiskPlan ProductDisk `json:",ommitempty"` // ディスクプラン + MountIndex int64 `json:",omitempty"` // マウント順 + Class string `json:",omitempty"` // クラス + } +} + +// DiskPlanID ディスクプランID +type DiskPlanID int64 + +const ( + // DiskPlanHDDID HDDプランID + DiskPlanHDDID = DiskPlanID(2) + // DiskPlanSSDID SSDプランID + DiskPlanSSDID = DiskPlanID(4) + // DiskConnectionVirtio 準仮想化モード(virtio) + DiskConnectionVirtio EDiskConnection = "virtio" + // DiskConnectionIDE IDE + DiskConnectionIDE EDiskConnection = "ide" +) + +var ( + // DiskPlanHDD HDDプラン + DiskPlanHDD = &Resource{ID: int64(DiskPlanHDDID)} + // DiskPlanSSD SSDプラン + DiskPlanSSD = &Resource{ID: int64(DiskPlanSSDID)} +) + +// ToResource ディスクプランIDからリソースへの変換 +func (d DiskPlanID) ToResource() *Resource { + return &Resource{ID: int64(d)} +} + +// CreateNewDisk ディスクの作成 +func CreateNewDisk() *Disk { + return &Disk{ + propPlanID: propPlanID{Plan: DiskPlanSSD}, + propDiskConnection: propDiskConnection{Connection: DiskConnectionVirtio}, + propSizeMB: propSizeMB{SizeMB: 20480}, + } +} + +// SetDiskPlan プラン文字列(ssd or sdd)からプラン設定 +func (d *Disk) SetDiskPlan(strPlan string) { + switch strPlan { + case "ssd": + d.Plan = DiskPlanSSD + case "hdd": + d.Plan = DiskPlanHDD + default: + panic(fmt.Errorf("Invalid plan:%s", strPlan)) + } +} + +// SetDiskPlanToHDD HDDプラン 設定 +func (d *Disk) SetDiskPlanToHDD() { + d.Plan = DiskPlanHDD +} + +// SetDiskPlanToSSD SSDプラン 設定 +func (d *Disk) SetDiskPlanToSSD() { + d.Plan = DiskPlanSSD +} + +// DiskEditValue ディスクの修正用パラメータ +// +// 設定を行う項目のみ値をセットする。値のセットにはセッターを利用すること。 +type DiskEditValue struct { + Password *string `json:",omitempty"` // パスワード + SSHKey *SSHKey `json:",omitempty"` // 公開鍵(単体) + SSHKeys []*SSHKey `json:",omitempty"` // 公開鍵(複数) + DisablePWAuth *bool `json:",omitempty"` // パスワード認証無効化フラグ + HostName *string `json:",omitempty"` // ホスト名 + Notes []*Resource `json:",omitempty"` // スタートアップスクリプト + UserIPAddress *string `json:",omitempty"` // IPアドレス + UserSubnet *struct { // サブネット情報 + DefaultRoute string `json:",omitempty"` // デフォルトルート + NetworkMaskLen string `json:",omitempty"` // ネットワークマスク長 + } `json:",omitempty"` +} + +// SetHostName ホスト名 設定 +func (d *DiskEditValue) SetHostName(value string) { + d.HostName = &value +} + +// SetPassword パスワード 設定 +func (d *DiskEditValue) SetPassword(value string) { + d.Password = &value +} + +// AddSSHKeys 公開鍵 設定 +func (d *DiskEditValue) AddSSHKeys(keyID string) { + if d.SSHKeys == nil { + d.SSHKeys = []*SSHKey{} + } + d.SSHKeys = append(d.SSHKeys, &SSHKey{Resource: NewResourceByStringID(keyID)}) +} + +// SetSSHKeys 公開鍵 設定 +func (d *DiskEditValue) SetSSHKeys(keyIDs []string) { + if d.SSHKeys == nil { + d.SSHKeys = []*SSHKey{} + } + for _, keyID := range keyIDs { + d.SSHKeys = append(d.SSHKeys, &SSHKey{Resource: NewResourceByStringID(keyID)}) + } +} + +// AddSSHKeyByString 公開鍵(文字列) 追加 +func (d *DiskEditValue) AddSSHKeyByString(key string) { + if d.SSHKeys == nil { + d.SSHKeys = []*SSHKey{} + } + d.SSHKeys = append(d.SSHKeys, &SSHKey{PublicKey: key}) +} + +// SetSSHKeyByString 公開鍵(文字列) 設定 +func (d *DiskEditValue) SetSSHKeyByString(keys []string) { + if d.SSHKeys == nil { + d.SSHKeys = []*SSHKey{} + } + for _, key := range keys { + d.SSHKeys = append(d.SSHKeys, &SSHKey{PublicKey: key}) + } +} + +// SetDisablePWAuth パスワード認証無効化フラグ 設定 +func (d *DiskEditValue) SetDisablePWAuth(disable bool) { + d.DisablePWAuth = &disable +} + +// SetNotes スタートアップスクリプト 設定 +func (d *DiskEditValue) SetNotes(noteIDs []string) { + d.Notes = []*Resource{} + for _, noteID := range noteIDs { + d.Notes = append(d.Notes, NewResourceByStringID(noteID)) + } + +} + +// AddNote スタートアップスクリプト 追加 +func (d *DiskEditValue) AddNote(noteID string) { + if d.Notes == nil { + d.Notes = []*Resource{} + } + d.Notes = append(d.Notes, NewResourceByStringID(noteID)) +} + +// SetUserIPAddress IPアドレス 設定 +func (d *DiskEditValue) SetUserIPAddress(ip string) { + d.UserIPAddress = &ip +} + +// SetDefaultRoute デフォルトルート 設定 +func (d *DiskEditValue) SetDefaultRoute(route string) { + if d.UserSubnet == nil { + d.UserSubnet = &struct { + DefaultRoute string `json:",omitempty"` + NetworkMaskLen string `json:",omitempty"` + }{} + } + d.UserSubnet.DefaultRoute = route +} + +// SetNetworkMaskLen ネットワークマスク長 設定 +func (d *DiskEditValue) SetNetworkMaskLen(length string) { + if d.UserSubnet == nil { + d.UserSubnet = &struct { + DefaultRoute string `json:",omitempty"` + NetworkMaskLen string `json:",omitempty"` + }{} + } + d.UserSubnet.NetworkMaskLen = length +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/dns.go b/vendor/github.com/sacloud/libsacloud/sacloud/dns.go new file mode 100644 index 00000000..edfbbc63 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/dns.go @@ -0,0 +1,189 @@ +package sacloud + +import ( + "fmt" + "strings" +) + +// DNS DNS(CommonServiceItem) +type DNS struct { + *Resource // ID + propName // 名称 + propDescription // 説明 + propServiceClass // サービスクラス + propIcon // アイコン + propTags // タグ + propCreatedAt // 作成日時 + propModifiedAt // 変更日時 + + Status DNSStatus `json:",omitempty"` // ステータス + Provider DNSProvider `json:",omitempty"` // プロバイダ + Settings DNSSettings `json:",omitempty"` // 設定 + +} + +// DNSSettings DNS設定リスト +type DNSSettings struct { + DNS DNSRecordSets `json:",omitempty"` // DNSレコード設定リスト +} + +// DNSStatus DNSステータス +type DNSStatus struct { + Zone string `json:",omitempty"` // 対象ゾーン + NS []string `json:",omitempty"` // ネームサーバーリスト +} + +// DNSProvider プロバイダ +type DNSProvider struct { + Class string `json:",omitempty"` // クラス +} + +// CreateNewDNS DNS作成 +func CreateNewDNS(zoneName string) *DNS { + return &DNS{ + Resource: &Resource{}, + propName: propName{Name: zoneName}, + Status: DNSStatus{ + Zone: zoneName, + }, + Provider: DNSProvider{ + Class: "dns", + }, + Settings: DNSSettings{ + DNS: DNSRecordSets{}, + }, + } +} + +// AllowDNSTypes DNSレコード種別リスト +func AllowDNSTypes() []string { + return []string{"A", "AAAA", "CNAME", "NS", "MX", "TXT", "SRV"} +} + +// SetZone DNSゾーン名 設定 +func (d *DNS) SetZone(zone string) { + d.Name = zone + d.Status.Zone = zone +} + +// HasDNSRecord DNSレコード設定を保持しているか判定 +func (d *DNS) HasDNSRecord() bool { + return len(d.Settings.DNS.ResourceRecordSets) > 0 +} + +// CreateNewRecord DNSレコード作成(汎用) +func (d *DNS) CreateNewRecord(name string, rtype string, rdata string, ttl int) *DNSRecordSet { + return &DNSRecordSet{ + // Name + Name: name, + // Type + Type: rtype, + // RData + RData: rdata, + // TTL + TTL: ttl, + } +} + +// CreateNewMXRecord DNSレコード作成(MXレコード) +func (d *DNS) CreateNewMXRecord(name string, rdata string, ttl int, priority int) *DNSRecordSet { + if rdata != "" && !strings.HasSuffix(rdata, ".") { + rdata = rdata + "." + } + return &DNSRecordSet{ + // Name + Name: name, + // Type + Type: "MX", + // RData + RData: fmt.Sprintf("%d %s", priority, rdata), + // TTL + TTL: ttl, + } +} + +// CreateNewSRVRecord DNSレコード作成(SRVレコード) +func (d *DNS) CreateNewSRVRecord(name string, rdata string, ttl int, priority int, weight int, port int) *DNSRecordSet { + return &DNSRecordSet{ + // Name + Name: name, + // Type + Type: "SRV", + // RData + RData: fmt.Sprintf("%d %d %d %s", priority, weight, port, rdata), + // TTL + TTL: ttl, + } +} + +// AddRecord レコードの追加 +func (d *DNS) AddRecord(record *DNSRecordSet) { + var recordSet = d.Settings.DNS.ResourceRecordSets + var isExist = false + for i := range recordSet { + if recordSet[i].Name == record.Name && recordSet[i].Type == record.Type && recordSet[i].RData == record.RData { + d.Settings.DNS.ResourceRecordSets[i].TTL = record.TTL + isExist = true + } + } + + if !isExist { + d.Settings.DNS.ResourceRecordSets = append(d.Settings.DNS.ResourceRecordSets, *record) + } + +} + +// ClearRecords レコード クリア +func (d *DNS) ClearRecords() { + d.Settings.DNS = DNSRecordSets{} +} + +// DNSRecordSets DNSレコード設定リスト +type DNSRecordSets struct { + // ResourceRecordSets DNSレコード設定リスト + ResourceRecordSets []DNSRecordSet +} + +// AddDNSRecordSet ホスト名とIPアドレスにてAレコードを登録 +func (d *DNSRecordSets) AddDNSRecordSet(name string, ip string) { + var record DNSRecordSet + var isExist = false + for i := range d.ResourceRecordSets { + if d.ResourceRecordSets[i].Name == name && d.ResourceRecordSets[i].Type == "A" { + d.ResourceRecordSets[i].RData = ip + isExist = true + } + } + + if !isExist { + record = DNSRecordSet{ + // Name + Name: name, + // Type + Type: "A", + // RData + RData: ip, + } + d.ResourceRecordSets = append(d.ResourceRecordSets, record) + } +} + +// DeleteDNSRecordSet ホスト名とIPアドレスにてAレコードを削除する +func (d *DNSRecordSets) DeleteDNSRecordSet(name string, ip string) { + res := []DNSRecordSet{} + for i := range d.ResourceRecordSets { + if d.ResourceRecordSets[i].Name != name || d.ResourceRecordSets[i].Type != "A" || d.ResourceRecordSets[i].RData != ip { + res = append(res, d.ResourceRecordSets[i]) + } + } + + d.ResourceRecordSets = res +} + +// DNSRecordSet DNSレコード設定 +type DNSRecordSet struct { + Name string `json:",omitempty"` // ホスト名 + Type string `json:",omitempty"` // レコードタイプ + RData string `json:",omitempty"` // レコードデータ + TTL int `json:",omitempty"` // TTL +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/doc.go b/vendor/github.com/sacloud/libsacloud/sacloud/doc.go new file mode 100644 index 00000000..2cb4fdcf --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/doc.go @@ -0,0 +1,3 @@ +// Package sacloud is define models for SakuraCloud. +// +package sacloud diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/feed.go b/vendor/github.com/sacloud/libsacloud/sacloud/feed.go new file mode 100644 index 00000000..f4c91840 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/feed.go @@ -0,0 +1,36 @@ +package sacloud + +import ( + "strconv" + "time" +) + +// NewsFeed メンテナンス/障害情報お知らせ +type NewsFeed struct { + StrDate string `json:"date,omitempty"` + Description string `json:"desc,omitempty"` + StrEventStart string `json:"event_start,omitempty"` + StrEventEnd string `json:"event_end,omitempty"` + Title string `json:"title,omitempty"` + URL string `json:"url,omitempty"` +} + +// Date 対象日時 +func (f *NewsFeed) Date() time.Time { + return f.parseTime(f.StrDate) +} + +// EventStart 掲載開始日時 +func (f *NewsFeed) EventStart() time.Time { + return f.parseTime(f.StrEventStart) +} + +// EventEnd 掲載終了日時 +func (f *NewsFeed) EventEnd() time.Time { + return f.parseTime(f.StrEventEnd) +} + +func (f *NewsFeed) parseTime(sec string) time.Time { + s, _ := strconv.ParseInt(sec, 10, 64) + return time.Unix(s, 0) +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/ftp_server.go b/vendor/github.com/sacloud/libsacloud/sacloud/ftp_server.go new file mode 100644 index 00000000..7c56bb68 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/ftp_server.go @@ -0,0 +1,15 @@ +package sacloud + +// FTPServer FTPサーバー接続情報 +type FTPServer struct { + HostName string `json:",omitempty"` // FTPサーバーホスト名 + IPAddress string `json:",omitempty"` // FTPサーバー IPアドレス + User string `json:",omitempty"` // 接続ユーザー名 + Password string `json:",omitempty"` // パスワード + +} + +// FTPOpenRequest FTP接続オープンリクエスト +type FTPOpenRequest struct { + ChangePassword bool // パスワード変更フラグ +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/gslb.go b/vendor/github.com/sacloud/libsacloud/sacloud/gslb.go new file mode 100644 index 00000000..41f7bd02 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/gslb.go @@ -0,0 +1,216 @@ +package sacloud + +import "fmt" + +// GSLB GSLB(CommonServiceItem) +type GSLB struct { + *Resource // ID + propName // 名称 + propDescription // 説明 + propServiceClass // サービスクラス + propIcon // アイコン + propTags // タグ + propCreatedAt // 作成日時 + propModifiedAt // 変更日時 + + Status GSLBStatus `json:",omitempty"` // ステータス + Provider GSLBProvider `json:",omitempty"` // プロバイダ + Settings GSLBSettings `json:",omitempty"` // GSLB設定 + +} + +// GSLBSettings GSLB設定 +type GSLBSettings struct { + GSLB GSLBRecordSets `json:",omitempty"` // GSLB GSLBエントリー +} + +// GSLBStatus GSLBステータス +type GSLBStatus struct { + FQDN string `json:",omitempty"` // GSLBのFQDN +} + +// GSLBProvider プロバイダ +type GSLBProvider struct { + Class string `json:",omitempty"` // クラス +} + +// CreateNewGSLB GSLB作成 +func CreateNewGSLB(gslbName string) *GSLB { + return &GSLB{ + Resource: &Resource{}, + propName: propName{Name: gslbName}, + Provider: GSLBProvider{ + Class: "gslb", + }, + Settings: GSLBSettings{ + GSLB: GSLBRecordSets{ + DelayLoop: 10, + HealthCheck: defaultGSLBHealthCheck, + Weighted: "True", + Servers: []GSLBServer{}, + }, + }, + } + +} + +// AllowGSLBHealthCheckProtocol GSLB監視プロトコルリスト +func AllowGSLBHealthCheckProtocol() []string { + return []string{"http", "https", "ping", "tcp"} +} + +// HasGSLBServer GSLB配下にサーバーを保持しているか判定 +func (g *GSLB) HasGSLBServer() bool { + return len(g.Settings.GSLB.Servers) > 0 +} + +// CreateGSLBServer GSLB配下のサーバーを作成 +func (g *GSLB) CreateGSLBServer(ip string) *GSLBServer { + return &GSLBServer{ + IPAddress: ip, + Enabled: "True", + Weight: "1", + } +} + +// AddGSLBServer GSLB配下にサーバーを追加 +func (g *GSLB) AddGSLBServer(server *GSLBServer) { + var isExist = false + for i := range g.Settings.GSLB.Servers { + if g.Settings.GSLB.Servers[i].IPAddress == server.IPAddress { + g.Settings.GSLB.Servers[i].Enabled = server.Enabled + g.Settings.GSLB.Servers[i].Weight = server.Weight + isExist = true + } + } + + if !isExist { + g.Settings.GSLB.Servers = append(g.Settings.GSLB.Servers, *server) + } +} + +// ClearGSLBServer GSLB配下のサーバーをクリア +func (g *GSLB) ClearGSLBServer() { + g.Settings.GSLB.Servers = []GSLBServer{} +} + +// GSLBRecordSets GSLBエントリー +type GSLBRecordSets struct { + DelayLoop int `json:",omitempty"` // 監視間隔 + HealthCheck GSLBHealthCheck `json:",omitempty"` // ヘルスチェック + Weighted string `json:",omitempty"` // ウェイト + SorryServer string `json:",omitempty"` // ソーリーサーバー + Servers []GSLBServer // サーバー +} + +// AddServer GSLB配下のサーバーを追加 +func (g *GSLBRecordSets) AddServer(ip string) { + var record GSLBServer + var isExist = false + for i := range g.Servers { + if g.Servers[i].IPAddress == ip { + isExist = true + } + } + + if !isExist { + record = GSLBServer{ + IPAddress: ip, + Enabled: "True", + Weight: "1", + } + g.Servers = append(g.Servers, record) + } +} + +// DeleteServer GSLB配下のサーバーを削除 +func (g *GSLBRecordSets) DeleteServer(ip string) { + res := []GSLBServer{} + for i := range g.Servers { + if g.Servers[i].IPAddress != ip { + res = append(res, g.Servers[i]) + } + } + + g.Servers = res +} + +// GSLBServer GSLB配下のサーバー +type GSLBServer struct { + IPAddress string `json:",omitempty"` // IPアドレス + Enabled string `json:",omitempty"` // 有効/無効 + Weight string `json:",omitempty"` // ウェイト + +} + +// GSLBHealthCheck ヘルスチェック +type GSLBHealthCheck struct { + Protocol string `json:",omitempty"` // プロトコル + Host string `json:",omitempty"` // 対象ホスト + Path string `json:",omitempty"` // HTTP/HTTPSの場合のリクエストパス + Status string `json:",omitempty"` // 期待するステータスコード + Port string `json:",omitempty"` // ポート番号 +} + +var defaultGSLBHealthCheck = GSLBHealthCheck{ + Protocol: "http", + Host: "", + Path: "/", + Status: "200", +} + +// SetHTTPHealthCheck HTTPヘルスチェック 設定 +func (g *GSLB) SetHTTPHealthCheck(hostHeader string, path string, responseCode int) { + g.Settings.GSLB.HealthCheck.Protocol = "http" + g.Settings.GSLB.HealthCheck.Host = hostHeader + g.Settings.GSLB.HealthCheck.Path = path + g.Settings.GSLB.HealthCheck.Status = fmt.Sprintf("%d", responseCode) + g.Settings.GSLB.HealthCheck.Port = "" + +} + +// SetHTTPSHealthCheck HTTPSヘルスチェック 設定 +func (g *GSLB) SetHTTPSHealthCheck(hostHeader string, path string, responseCode int) { + g.Settings.GSLB.HealthCheck.Protocol = "https" + g.Settings.GSLB.HealthCheck.Host = hostHeader + g.Settings.GSLB.HealthCheck.Path = path + g.Settings.GSLB.HealthCheck.Status = fmt.Sprintf("%d", responseCode) + g.Settings.GSLB.HealthCheck.Port = "" +} + +// SetPingHealthCheck Pingヘルスチェック 設定 +func (g *GSLB) SetPingHealthCheck() { + g.Settings.GSLB.HealthCheck.Protocol = "ping" + g.Settings.GSLB.HealthCheck.Host = "" + g.Settings.GSLB.HealthCheck.Path = "" + g.Settings.GSLB.HealthCheck.Status = "" + g.Settings.GSLB.HealthCheck.Port = "" +} + +// SetTCPHealthCheck TCPヘルスチェック 設定 +func (g *GSLB) SetTCPHealthCheck(port int) { + g.Settings.GSLB.HealthCheck.Protocol = "tcp" + g.Settings.GSLB.HealthCheck.Host = "" + g.Settings.GSLB.HealthCheck.Path = "" + g.Settings.GSLB.HealthCheck.Status = "" + g.Settings.GSLB.HealthCheck.Port = fmt.Sprintf("%d", port) +} + +// SetDelayLoop 監視間隔秒数 設定 +func (g *GSLB) SetDelayLoop(delayLoop int) { + g.Settings.GSLB.DelayLoop = delayLoop +} + +// SetWeightedEnable 重み付け応答 有効/無効 設定 +func (g *GSLB) SetWeightedEnable(enable bool) { + v := "True" + if !enable { + v = "False" + } + g.Settings.GSLB.Weighted = v +} + +// SetSorryServer ソーリーサーバ 設定 +func (g *GSLB) SetSorryServer(server string) { + g.Settings.GSLB.SorryServer = server +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/host.go b/vendor/github.com/sacloud/libsacloud/sacloud/host.go new file mode 100644 index 00000000..f32f12cb --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/host.go @@ -0,0 +1,6 @@ +package sacloud + +// Host さくらのクラウド ホスト(物理) +type Host struct { + propName // 名称 +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/icon.go b/vendor/github.com/sacloud/libsacloud/sacloud/icon.go new file mode 100644 index 00000000..ebdffd91 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/icon.go @@ -0,0 +1,33 @@ +package sacloud + +// Icon アイコン +type Icon struct { + *Resource // ID + propAvailability // 有功状態 + propName // 名称 + propScope // スコープ + propTags // タグ + propCreatedAt // 作成日時 + propModifiedAt // 変更日時 + + URL string `json:",omitempty"` // アイコンURL + Image string `json:",omitempty"` // 画像データBase64文字列(Sizeパラメータ指定時 or 画像アップロード時に利用) +} + +// Image 画像データBASE64文字列 +type Image string + +// GetURL アイコン画像URL取得 +func (icon *Icon) GetURL() string { + return icon.URL +} + +// GetImage アイコン画像データ(base64)取得 +func (icon *Icon) GetImage() string { + return icon.Image +} + +// SetImage アイコン画像データ(base64)設定 +func (icon *Icon) SetImage(image string) { + icon.Image = image +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/instance.go b/vendor/github.com/sacloud/libsacloud/sacloud/instance.go new file mode 100644 index 00000000..701496a7 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/instance.go @@ -0,0 +1,35 @@ +package sacloud + +import "time" + +// Instance インスタンス +type Instance struct { + *EServerInstanceStatus // ステータス + Server Resource `json:",omitempty"` // サーバー + StatusChangedAt *time.Time `json:",omitempty"` // ステータス変更日時 + MigrationProgress string `json:",omitempty"` // コピージョブ進捗状態 + MigrationSchedule string `json:",omitempty"` // コピージョブスケジュール + IsMigrating bool `json:",omitempty"` // コピージョブ実施中フラグ + MigrationAllowed string `json:",omitempty"` // コピージョブ許可 + ModifiedAt *time.Time `json:",omitempty"` // 変更日時 + CDROM *CDROM `json:",omitempty"` // ISOイメージ + CDROMStorage *Storage `json:",omitempty"` // ISOイメージストレージ + + Host struct { // Host + Name string `json:",omitempty"` // ホスト名 + InfoURL string `json:",omitempty"` // インフォURL + Class string `json:",omitempty"` // クラス + Version int `json:",omitempty"` // バージョン + SystemVersion string `json:",omitempty"` // システムバージョン + } `json:",omitempty"` +} + +// HasInfoURL Host.InfoURLに値があるか +func (i *Instance) HasInfoURL() bool { + return i != nil && i.Host.InfoURL != "" +} + +// MaintenanceScheduled メンテナンス予定の有無 +func (i *Instance) MaintenanceScheduled() bool { + return i.HasInfoURL() +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/interface.go b/vendor/github.com/sacloud/libsacloud/sacloud/interface.go new file mode 100644 index 00000000..557a3444 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/interface.go @@ -0,0 +1,43 @@ +package sacloud + +// Interface インターフェース(NIC) +type Interface struct { + *Resource // ID + propServer // サーバー + propSwitch // スイッチ + MACAddress string `json:",omitempty"` // MACアドレス + IPAddress string `json:",omitempty"` // IPアドレス + UserIPAddress string `json:",omitempty"` // ユーザー指定IPアドレス + HostName string `json:",omitempty"` // ホスト名 + PacketFilter *PacketFilter `json:",omitempty"` // 適用パケットフィルタ +} + +// GetMACAddress MACアドレス 取得 +func (i *Interface) GetMACAddress() string { + return i.MACAddress +} + +//GetIPAddress IPアドレス 取得 +func (i *Interface) GetIPAddress() string { + return i.IPAddress +} + +// SetUserIPAddress ユーザー指定IPアドレス 設定 +func (i *Interface) SetUserIPAddress(ip string) { + i.UserIPAddress = ip +} + +//GetUserIPAddress ユーザー指定IPアドレス 取得 +func (i *Interface) GetUserIPAddress() string { + return i.UserIPAddress +} + +// GetHostName ホスト名 取得 +func (i *Interface) GetHostName() string { + return i.HostName +} + +// GetPacketFilter 適用パケットフィルタ 取得 +func (i *Interface) GetPacketFilter() *PacketFilter { + return i.PacketFilter +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/internet.go b/vendor/github.com/sacloud/libsacloud/sacloud/internet.go new file mode 100644 index 00000000..ef775880 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/internet.go @@ -0,0 +1,50 @@ +package sacloud + +// Internet ルーター +type Internet struct { + *Resource // ID + propName // 名称 + propDescription // 説明 + propScope // スコープ + propServiceClass // サービスクラス + propSwitch // 接続先スイッチ + propIcon // アイコン + propTags // タグ + propCreatedAt // 作成日時 + + BandWidthMbps int `json:",omitempty"` // 帯域 + NetworkMaskLen int `json:",omitempty"` // ネットワークマスク長 + + //TODO Zone(API側起因のデータ型不一致のため) + // ZoneType +} + +// GetBandWidthMbps 帯域幅 取得 +func (i *Internet) GetBandWidthMbps() int { + return i.BandWidthMbps +} + +// SetBandWidthMbps 帯域幅 設定 +func (i *Internet) SetBandWidthMbps(v int) { + i.BandWidthMbps = v +} + +// GetNetworkMaskLen ネットワークマスク長 取得 +func (i *Internet) GetNetworkMaskLen() int { + return i.NetworkMaskLen +} + +// SetNetworkMaskLen ネットワークマスク長 設定 +func (i *Internet) SetNetworkMaskLen(v int) { + i.NetworkMaskLen = v +} + +// AllowInternetBandWidth 設定可能な帯域幅の値リスト +func AllowInternetBandWidth() []int { + return []int{100, 250, 500, 1000, 1500, 2000, 2500, 3000} +} + +// AllowInternetNetworkMaskLen 設定可能なネットワークマスク長の値リスト +func AllowInternetNetworkMaskLen() []int { + return []int{26, 27, 28} +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/ipaddress.go b/vendor/github.com/sacloud/libsacloud/sacloud/ipaddress.go new file mode 100644 index 00000000..0b08a4ce --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/ipaddress.go @@ -0,0 +1,10 @@ +package sacloud + +// IPAddress IPアドレス(IPv4) +type IPAddress struct { + HostName string `json:",omitempty"` // HostName ホスト名 + IPAddress string `json:",omitempty"` // IPAddress IPv4アドレス + Interface *Interface `json:",omitempty"` // Interface インターフェース + Subnet *Subnet `json:",omitempty"` // Subnet IPv4サブネット + +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/ipv6addr.go b/vendor/github.com/sacloud/libsacloud/sacloud/ipv6addr.go new file mode 100644 index 00000000..13533fdc --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/ipv6addr.go @@ -0,0 +1,35 @@ +package sacloud + +// IPv6Addr IPアドレス(IPv6) +type IPv6Addr struct { + HostName string `json:",omitempty"` // ホスト名 + IPv6Addr string `json:",omitempty"` // IPv6アドレス + Interface *Interface `json:",omitempty"` // インターフェース + IPv6Net *IPv6Net `json:",omitempty"` // IPv6サブネット + +} + +// GetIPv6NetID IPv6アドレスが所属するIPv6NetのIDを取得 +func (a *IPv6Addr) GetIPv6NetID() int64 { + if a.IPv6Net != nil { + return a.IPv6Net.ID + } + return 0 +} + +// GetInternetID IPv6アドレスを所有するルータ+スイッチ(Internet)のIDを取得 +func (a *IPv6Addr) GetInternetID() int64 { + if a.IPv6Net != nil && a.IPv6Net.Switch != nil && a.IPv6Net.Switch.Internet != nil { + return a.IPv6Net.Switch.Internet.ID + } + return 0 +} + +// CreateNewIPv6Addr IPv6アドレス作成 +func CreateNewIPv6Addr() *IPv6Addr { + return &IPv6Addr{ + IPv6Net: &IPv6Net{ + Resource: &Resource{}, + }, + } +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/ipv6net.go b/vendor/github.com/sacloud/libsacloud/sacloud/ipv6net.go new file mode 100644 index 00000000..dc86cd59 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/ipv6net.go @@ -0,0 +1,18 @@ +package sacloud + +// IPv6Net IPv6ネットワーク(サブネット) +type IPv6Net struct { + *Resource // ID + propScope // スコープ + propServiceClass // サービスクラス + propCreatedAt // 作成日時 + + IPv6Prefix string `json:",omitempty"` // IPv6プレフィックス + IPv6PrefixLen int `json:",omitempty"` // IPv6プレフィックス長 + IPv6PrefixTail string `json:",omitempty"` // IPv6プレフィックス末尾 + IPv6Table *Resource `json:",omitempty"` // IPv6テーブル + NamedIPv6AddrCount int `json:",omitempty"` // 名前付きIPv6アドレス数 + ServiceID int64 `json:",omitempty"` // サービスID + Switch *Switch `json:",omitempty"` // 接続先スイッチ + +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/license.go b/vendor/github.com/sacloud/libsacloud/sacloud/license.go new file mode 100644 index 00000000..472422ae --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/license.go @@ -0,0 +1,27 @@ +package sacloud + +// License ライセンス +type License struct { + *Resource // ID + propName // 名称 + propDescription // 説明 + propCreatedAt // 作成日時 + propModifiedAt // 変更日時 + + LicenseInfo *ProductLicense `json:",omitempty"` // ライセンス情報 +} + +// GetLicenseInfo ライセンス情報 取得 +func (l *License) GetLicenseInfo() *ProductLicense { + return l.LicenseInfo +} + +// SetLicenseInfo ライセンス情報 設定 +func (l *License) SetLicenseInfo(license *ProductLicense) { + l.LicenseInfo = license +} + +// SetLicenseInfoByID ライセンス情報 設定 +func (l *License) SetLicenseInfoByID(id int64) { + l.LicenseInfo = &ProductLicense{Resource: NewResource(id)} +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/loadbalancer.go b/vendor/github.com/sacloud/libsacloud/sacloud/loadbalancer.go new file mode 100644 index 00000000..5401fe85 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/loadbalancer.go @@ -0,0 +1,181 @@ +package sacloud + +// LoadBalancer ロードバランサー +type LoadBalancer struct { + *Appliance // アプライアンス共通属性 + + Remark *LoadBalancerRemark `json:",omitempty"` // リマーク + Settings *LoadBalancerSettings `json:",omitempty"` // ロードバランサー設定 +} + +// LoadBalancerRemark リマーク +type LoadBalancerRemark struct { + *ApplianceRemarkBase + // TODO Zone + //Zone *Resource +} + +// LoadBalancerSettings ロードバランサー設定リスト +type LoadBalancerSettings struct { + LoadBalancer []*LoadBalancerSetting `json:",omitempty"` // ロードバランサー設定リスト +} + +// LoadBalancerSetting ロードバランサー仮想IP設定 +type LoadBalancerSetting struct { + VirtualIPAddress string `json:",omitempty"` // 仮想IPアドレス + Port string `json:",omitempty"` // ポート番号 + DelayLoop string `json:",omitempty"` // 監視間隔 + SorryServer string `json:",omitempty"` // ソーリーサーバー + Servers []*LoadBalancerServer `json:",omitempty"` // 仮想IP配下の実サーバー +} + +// LoadBalancerServer 仮想IP設定配下のサーバー +type LoadBalancerServer struct { + IPAddress string `json:",omitempty"` // IPアドレス + Port string `json:",omitempty"` // ポート番号 + HealthCheck *LoadBalancerHealthCheck `json:",omitempty"` // ヘルスチェック + Enabled string `json:",omitempty"` // 有効/無効 + Status string `json:",omitempty"` // ステータス + ActiveConn string `json:",omitempty"` // アクティブなコネクション +} + +// LoadBalancerHealthCheck ヘルスチェック +type LoadBalancerHealthCheck struct { + Protocol string `json:",omitempty"` // プロトコル + Path string `json:",omitempty"` // HTTP/HTTPSの場合のリクエストパス + Status string `json:",omitempty"` // HTTP/HTTPSの場合の期待するレスポンスコード +} + +// LoadBalancerPlan ロードバランサープラン +type LoadBalancerPlan int + +var ( + // LoadBalancerPlanStandard スタンダードプラン + LoadBalancerPlanStandard = LoadBalancerPlan(1) + // LoadBalancerPlanPremium プレミアムプラン + LoadBalancerPlanPremium = LoadBalancerPlan(2) +) + +// CreateLoadBalancerValue ロードバランサー作成用パラメーター +type CreateLoadBalancerValue struct { + SwitchID string // 接続先スイッチID + VRID int // VRID + Plan LoadBalancerPlan // プラン + IPAddress1 string // IPアドレス + MaskLen int // ネットワークマスク長 + DefaultRoute string // デフォルトルート + Name string // 名称 + Description string // 説明 + Tags []string // タグ + Icon *Resource // アイコン +} + +// CreateDoubleLoadBalancerValue ロードバランサー(冗長化あり)作成用パラメーター +type CreateDoubleLoadBalancerValue struct { + *CreateLoadBalancerValue + IPAddress2 string // IPアドレス2 +} + +// AllowLoadBalancerHealthCheckProtocol ロードバランサーでのヘルスチェック対応プロトコルリスト +func AllowLoadBalancerHealthCheckProtocol() []string { + return []string{"http", "https", "ping", "tcp"} +} + +// CreateNewLoadBalancerSingle ロードバランサー作成(冗長化なし) +func CreateNewLoadBalancerSingle(values *CreateLoadBalancerValue, settings []*LoadBalancerSetting) (*LoadBalancer, error) { + + lb := &LoadBalancer{ + Appliance: &Appliance{ + Class: "loadbalancer", + propName: propName{Name: values.Name}, + propDescription: propDescription{Description: values.Description}, + propTags: propTags{Tags: values.Tags}, + propPlanID: propPlanID{Plan: &Resource{ID: int64(values.Plan)}}, + propIcon: propIcon{ + &Icon{ + Resource: values.Icon, + }, + }, + }, + Remark: &LoadBalancerRemark{ + ApplianceRemarkBase: &ApplianceRemarkBase{ + Switch: &ApplianceRemarkSwitch{ + ID: values.SwitchID, + }, + VRRP: &ApplianceRemarkVRRP{ + VRID: values.VRID, + }, + Network: &ApplianceRemarkNetwork{ + NetworkMaskLen: values.MaskLen, + DefaultRoute: values.DefaultRoute, + }, + Servers: []interface{}{ + map[string]string{"IPAddress": values.IPAddress1}, + }, + }, + }, + } + + for _, s := range settings { + lb.AddLoadBalancerSetting(s) + } + + return lb, nil +} + +// CreateNewLoadBalancerDouble ロードバランサー(冗長化あり)作成 +func CreateNewLoadBalancerDouble(values *CreateDoubleLoadBalancerValue, settings []*LoadBalancerSetting) (*LoadBalancer, error) { + lb, err := CreateNewLoadBalancerSingle(values.CreateLoadBalancerValue, settings) + if err != nil { + return nil, err + } + lb.Remark.Servers = append(lb.Remark.Servers, map[string]string{"IPAddress": values.IPAddress2}) + return lb, nil +} + +// AddLoadBalancerSetting ロードバランサー仮想IP設定追加 +// +// ロードバランサー設定は仮想IPアドレス単位で保持しています。 +// 仮想IPを増やす場合にこのメソッドを利用します。 +func (l *LoadBalancer) AddLoadBalancerSetting(setting *LoadBalancerSetting) { + if l.Settings == nil { + l.Settings = &LoadBalancerSettings{} + } + if l.Settings.LoadBalancer == nil { + l.Settings.LoadBalancer = []*LoadBalancerSetting{} + } + l.Settings.LoadBalancer = append(l.Settings.LoadBalancer, setting) +} + +// DeleteLoadBalancerSetting ロードバランサー仮想IP設定の削除 +func (l *LoadBalancer) DeleteLoadBalancerSetting(vip string, port string) { + res := []*LoadBalancerSetting{} + for _, l := range l.Settings.LoadBalancer { + if l.VirtualIPAddress != vip || l.Port != port { + res = append(res, l) + } + } + + l.Settings.LoadBalancer = res +} + +// AddServer 仮想IP設定配下へ実サーバーを追加 +func (s *LoadBalancerSetting) AddServer(server *LoadBalancerServer) { + if s.Servers == nil { + s.Servers = []*LoadBalancerServer{} + } + s.Servers = append(s.Servers, server) +} + +// DeleteServer 仮想IP設定配下の実サーバーを削除 +func (s *LoadBalancerSetting) DeleteServer(ip string, port string) { + res := []*LoadBalancerServer{} + for _, server := range s.Servers { + if server.IPAddress != ip || server.Port != port { + res = append(res, server) + } + } + + s.Servers = res + +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/member.go b/vendor/github.com/sacloud/libsacloud/sacloud/member.go new file mode 100644 index 00000000..af6c540d --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/member.go @@ -0,0 +1,9 @@ +package sacloud + +// Member 会員情報 +type Member struct { + Class string `json:",omitempty"` // クラス + Code string `json:",omitempty"` // 会員コード + + // Errors [unknown type] `json:",omitempty"` +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/mobile_gateway.go b/vendor/github.com/sacloud/libsacloud/sacloud/mobile_gateway.go new file mode 100644 index 00000000..d954f71e --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/mobile_gateway.go @@ -0,0 +1,162 @@ +package sacloud + +import ( + "encoding/json" + "strings" +) + +// MobileGateway モバイルゲートウェイ +type MobileGateway struct { + *Appliance // アプライアンス共通属性 + + Remark *MobileGatewayRemark `json:",omitempty"` // リマーク + Settings *MobileGatewaySettings `json:",omitempty"` // モバイルゲートウェイ設定 +} + +// MobileGatewayRemark リマーク +type MobileGatewayRemark struct { + *ApplianceRemarkBase + // TODO Zone + //Zone *Resource +} + +// MobileGatewaySettings モバイルゲートウェイ設定 +type MobileGatewaySettings struct { + MobileGateway *MobileGatewaySetting `json:",omitempty"` // モバイルゲートウェイ設定リスト +} + +// MobileGatewaySetting モバイルゲートウェイ設定 +type MobileGatewaySetting struct { + InternetConnection *MGWInternetConnection `json:",omitempty"` // インターネット接続 + Interfaces []*MGWInterface `json:",omitempty"` // インターフェース + StaticRoutes []*MGWStaticRoute `json:",omitempty"` // スタティックルート +} + +// MGWInternetConnection インターネット接続 +type MGWInternetConnection struct { + Enabled string `json:",omitempty"` +} + +// MGWInterface インターフェース +type MGWInterface struct { + IPAddress []string `json:",omitempty"` + NetworkMaskLen int `json:",omitempty"` +} + +// MGWStaticRoute スタティックルート +type MGWStaticRoute struct { + Prefix string `json:",omitempty"` + NextHop string `json:",omitempty"` +} + +// MobileGatewayPlan モバイルゲートウェイプラン +type MobileGatewayPlan int + +var ( + // MobileGatewayPlanStandard スタンダードプラン // TODO 正式名称不明なため暫定の名前 + MobileGatewayPlanStandard = MobileGatewayPlan(1) +) + +// CreateMobileGatewayValue モバイルゲートウェイ作成用パラメーター +type CreateMobileGatewayValue struct { + Name string // 名称 + Description string // 説明 + Tags []string // タグ + IconID int64 // アイコン +} + +// CreateNewMobileGateway モバイルゲートウェイ作成 +func CreateNewMobileGateway(values *CreateMobileGatewayValue, setting *MobileGatewaySetting) (*MobileGateway, error) { + + lb := &MobileGateway{ + Appliance: &Appliance{ + Class: "mobilegateway", + propName: propName{Name: values.Name}, + propDescription: propDescription{Description: values.Description}, + propTags: propTags{Tags: values.Tags}, + propPlanID: propPlanID{Plan: &Resource{ID: int64(MobileGatewayPlanStandard)}}, + propIcon: propIcon{ + &Icon{ + Resource: NewResource(values.IconID), + }, + }, + }, + Remark: &MobileGatewayRemark{ + ApplianceRemarkBase: &ApplianceRemarkBase{ + Switch: &ApplianceRemarkSwitch{ + propScope: propScope{ + Scope: "shared", + }, + }, + Servers: []interface{}{ + nil, + }, + }, + }, + Settings: &MobileGatewaySettings{ + MobileGateway: setting, + }, + } + + return lb, nil +} + +// SetPrivateInterface プライベート側NICの接続 +func (m *MobileGateway) SetPrivateInterface(ip string, nwMaskLen int) { + if len(m.Settings.MobileGateway.Interfaces) > 1 { + m.Settings.MobileGateway.Interfaces[1].IPAddress = []string{ip} + m.Settings.MobileGateway.Interfaces[1].NetworkMaskLen = nwMaskLen + } else { + nic := &MGWInterface{ + IPAddress: []string{ip}, + NetworkMaskLen: nwMaskLen, + } + m.Settings.MobileGateway.Interfaces = append(m.Settings.MobileGateway.Interfaces, nic) + } +} + +// ClearPrivateInterface プライベート側NICの切断 +func (m *MobileGateway) ClearPrivateInterface() { + m.Settings.MobileGateway.Interfaces = []*MGWInterface{nil} +} + +// NewMobileGatewayResolver DNS登録用パラメータ作成 +func NewMobileGatewayResolver(dns1, dns2 string) *MobileGatewayResolver { + return &MobileGatewayResolver{ + SimGroup: &MobileGatewaySIMGroup{ + DNS1: dns1, + DNS2: dns2, + }, + } +} + +// MobileGatewayResolver DNS登録用パラメータ +type MobileGatewayResolver struct { + SimGroup *MobileGatewaySIMGroup `json:"sim_group,omitempty"` +} + +// UnmarshalJSON JSONアンマーシャル(配列、オブジェクトが混在するためここで対応) +func (m *MobileGatewaySIMGroup) UnmarshalJSON(data []byte) error { + targetData := strings.Replace(strings.Replace(string(data), " ", "", -1), "\n", "", -1) + if targetData == `[]` { + return nil + } + + tmp := &struct { + DNS1 string `json:"dns_1,omitempty"` + DNS2 string `json:"dns_2,omitempty"` + }{} + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + m.DNS1 = tmp.DNS1 + m.DNS2 = tmp.DNS2 + return nil +} + +// MobileGatewaySIMGroup DNS登録用SIMグループ値 +type MobileGatewaySIMGroup struct { + DNS1 string `json:"dns_1,omitempty"` + DNS2 string `json:"dns_2,omitempty"` +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/monitor.go b/vendor/github.com/sacloud/libsacloud/sacloud/monitor.go new file mode 100644 index 00000000..f4ecc061 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/monitor.go @@ -0,0 +1,305 @@ +package sacloud + +import ( + "encoding/json" + "math" + "strings" + "time" +) + +// MonitorValue アクティビティモニター +type MonitorValue struct { + CPUTime *float64 `json:"CPU-TIME,omitempty"` // CPU時間 + Write *float64 `json:",omitempty"` // ディスク書き込み + Read *float64 `json:",omitempty"` // ディスク読み取り + Receive *float64 `json:",omitempty"` // パケット受信 + Send *float64 `json:",omitempty"` // パケット送信 + In *float64 `json:",omitempty"` // パケット受信 + Out *float64 `json:",omitempty"` // パケット送信 + TotalMemorySize *float64 `json:"Total-Memory-Size,omitempty"` // 総メモリサイズ + UsedMemorySize *float64 `json:"Used-Memory-Size,omitempty"` // 使用済みメモリサイズ + TotalDisk1Size *float64 `json:"Total-Disk1-Size,omitempty"` // 総ディスクサイズ + UsedDisk1Size *float64 `json:"Used-Disk1-Size,omitempty"` // 使用済みディスクサイズ + TotalDisk2Size *float64 `json:"Total-Disk2-Size,omitempty"` // 総ディスクサイズ + UsedDisk2Size *float64 `json:"Used-Disk2-Size,omitempty"` // 使用済みディスクサイズ + FreeDiskSize *float64 `json:"Free-Disk-Size,omitempty"` // 空きディスクサイズ(NFS) + ResponseTimeSec *float64 `json:"responsetimesec,omitempty"` // レスポンスタイム(シンプル監視) + UplinkBPS *float64 `json:"UplinkBps,omitempty"` // 上り方向トラフィック + DownlinkBPS *float64 `json:"DownlinkBps"` // 下り方向トラフィック +} + +// UnmarshalJSON JSONアンマーシャル(配列、オブジェクトが混在するためここで対応) +func (m *MonitorValue) UnmarshalJSON(data []byte) error { + targetData := strings.Replace(strings.Replace(string(data), " ", "", -1), "\n", "", -1) + if targetData == `[]` { + return nil + } + + tmp := &struct { + CPUTime *float64 `json:"CPU-TIME,omitempty"` + Write *float64 `json:",omitempty"` + Read *float64 `json:",omitempty"` + Receive *float64 `json:",omitempty"` + Send *float64 `json:",omitempty"` + In *float64 `json:",omitempty"` + Out *float64 `json:",omitempty"` + TotalMemorySize *float64 `json:"Total-Memory-Size,omitempty"` + UsedMemorySize *float64 `json:"Used-Memory-Size,omitempty"` + TotalDisk1Size *float64 `json:"Total-Disk1-Size,omitempty"` + UsedDisk1Size *float64 `json:"Used-Disk1-Size,omitempty"` + TotalDisk2Size *float64 `json:"Total-Disk2-Size,omitempty"` + UsedDisk2Size *float64 `json:"Used-Disk2-Size,omitempty"` + FreeDiskSize *float64 `json:"Free-Disk-Size,omitempty"` + ResponseTimeSec *float64 `json:"responsetimesec,omitempty"` + UplinkBPS *float64 `json:"UplinkBps,omitempty"` + DownlinkBPS *float64 `json:"DownlinkBps"` + }{} + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + m.CPUTime = tmp.CPUTime + m.Write = tmp.Write + m.Read = tmp.Read + m.Receive = tmp.Receive + m.Send = tmp.Send + m.In = tmp.In + m.Out = tmp.Out + m.TotalMemorySize = tmp.TotalMemorySize + m.UsedMemorySize = tmp.UsedMemorySize + m.TotalDisk1Size = tmp.TotalDisk1Size + m.UsedDisk1Size = tmp.UsedDisk1Size + m.TotalDisk2Size = tmp.TotalDisk2Size + m.UsedDisk2Size = tmp.UsedDisk2Size + m.FreeDiskSize = tmp.FreeDiskSize + m.ResponseTimeSec = tmp.ResponseTimeSec + m.UplinkBPS = tmp.UplinkBPS + m.DownlinkBPS = tmp.DownlinkBPS + + return nil +} + +// ResourceMonitorRequest アクティビティモニター取得リクエスト +type ResourceMonitorRequest struct { + Start *time.Time `json:",omitempty"` // 取得開始時間 + End *time.Time `json:",omitempty"` // 取得終了時間 +} + +// NewResourceMonitorRequest アクティビティモニター取得リクエスト作成 +func NewResourceMonitorRequest(start *time.Time, end *time.Time) *ResourceMonitorRequest { + res := &ResourceMonitorRequest{} + if start != nil { + t := start.Truncate(time.Second) + res.Start = &t + } + if end != nil { + t := end.Truncate(time.Second) + res.End = &t + } + return res +} + +// ResourceMonitorResponse アクティビティモニターレスポンス +type ResourceMonitorResponse struct { + Data *MonitorValues `json:",omitempty"` // メトリクス +} + +// MonitorSummaryData メトリクスサマリー +type MonitorSummaryData struct { + Max float64 // 最大値 + Min float64 // 最小値 + Avg float64 // 平均値 + Count float64 // データ個数 + +} + +// MonitorSummary アクティビティーモニター サマリー +type MonitorSummary struct { + CPU *MonitorSummaryData // CPU時間サマリー + Disk *struct { // ディスク利用サマリー + Write *MonitorSummaryData // ディスク書き込みサマリー + Read *MonitorSummaryData // ディスク読み取りサマリー + } + Interface *struct { // NIC送受信サマリー + Receive *MonitorSummaryData // 受信パケットサマリー + Send *MonitorSummaryData // 送信パケットサマリー + } +} + +// MonitorValues メトリクス リスト +type MonitorValues map[string]*MonitorValue + +// FlatMonitorValue フラット化したメトリクス +type FlatMonitorValue struct { + Time time.Time // 対象時刻 + Value float64 // 値 +} + +// Calc サマリー計算 +func (m *MonitorValues) Calc() *MonitorSummary { + + res := &MonitorSummary{} + res.CPU = m.calcBy(func(v *MonitorValue) *float64 { return v.CPUTime }) + res.Disk = &struct { + Write *MonitorSummaryData + Read *MonitorSummaryData + }{ + Write: m.calcBy(func(v *MonitorValue) *float64 { return v.Write }), + Read: m.calcBy(func(v *MonitorValue) *float64 { return v.Read }), + } + res.Interface = &struct { + Receive *MonitorSummaryData + Send *MonitorSummaryData + }{ + Receive: m.calcBy(func(v *MonitorValue) *float64 { return v.Receive }), + Send: m.calcBy(func(v *MonitorValue) *float64 { return v.Send }), + } + + return res +} + +func (m *MonitorValues) calcBy(f func(m *MonitorValue) *float64) *MonitorSummaryData { + res := &MonitorSummaryData{} + var sum float64 + for _, data := range map[string]*MonitorValue(*m) { + value := f(data) + if value != nil { + res.Count++ + res.Min = math.Min(res.Min, *value) + res.Max = math.Max(res.Max, *value) + sum += *value + } + } + if sum > 0 && res.Count > 0 { + res.Avg = sum / res.Count + } + + return res +} + +// FlattenCPUTimeValue フラット化 CPU時間 +func (m *MonitorValues) FlattenCPUTimeValue() ([]FlatMonitorValue, error) { + return m.flattenValue(func(v *MonitorValue) *float64 { return v.CPUTime }) +} + +// FlattenDiskWriteValue フラット化 ディスク書き込み +func (m *MonitorValues) FlattenDiskWriteValue() ([]FlatMonitorValue, error) { + return m.flattenValue(func(v *MonitorValue) *float64 { return v.Write }) +} + +// FlattenDiskReadValue フラット化 ディスク読み取り +func (m *MonitorValues) FlattenDiskReadValue() ([]FlatMonitorValue, error) { + return m.flattenValue(func(v *MonitorValue) *float64 { return v.Read }) +} + +// FlattenPacketSendValue フラット化 パケット送信 +func (m *MonitorValues) FlattenPacketSendValue() ([]FlatMonitorValue, error) { + return m.flattenValue(func(v *MonitorValue) *float64 { return v.Send }) +} + +// FlattenPacketReceiveValue フラット化 パケット受信 +func (m *MonitorValues) FlattenPacketReceiveValue() ([]FlatMonitorValue, error) { + return m.flattenValue(func(v *MonitorValue) *float64 { return v.Receive }) +} + +// FlattenInternetInValue フラット化 パケット受信 +func (m *MonitorValues) FlattenInternetInValue() ([]FlatMonitorValue, error) { + return m.flattenValue(func(v *MonitorValue) *float64 { return v.In }) +} + +// FlattenInternetOutValue フラット化 パケット送信 +func (m *MonitorValues) FlattenInternetOutValue() ([]FlatMonitorValue, error) { + return m.flattenValue(func(v *MonitorValue) *float64 { return v.Out }) +} + +// FlattenTotalMemorySizeValue フラット化 総メモリサイズ +func (m *MonitorValues) FlattenTotalMemorySizeValue() ([]FlatMonitorValue, error) { + return m.flattenValue(func(v *MonitorValue) *float64 { return v.TotalMemorySize }) +} + +// FlattenUsedMemorySizeValue フラット化 使用済みメモリサイズ +func (m *MonitorValues) FlattenUsedMemorySizeValue() ([]FlatMonitorValue, error) { + return m.flattenValue(func(v *MonitorValue) *float64 { return v.UsedMemorySize }) +} + +// FlattenTotalDisk1SizeValue フラット化 総ディスクサイズ +func (m *MonitorValues) FlattenTotalDisk1SizeValue() ([]FlatMonitorValue, error) { + return m.flattenValue(func(v *MonitorValue) *float64 { return v.TotalDisk1Size }) +} + +// FlattenUsedDisk1SizeValue フラット化 使用済みディスクサイズ +func (m *MonitorValues) FlattenUsedDisk1SizeValue() ([]FlatMonitorValue, error) { + return m.flattenValue(func(v *MonitorValue) *float64 { return v.UsedDisk1Size }) +} + +// FlattenTotalDisk2SizeValue フラット化 総ディスクサイズ +func (m *MonitorValues) FlattenTotalDisk2SizeValue() ([]FlatMonitorValue, error) { + return m.flattenValue(func(v *MonitorValue) *float64 { return v.TotalDisk2Size }) +} + +// FlattenUsedDisk2SizeValue フラット化 使用済みディスクサイズ +func (m *MonitorValues) FlattenUsedDisk2SizeValue() ([]FlatMonitorValue, error) { + return m.flattenValue(func(v *MonitorValue) *float64 { return v.UsedDisk2Size }) +} + +// FlattenFreeDiskSizeValue フラット化 空きディスクサイズ(NFS) +func (m *MonitorValues) FlattenFreeDiskSizeValue() ([]FlatMonitorValue, error) { + return m.flattenValue(func(v *MonitorValue) *float64 { return v.FreeDiskSize }) +} + +// FlattenResponseTimeSecValue フラット化 レスポンスタイム(シンプル監視) +func (m *MonitorValues) FlattenResponseTimeSecValue() ([]FlatMonitorValue, error) { + return m.flattenValue(func(v *MonitorValue) *float64 { return v.ResponseTimeSec }) +} + +// FlattenUplinkBPSValue フラット化 上り方向トラフィック(セキュアモバイルSIM) +func (m *MonitorValues) FlattenUplinkBPSValue() ([]FlatMonitorValue, error) { + return m.flattenValue(func(v *MonitorValue) *float64 { return v.UplinkBPS }) +} + +// FlattenDownlinkBPSValue フラット化 下り方向トライフィック(セキュアモバイルSIM) +func (m *MonitorValues) FlattenDownlinkBPSValue() ([]FlatMonitorValue, error) { + return m.flattenValue(func(v *MonitorValue) *float64 { return v.DownlinkBPS }) +} + +func (m *MonitorValues) flattenValue(f func(*MonitorValue) *float64) ([]FlatMonitorValue, error) { + var res []FlatMonitorValue + + for k, v := range map[string]*MonitorValue(*m) { + if f(v) == nil { + continue + } + time, err := time.Parse(time.RFC3339, k) // RFC3339 ≒ ISO8601 + if err != nil { + return res, err + } + res = append(res, FlatMonitorValue{ + // Time + Time: time, + // Value + Value: *f(v), + }) + } + return res, nil +} + +// HasValue 取得したアクティビティーモニターに有効値が含まれるか判定 +func (m *MonitorValue) HasValue() bool { + values := []*float64{ + m.CPUTime, + m.Read, m.Receive, + m.Send, m.Write, + m.In, m.Out, + m.TotalMemorySize, m.UsedMemorySize, + m.TotalDisk1Size, m.UsedDisk1Size, + m.TotalDisk2Size, m.UsedDisk2Size, + m.FreeDiskSize, m.ResponseTimeSec, + m.UplinkBPS, m.DownlinkBPS, + } + for _, v := range values { + if v != nil { + return true + } + } + return false +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/nfs.go b/vendor/github.com/sacloud/libsacloud/sacloud/nfs.go new file mode 100644 index 00000000..7d91a48e --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/nfs.go @@ -0,0 +1,110 @@ +package sacloud + +// NFS NFS +type NFS struct { + *Appliance // アプライアンス共通属性 + + Remark *NFSRemark `json:",omitempty"` // リマーク + Settings *NFSSettings `json:",omitempty"` // NFS設定 +} + +// NFSRemark リマーク +type NFSRemark struct { + *ApplianceRemarkBase + propPlanID + // TODO Zone + //Zone *Resource + //SourceAppliance *Resource // クローン元DB +} + +// NFSSettings NFS設定リスト +type NFSSettings struct { +} + +// NFSPlan NFSプラン +type NFSPlan int + +var ( + // NFSPlan100G 100Gプラン + NFSPlan100G = NFSPlan(100) + // NFSPlan500G 500Gプラン + NFSPlan500G = NFSPlan(500) + // NFSPlan1T 1T(1024GB)プラン + NFSPlan1T = NFSPlan(1024 * 1) + // NFSPlan2T 2T(2048GB)プラン + NFSPlan2T = NFSPlan(1024 * 2) + // NFSPlan4T 4T(4096GB)プラン + NFSPlan4T = NFSPlan(1024 * 4) +) + +// AllowNFSPlans 指定可能なNFSプラン +func AllowNFSPlans() []int { + return []int{ + int(NFSPlan100G), + int(NFSPlan500G), + int(NFSPlan1T), + int(NFSPlan2T), + int(NFSPlan4T), + } +} + +// CreateNFSValue NFS作成用パラメーター +type CreateNFSValue struct { + SwitchID string // 接続先スイッチID + Plan NFSPlan // プラン + IPAddress string // IPアドレス + MaskLen int // ネットワークマスク長 + DefaultRoute string // デフォルトルート + Name string // 名称 + Description string // 説明 + Tags []string // タグ + Icon *Resource // アイコン + SourceAppliance *Resource // クローン元NFS +} + +// NewCreateNFSValue NFS作成用パラメーター +func NewCreateNFSValue() *CreateNFSValue { + return &CreateNFSValue{ + Plan: NFSPlan100G, + } +} + +// NewNFS NFS作成(冗長化なし) +func NewNFS(values *CreateNFSValue) *NFS { + + if int(values.Plan) == 0 { + values.Plan = NFSPlan100G + } + + return &NFS{ + Appliance: &Appliance{ + Class: "nfs", + propName: propName{Name: values.Name}, + propDescription: propDescription{Description: values.Description}, + propTags: propTags{Tags: values.Tags}, + propPlanID: propPlanID{Plan: &Resource{ID: int64(values.Plan)}}, + propIcon: propIcon{ + &Icon{ + Resource: values.Icon, + }, + }, + }, + Remark: &NFSRemark{ + ApplianceRemarkBase: &ApplianceRemarkBase{ + Switch: &ApplianceRemarkSwitch{ + ID: values.SwitchID, + }, + Network: &ApplianceRemarkNetwork{ + NetworkMaskLen: values.MaskLen, + DefaultRoute: values.DefaultRoute, + }, + Servers: []interface{}{ + map[string]string{"IPAddress": values.IPAddress}, + }, + }, + propPlanID: propPlanID{Plan: &Resource{ID: int64(values.Plan)}}, + //SourceAppliance: values.SourceAppliance, + }, + } + +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/note.go b/vendor/github.com/sacloud/libsacloud/sacloud/note.go new file mode 100644 index 00000000..d50addba --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/note.go @@ -0,0 +1,16 @@ +package sacloud + +// Note スタートアップスクリプト +type Note struct { + *Resource // ID + propName // 名称 + propDescription // 説明 + propAvailability // 有功状態 + propScope // スコープ + propIcon // アイコン + propTags // タグ + propCreatedAt // 作成日時 + propModifiedAt // 変更日時 + propNoteClass // クラス + Content string // スクリプト本体 +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/ostype/archive_ostype.go b/vendor/github.com/sacloud/libsacloud/sacloud/ostype/archive_ostype.go new file mode 100644 index 00000000..a53fd1b2 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/ostype/archive_ostype.go @@ -0,0 +1,127 @@ +// Package ostype is define OS type of SakuraCloud public archive +package ostype + +//go:generate stringer -type=ArchiveOSTypes + +// ArchiveOSTypes パブリックアーカイブOS種別 +type ArchiveOSTypes int + +const ( + // CentOS OS種別:CentOS + CentOS ArchiveOSTypes = iota + // CentOS6 OS種別:CentOS6 + CentOS6 + // Ubuntu OS種別:Ubuntu + Ubuntu + // Debian OS種別:Debian + Debian + // VyOS OS種別:VyOS + VyOS + // CoreOS OS種別:CoreOS + CoreOS + // RancherOS OS種別:RancherOS + RancherOS + // Kusanagi OS種別:Kusanagi(CentOS) + Kusanagi + // SophosUTM OS種別:Sophos UTM + SophosUTM + // FreeBSD OS種別:FreeBSD + FreeBSD + // Windows2012 OS種別:Windows Server 2012 R2 Datacenter Edition + Windows2012 + // Windows2012RDS OS種別:Windows Server 2012 R2 for RDS + Windows2012RDS + // Windows2012RDSOffice OS種別:Windows Server 2012 R2 for RDS(Office) + Windows2012RDSOffice + // Windows2016 OS種別:Windows Server 2016 Datacenter Edition + Windows2016 + // Windows2016RDS OS種別:Windows Server 2016 RDS + Windows2016RDS + // Windows2016RDSOffice OS種別:Windows Server 2016 RDS(Office) + Windows2016RDSOffice + // Windows2016SQLServerWeb OS種別:Windows Server 2016 SQLServer(Web) + Windows2016SQLServerWeb + // Windows2016SQLServerStandard OS種別:Windows Server 2016 SQLServer(Standard) + Windows2016SQLServerStandard + // Windows2016SQLServerStandardAll OS種別:Windows Server 2016 SQLServer(Standard) + RDS + Office + Windows2016SQLServerStandardAll + // Custom OS種別:カスタム + Custom +) + +// OSTypeShortNames OSTypeとして利用できる文字列のリスト +var OSTypeShortNames = []string{ + "centos", "centos6", "ubuntu", "debian", "vyos", "coreos", + "rancheros", "kusanagi", "sophos-utm", "freebsd", + "windows2012", "windows2012-rds", "windows2012-rds-office", + "windows2016", "windows2016-rds", "windows2016-rds-office", + "windows2016-sql-web", "windows2016-sql-standard", "windows2016-sql-standard-all", +} + +// IsWindows Windowsか +func (o ArchiveOSTypes) IsWindows() bool { + switch o { + case Windows2012, Windows2012RDS, Windows2012RDSOffice, + Windows2016, Windows2016RDS, Windows2016RDSOffice, + Windows2016SQLServerWeb, Windows2016SQLServerStandard, Windows2016SQLServerStandardAll: + return true + default: + return false + } +} + +// IsSupportDiskEdit ディスクの修正機能をフルサポートしているか(Windowsは一部サポートのためfalseを返す) +func (o ArchiveOSTypes) IsSupportDiskEdit() bool { + switch o { + case CentOS, CentOS6, Ubuntu, Debian, VyOS, CoreOS, RancherOS, Kusanagi, FreeBSD: + return true + default: + return false + } +} + +// StrToOSType 文字列からArchiveOSTypesへの変換 +func StrToOSType(osType string) ArchiveOSTypes { + switch osType { + case "centos": + return CentOS + case "centos6": + return CentOS6 + case "ubuntu": + return Ubuntu + case "debian": + return Debian + case "vyos": + return VyOS + case "coreos": + return CoreOS + case "rancheros": + return RancherOS + case "kusanagi": + return Kusanagi + case "sophos-utm": + return SophosUTM + case "freebsd": + return FreeBSD + case "windows2012": + return Windows2012 + case "windows2012-rds": + return Windows2012RDS + case "windows2012-rds-office": + return Windows2012RDSOffice + case "windows2016": + return Windows2016 + case "windows2016-rds": + return Windows2016RDS + case "windows2016-rds-office": + return Windows2016RDSOffice + case "windows2016-sql-web": + return Windows2016SQLServerWeb + case "windows2016-sql-standard": + return Windows2016SQLServerStandard + case "windows2016-sql-standard-all": + return Windows2016SQLServerStandardAll + default: + return Custom + } +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/ostype/archiveostypes_string.go b/vendor/github.com/sacloud/libsacloud/sacloud/ostype/archiveostypes_string.go new file mode 100644 index 00000000..8f8e7db2 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/ostype/archiveostypes_string.go @@ -0,0 +1,16 @@ +// Code generated by "stringer -type=ArchiveOSTypes"; DO NOT EDIT + +package ostype + +import "fmt" + +const _ArchiveOSTypes_name = "CentOSCentOS6UbuntuDebianVyOSCoreOSRancherOSKusanagiSophosUTMFreeBSDWindows2012Windows2012RDSWindows2012RDSOfficeWindows2016Windows2016RDSWindows2016RDSOfficeWindows2016SQLServerWebWindows2016SQLServerStandardWindows2016SQLServerStandardAllCustom" + +var _ArchiveOSTypes_index = [...]uint8{0, 6, 13, 19, 25, 29, 35, 44, 52, 61, 68, 79, 93, 113, 124, 138, 158, 181, 209, 240, 246} + +func (i ArchiveOSTypes) String() string { + if i < 0 || i >= ArchiveOSTypes(len(_ArchiveOSTypes_index)-1) { + return fmt.Sprintf("ArchiveOSTypes(%d)", i) + } + return _ArchiveOSTypes_name[_ArchiveOSTypes_index[i]:_ArchiveOSTypes_index[i+1]] +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/packet_filter.go b/vendor/github.com/sacloud/libsacloud/sacloud/packet_filter.go new file mode 100644 index 00000000..7a32f558 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/packet_filter.go @@ -0,0 +1,248 @@ +package sacloud + +import ( + "crypto/md5" + "encoding/hex" + "fmt" +) + +// PacketFilter パケットフィルタ +type PacketFilter struct { + *Resource // ID + propName // 名称 + propDescription // 説明 + + Expression []*PacketFilterExpression // ルール + Notice string `json:",omitempty"` // Notice + + //HACK API呼び出しルートにより数字/文字列が混在する + // PackerFilterのCREATE時は文字列、以外は数値となる。現状利用しないためコメントとしておく + // RequiredHostVersion int `json:",omitempty"` + +} + +// AllowPacketFilterProtocol パケットフィルタが対応するプロトコルリスト +func AllowPacketFilterProtocol() []string { + return []string{"tcp", "udp", "icmp", "fragment", "ip"} +} + +// PacketFilterExpression フィルタリングルール +type PacketFilterExpression struct { + Protocol string `json:",omitempty"` // Protocol プロトコル + Action string `json:",omitempty"` // Action 許可/拒否 + + SourceNetwork string // SourceNetwork 送信元ネットワーク + SourcePort string // SourcePort 送信元ポート + DestinationPort string // DestinationPort 宛先ポート + + propDescription // 説明 +} + +// Hash 値からハッシュ値を生成 +func (e *PacketFilterExpression) Hash() string { + str := fmt.Sprintf("%v", e) + h := md5.New() + h.Write([]byte(str)) + return hex.EncodeToString(h.Sum(nil)) +} + +// CreateNewPacketFilter パケットフィルタ作成 +func CreateNewPacketFilter() *PacketFilter { + return &PacketFilter{ + // Expression + Expression: []*PacketFilterExpression{}, + } +} + +// ClearRules ルールのクリア +func (p *PacketFilter) ClearRules() { + p.Expression = []*PacketFilterExpression{} +} + +// FindByHash 指定のハッシュ値を持つPacketFilterExpressionを検索する +func (p *PacketFilter) FindByHash(hash string) *PacketFilterExpression { + + for _, e := range p.Expression { + h := e.Hash() + if h == hash { + return e + } + } + return nil +} + +// AddTCPRule TCPルール追加 +func (p *PacketFilter) AddTCPRule(sourceNetwork string, sourcePort string, destPort string, description string, isAllow bool) (*PacketFilterExpression, error) { + exp := p.createTCPRule(sourceNetwork, sourcePort, destPort, description, isAllow) + p.Expression = append(p.Expression, exp) + return exp, nil +} + +// AddTCPRuleAt TCPルール追加 +func (p *PacketFilter) AddTCPRuleAt(sourceNetwork string, sourcePort string, destPort string, description string, isAllow bool, index int) (*PacketFilterExpression, error) { + + exp := p.createTCPRule(sourceNetwork, sourcePort, destPort, description, isAllow) + p.addRuleAt(exp, index) + return exp, nil +} + +func (p *PacketFilter) createTCPRule(sourceNetwork string, sourcePort string, destPort string, description string, isAllow bool) *PacketFilterExpression { + + return &PacketFilterExpression{ + Protocol: "tcp", + SourceNetwork: sourceNetwork, + SourcePort: sourcePort, + DestinationPort: destPort, + Action: p.getActionString(isAllow), + propDescription: propDescription{Description: description}, + } +} + +// AddUDPRule UDPルール追加 +func (p *PacketFilter) AddUDPRule(sourceNetwork string, sourcePort string, destPort string, description string, isAllow bool) (*PacketFilterExpression, error) { + exp := p.createUDPRule(sourceNetwork, sourcePort, destPort, description, isAllow) + p.Expression = append(p.Expression, exp) + return exp, nil +} + +// AddUDPRuleAt UDPルール追加 +func (p *PacketFilter) AddUDPRuleAt(sourceNetwork string, sourcePort string, destPort string, description string, isAllow bool, index int) (*PacketFilterExpression, error) { + exp := p.createUDPRule(sourceNetwork, sourcePort, destPort, description, isAllow) + p.addRuleAt(exp, index) + return exp, nil +} + +func (p *PacketFilter) createUDPRule(sourceNetwork string, sourcePort string, destPort string, description string, isAllow bool) *PacketFilterExpression { + + return &PacketFilterExpression{ + Protocol: "udp", + SourceNetwork: sourceNetwork, + SourcePort: sourcePort, + DestinationPort: destPort, + Action: p.getActionString(isAllow), + propDescription: propDescription{Description: description}, + } +} + +// AddICMPRule ICMPルール追加 +func (p *PacketFilter) AddICMPRule(sourceNetwork string, description string, isAllow bool) (*PacketFilterExpression, error) { + + exp := p.createICMPRule(sourceNetwork, description, isAllow) + p.Expression = append(p.Expression, exp) + return exp, nil +} + +// AddICMPRuleAt ICMPルール追加 +func (p *PacketFilter) AddICMPRuleAt(sourceNetwork string, description string, isAllow bool, index int) (*PacketFilterExpression, error) { + + exp := p.createICMPRule(sourceNetwork, description, isAllow) + p.addRuleAt(exp, index) + return exp, nil +} + +func (p *PacketFilter) createICMPRule(sourceNetwork string, description string, isAllow bool) *PacketFilterExpression { + + return &PacketFilterExpression{ + Protocol: "icmp", + SourceNetwork: sourceNetwork, + Action: p.getActionString(isAllow), + propDescription: propDescription{Description: description}, + } +} + +// AddFragmentRule フラグメントルール追加 +func (p *PacketFilter) AddFragmentRule(sourceNetwork string, description string, isAllow bool) (*PacketFilterExpression, error) { + + exp := p.createFragmentRule(sourceNetwork, description, isAllow) + p.Expression = append(p.Expression, exp) + return exp, nil +} + +// AddFragmentRuleAt フラグメントルール追加 +func (p *PacketFilter) AddFragmentRuleAt(sourceNetwork string, description string, isAllow bool, index int) (*PacketFilterExpression, error) { + + exp := p.createFragmentRule(sourceNetwork, description, isAllow) + p.addRuleAt(exp, index) + return exp, nil +} + +func (p *PacketFilter) createFragmentRule(sourceNetwork string, description string, isAllow bool) *PacketFilterExpression { + + return &PacketFilterExpression{ + Protocol: "fragment", + SourceNetwork: sourceNetwork, + Action: p.getActionString(isAllow), + propDescription: propDescription{Description: description}, + } +} + +// AddIPRule IPルール追加 +func (p *PacketFilter) AddIPRule(sourceNetwork string, description string, isAllow bool) (*PacketFilterExpression, error) { + + exp := p.createIPRule(sourceNetwork, description, isAllow) + p.Expression = append(p.Expression, exp) + return exp, nil +} + +// AddIPRuleAt IPルール追加 +func (p *PacketFilter) AddIPRuleAt(sourceNetwork string, description string, isAllow bool, index int) (*PacketFilterExpression, error) { + + exp := p.createIPRule(sourceNetwork, description, isAllow) + p.addRuleAt(exp, index) + return exp, nil +} + +func (p *PacketFilter) createIPRule(sourceNetwork string, description string, isAllow bool) *PacketFilterExpression { + + return &PacketFilterExpression{ + Protocol: "ip", + SourceNetwork: sourceNetwork, + Action: p.getActionString(isAllow), + propDescription: propDescription{Description: description}, + } + +} + +// RemoveRuleAt 指定インデックス(0開始)位置のルールを除去 +func (p *PacketFilter) RemoveRuleAt(index int) { + if index >= 0 && index < len(p.Expression) { + p.Expression = append(p.Expression[:index], p.Expression[index+1:]...) + } +} + +// RemoveRuleByHash 指定のハッシュ値を持つルールを削除する +func (p *PacketFilter) RemoveRuleByHash(hash string) { + dest := []*PacketFilterExpression{} + for _, e := range p.Expression { + if hash != e.Hash() { + dest = append(dest, e) + } + } + p.Expression = dest +} + +func (p *PacketFilter) addRuleAt(rule *PacketFilterExpression, index int) { + if len(p.Expression) == 0 && index == 0 { + p.Expression = []*PacketFilterExpression{rule} + return + } + + if !(index < len(p.Expression)) { + index = len(p.Expression) + } + + // Grow the slice by one element. + p.Expression = append(p.Expression, nil) + // Use copy to move the upper part of the slice out of the way and open a hole. + copy(p.Expression[index+1:], p.Expression[index:]) + // Store the new value. + p.Expression[index] = rule +} + +func (p PacketFilter) getActionString(isAllow bool) string { + action := "deny" + if isAllow { + action = "allow" + } + return action +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/private_host.go b/vendor/github.com/sacloud/libsacloud/sacloud/private_host.go new file mode 100644 index 00000000..ff2487ee --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/private_host.go @@ -0,0 +1,18 @@ +package sacloud + +// PrivateHost 専有ホスト +type PrivateHost struct { + *Resource // ID + propName // 名称 + propDescription // 説明 + + propPrivateHostPlan // 専有ホストプラン + propHost // ホスト(物理) + propAssignedCPU // 割当済みCPUコア数 + propAssignedMemoryMB // 割当済みメモリ(MB) + + propIcon // アイコン + propTags // タグ + propCreatedAt // 作成日時 + +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/product_disk.go b/vendor/github.com/sacloud/libsacloud/sacloud/product_disk.go new file mode 100644 index 00000000..a52cff8e --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/product_disk.go @@ -0,0 +1,20 @@ +package sacloud + +// ProductDisk ディスクプラン +type ProductDisk struct { + *Resource // ID + propName // 名称 + propDescription // 説明 + propStorageClass // ストレージクラス + propAvailability // 有功状態 + + Size []struct { // サイズ + propAvailability // 有功状態 + propSizeMB // サイズ(MB単位) + propServiceClass // サービスクラス + + DisplaySize int `json:",omitempty"` // 表示サイズ + DisplaySuffix string `json:",omitempty"` // 表示サフィックス + + } `json:",omitempty"` +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/product_internet.go b/vendor/github.com/sacloud/libsacloud/sacloud/product_internet.go new file mode 100644 index 00000000..cf87d881 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/product_internet.go @@ -0,0 +1,12 @@ +package sacloud + +// ProductInternet ルータープラン +type ProductInternet struct { + *Resource // ID + propName // 名称 + propAvailability // 有功状態 + propServiceClass // サービスクラス + + BandWidthMbps int `json:",omitempty"` // 帯域幅 + +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/product_license.go b/vendor/github.com/sacloud/libsacloud/sacloud/product_license.go new file mode 100644 index 00000000..1a0a52ad --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/product_license.go @@ -0,0 +1,11 @@ +package sacloud + +// ProductLicense ライセンスプラン +type ProductLicense struct { + *Resource // ID + propName // 名称 + propServiceClass // サービスクラス + propCreatedAt // 作成日時 + propModifiedAt // 変更日時 + TermsOfUse string `json:",omitempty"` // 利用規約 +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/product_privatehost.go b/vendor/github.com/sacloud/libsacloud/sacloud/product_privatehost.go new file mode 100644 index 00000000..a08ce56a --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/product_privatehost.go @@ -0,0 +1,13 @@ +package sacloud + +// ProductPrivateHost 専有ホストプラン +type ProductPrivateHost struct { + *Resource // ID + propName // 名称 + propDescription // 説明 + propAvailability // 有功状態 + propCPU // CPUコア数 + propMemoryMB // メモリサイズ(MB単位) + propClass // クラス + propServiceClass // サービスクラス +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/product_server.go b/vendor/github.com/sacloud/libsacloud/sacloud/product_server.go new file mode 100644 index 00000000..9427ec0d --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/product_server.go @@ -0,0 +1,12 @@ +package sacloud + +// ProductServer サーバープラン +type ProductServer struct { + *Resource // ID + propName // 名称 + propDescription // 説明 + propAvailability // 有功状態 + propCPU // CPUコア数 + propMemoryMB // メモリサイズ(MB単位) + propServiceClass // サービスクラス +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/prop_assigned_cpu.go b/vendor/github.com/sacloud/libsacloud/sacloud/prop_assigned_cpu.go new file mode 100644 index 00000000..3f528fda --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/prop_assigned_cpu.go @@ -0,0 +1,11 @@ +package sacloud + +// propAssignedCPU CPUコア数内包型 +type propAssignedCPU struct { + AssignedCPU int `json:",omitempty"` // CPUコア数 +} + +// GetAssignedCPU CPUコア数 取得 +func (p *propAssignedCPU) GetAssignedCPU() int { + return p.AssignedCPU +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/prop_assigned_memory.go b/vendor/github.com/sacloud/libsacloud/sacloud/prop_assigned_memory.go new file mode 100644 index 00000000..796fbcf4 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/prop_assigned_memory.go @@ -0,0 +1,19 @@ +package sacloud + +// propAssignedMemoryMB サイズ(MB)内包型 +type propAssignedMemoryMB struct { + AssignedMemoryMB int `json:",omitempty"` // サイズ(MB単位) +} + +// GetAssignedMemoryMB サイズ(MB単位) 取得 +func (p *propAssignedMemoryMB) GetAssignedMemoryMB() int { + return p.AssignedMemoryMB +} + +// GetAssignedMemoryGB サイズ(GB単位) 取得 +func (p *propAssignedMemoryMB) GetAssignedMemoryGB() int { + if p.AssignedMemoryMB <= 0 { + return 0 + } + return p.AssignedMemoryMB / 1024 +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/prop_availability.go b/vendor/github.com/sacloud/libsacloud/sacloud/prop_availability.go new file mode 100644 index 00000000..2380a76c --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/prop_availability.go @@ -0,0 +1,26 @@ +package sacloud + +// propAvailability 有効状態内包型 +type propAvailability struct { + Availability EAvailability `json:",omitempty"` // 有効状態 +} + +// IsAvailable 有効状態が"有効"か判定 +func (p *propAvailability) IsAvailable() bool { + return p.Availability.IsAvailable() +} + +// IsUploading 有効状態が"アップロード中"か判定 +func (p *propAvailability) IsUploading() bool { + return p.Availability.IsUploading() +} + +// IsFailed 有効状態が"失敗"か判定 +func (p *propAvailability) IsFailed() bool { + return p.Availability.IsFailed() +} + +// IsMigrating 有効状態が"マイグレーション中"か判定 +func (p *propAvailability) IsMigrating() bool { + return p.Availability.IsMigrating() +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/prop_bundle_info.go b/vendor/github.com/sacloud/libsacloud/sacloud/prop_bundle_info.go new file mode 100644 index 00000000..0ff047f7 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/prop_bundle_info.go @@ -0,0 +1,27 @@ +package sacloud + +import "strings" + +// BundleInfo バンドル情報 +type BundleInfo struct { + HostClass string `json:",omitempty"` + ServiceClass string `json:",omitempty"` +} + +// propBundleInfo バンドル情報内包型 +type propBundleInfo struct { + BundleInfo *BundleInfo `json:",omitempty"` // バンドル情報 +} + +// GetBundleInfo バンドル情報 取得 +func (p *propBundleInfo) GetBundleInfo() *BundleInfo { + return p.BundleInfo +} + +func (p *propBundleInfo) IsSophosUTM() bool { + // SophosUTMであれば編集不可 + if p.BundleInfo != nil && strings.Contains(strings.ToLower(p.BundleInfo.ServiceClass), "sophosutm") { + return true + } + return false +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/prop_class.go b/vendor/github.com/sacloud/libsacloud/sacloud/prop_class.go new file mode 100644 index 00000000..ac1f0997 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/prop_class.go @@ -0,0 +1,11 @@ +package sacloud + +// propClass クラス内包型 +type propClass struct { + Class string `json:",omitempty"` // サービスクラス +} + +// GetClass クラス 取得 +func (p *propClass) GetClass() string { + return p.Class +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/prop_connected_switches.go b/vendor/github.com/sacloud/libsacloud/sacloud/prop_connected_switches.go new file mode 100644 index 00000000..40675841 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/prop_connected_switches.go @@ -0,0 +1,45 @@ +package sacloud + +// propConnectedSwitches 接続先スイッチ内包型 +type propConnectedSwitches struct { + ConnectedSwitches []interface{} `json:",omitempty" libsacloud:"requestOnly"` // サーバー作成時の接続先スイッチ指定用パラメーター +} + +// GetConnectedSwitches 接続先スイッチ 取得 +func (p *propConnectedSwitches) GetConnectedSwitches() []interface{} { + return p.ConnectedSwitches +} + +// SetConnectedSwitches 接続先スイッチ 設定 +func (p *propConnectedSwitches) SetConnectedSwitches(switches []interface{}) { + p.ConnectedSwitches = switches +} + +// ClearConnectedSwitches 接続先スイッチ指定パラメータークリア +func (p *propConnectedSwitches) ClearConnectedSwitches() { + p.ConnectedSwitches = []interface{}{} +} + +// AddPublicNWConnectedParam 共有セグメントへ接続したNIC追加 +func (p *propConnectedSwitches) AddPublicNWConnectedParam() { + if p.ConnectedSwitches == nil { + p.ClearConnectedSwitches() + } + p.ConnectedSwitches = append(p.ConnectedSwitches, map[string]interface{}{"Scope": "shared"}) +} + +// AddExistsSwitchConnectedParam スイッチへ接続したNIC追加 +func (p *propConnectedSwitches) AddExistsSwitchConnectedParam(switchID string) { + if p.ConnectedSwitches == nil { + p.ClearConnectedSwitches() + } + p.ConnectedSwitches = append(p.ConnectedSwitches, map[string]interface{}{"ID": switchID}) +} + +// AddEmptyConnectedParam 未接続なNIC追加 +func (p *propConnectedSwitches) AddEmptyConnectedParam() { + if p.ConnectedSwitches == nil { + p.ClearConnectedSwitches() + } + p.ConnectedSwitches = append(p.ConnectedSwitches, nil) +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/prop_copy_source.go b/vendor/github.com/sacloud/libsacloud/sacloud/prop_copy_source.go new file mode 100644 index 00000000..bc4dfabb --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/prop_copy_source.go @@ -0,0 +1,56 @@ +package sacloud + +// propCopySource コピー元情報内包型 +type propCopySource struct { + SourceDisk *Disk `json:",omitempty"` // コピー元ディスク + SourceArchive *Archive `json:",omitempty"` // コピー元アーカイブ + +} + +// SetSourceArchive ソースアーカイブ設定 +func (p *propCopySource) SetSourceArchive(sourceID int64) { + if sourceID == EmptyID { + return + } + p.SourceArchive = &Archive{ + Resource: &Resource{ID: sourceID}, + } + p.SourceDisk = nil +} + +// SetSourceDisk ソースディスク設定 +func (p *propCopySource) SetSourceDisk(sourceID int64) { + if sourceID == EmptyID { + return + } + p.SourceDisk = &Disk{ + Resource: &Resource{ID: sourceID}, + } + p.SourceArchive = nil +} + +// GetSourceArchive ソースアーカイブ取得 +func (p *propCopySource) GetSourceArchive() *Archive { + return p.SourceArchive +} + +// GetSourceDisk ソースディスク取得 +func (p *propCopySource) GetSourceDisk() *Disk { + return p.SourceDisk +} + +// GetSourceArchiveID ソースアーカイブID取得 +func (p *propCopySource) GetSourceArchiveID() int64 { + if p.SourceArchive != nil { + return p.SourceArchive.GetID() + } + return EmptyID +} + +// GetSourceDiskID ソースディスクID取得 +func (p *propCopySource) GetSourceDiskID() int64 { + if p.SourceDisk != nil { + return p.SourceDisk.GetID() + } + return EmptyID +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/prop_cpu.go b/vendor/github.com/sacloud/libsacloud/sacloud/prop_cpu.go new file mode 100644 index 00000000..2b1d5b46 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/prop_cpu.go @@ -0,0 +1,11 @@ +package sacloud + +// propCPU CPUコア数内包型 +type propCPU struct { + CPU int `json:",omitempty"` // CPUコア数 +} + +// GetCPU CPUコア数 取得 +func (p *propCPU) GetCPU() int { + return p.CPU +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/prop_description.go b/vendor/github.com/sacloud/libsacloud/sacloud/prop_description.go new file mode 100644 index 00000000..75556990 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/prop_description.go @@ -0,0 +1,16 @@ +package sacloud + +// propDescription 説明内包型 +type propDescription struct { + Description string // 説明 +} + +// GetDescription 説明 取得 +func (p *propDescription) GetDescription() string { + return p.Description +} + +// SetDescription 説明 設定 +func (p *propDescription) SetDescription(desc string) { + p.Description = desc +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/prop_disk_connection.go b/vendor/github.com/sacloud/libsacloud/sacloud/prop_disk_connection.go new file mode 100644 index 00000000..efd55339 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/prop_disk_connection.go @@ -0,0 +1,33 @@ +package sacloud + +// propDiskConnection ディスク接続情報内包型 +type propDiskConnection struct { + Connection EDiskConnection `json:",omitempty"` // ディスク接続方法 + ConnectionOrder int `json:",omitempty"` // コネクション順序 + +} + +// GetDiskConnection ディスク接続方法 取得 +func (p *propDiskConnection) GetDiskConnection() EDiskConnection { + return p.Connection +} + +// SetDiskConnection ディスク接続方法 設定 +func (p *propDiskConnection) SetDiskConnection(conn EDiskConnection) { + p.Connection = conn +} + +// GetDiskConnectionByStr ディスク接続方法 取得 +func (p *propDiskConnection) GetDiskConnectionByStr() string { + return string(p.Connection) +} + +// SetDiskConnectionByStr ディスク接続方法 設定 +func (p *propDiskConnection) SetDiskConnectionByStr(conn string) { + p.Connection = EDiskConnection(conn) +} + +// GetDiskConnectionOrder コネクション順序 取得 +func (p *propDiskConnection) GetDiskConnectionOrder() int { + return p.ConnectionOrder +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/prop_disk_size.go b/vendor/github.com/sacloud/libsacloud/sacloud/prop_disk_size.go new file mode 100644 index 00000000..d5f77c03 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/prop_disk_size.go @@ -0,0 +1,65 @@ +package sacloud + +// propSizeMB サイズ(MB)内包型 +type propSizeMB struct { + SizeMB int `json:",omitempty"` // サイズ(MB単位) +} + +// GetSizeMB サイズ(MB単位) 取得 +func (p *propSizeMB) GetSizeMB() int { + return p.SizeMB +} + +// SetSizeMB サイズ(MB単位) 設定 +func (p *propSizeMB) SetSizeMB(size int) { + p.SizeMB = size +} + +// GetSizeGB サイズ(GB単位) 取得 +func (p *propSizeMB) GetSizeGB() int { + if p.SizeMB <= 0 { + return 0 + } + return p.SizeMB / 1024 +} + +// SetSizeGB サイズ(GB単位) 設定 +func (p *propSizeMB) SetSizeGB(size int) { + if size <= 0 { + p.SizeMB = 0 + } else { + p.SizeMB = size * 1024 + } +} + +// propMigratedMB コピー済みデータサイズ(MB単位)内包型 +type propMigratedMB struct { + MigratedMB int `json:",omitempty"` // コピー済みデータサイズ(MB単位) +} + +// GetMigratedMB サイズ(MB単位) 取得 +func (p *propMigratedMB) GetMigratedMB() int { + return p.MigratedMB +} + +// SetMigratedMB サイズ(MB単位) 設定 +func (p *propMigratedMB) SetMigratedMB(size int) { + p.MigratedMB = size +} + +// GetMigratedGB サイズ(GB単位) 取得 +func (p *propMigratedMB) GetMigratedGB() int { + if p.MigratedMB <= 0 { + return 0 + } + return p.MigratedMB / 1024 +} + +// SetMigratedGB サイズ(GB単位) 設定 +func (p *propMigratedMB) SetMigratedGB(size int) { + if size <= 0 { + p.MigratedMB = 0 + } else { + p.MigratedMB = size * 1024 + } +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/prop_disks.go b/vendor/github.com/sacloud/libsacloud/sacloud/prop_disks.go new file mode 100644 index 00000000..4e57433d --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/prop_disks.go @@ -0,0 +1,22 @@ +package sacloud + +// propDisks ディスク配列内包型 +type propDisks struct { + Disks []Disk `json:",omitempty"` // ディスク +} + +// GetDisks ディスク配列 取得 +func (p *propDisks) GetDisks() []Disk { + return p.Disks +} + +// GetDiskIDs ディスクID配列を返す +func (p *propDisks) GetDiskIDs() []int64 { + + ids := []int64{} + for _, disk := range p.Disks { + ids = append(ids, disk.ID) + } + return ids + +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/prop_distant_from.go b/vendor/github.com/sacloud/libsacloud/sacloud/prop_distant_from.go new file mode 100644 index 00000000..084a9437 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/prop_distant_from.go @@ -0,0 +1,26 @@ +package sacloud + +// propDistantFrom ストレージ隔離対象ディスク内包型 +type propDistantFrom struct { + DistantFrom []int64 `json:",omitempty"` // ストレージ隔離対象ディスク +} + +// GetDistantFrom ストレージ隔離対象ディスク 取得 +func (p *propDistantFrom) GetDistantFrom() []int64 { + return p.DistantFrom +} + +// SetDistantFrom ストレージ隔離対象ディスク 設定 +func (p *propDistantFrom) SetDistantFrom(ids []int64) { + p.DistantFrom = ids +} + +// AddDistantFrom ストレージ隔離対象ディスク 追加 +func (p *propDistantFrom) AddDistantFrom(id int64) { + p.DistantFrom = append(p.DistantFrom, id) +} + +// ClearDistantFrom ストレージ隔離対象ディスク クリア +func (p *propDistantFrom) ClearDistantFrom() { + p.DistantFrom = []int64{} +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/prop_host.go b/vendor/github.com/sacloud/libsacloud/sacloud/prop_host.go new file mode 100644 index 00000000..092023ab --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/prop_host.go @@ -0,0 +1,19 @@ +package sacloud + +// propHost ホスト(物理)内包型 +type propHost struct { + Host *Host `json:",omitempty"` // サービスクラス +} + +// GetHost ホスト(物理) 取得 +func (p *propHost) GetHost() *Host { + return p.Host +} + +// GetHostName ホスト(物理)名称取得 +func (p *propHost) GetHostName() string { + if p.Host == nil { + return "" + } + return p.Host.GetName() +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/prop_host_name.go b/vendor/github.com/sacloud/libsacloud/sacloud/prop_host_name.go new file mode 100644 index 00000000..7e7291c6 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/prop_host_name.go @@ -0,0 +1,11 @@ +package sacloud + +// propHostName ホスト名内包型 +type propHostName struct { + HostName string `json:",omitempty"` // ホスト名 (ディスクの修正実施時に指定した初期ホスト名) +} + +// GetHostName (初期)ホスト名 取得 +func (p *propHostName) GetHostName() string { + return p.HostName +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/prop_icon.go b/vendor/github.com/sacloud/libsacloud/sacloud/prop_icon.go new file mode 100644 index 00000000..7a489bc8 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/prop_icon.go @@ -0,0 +1,47 @@ +package sacloud + +// propIcon アイコン内包型 +type propIcon struct { + Icon *Icon // アイコン +} + +// GetIcon アイコンを取得 +func (p *propIcon) GetIcon() *Icon { + return p.Icon +} + +// GetIconID アイコンIDを取得 +func (p *propIcon) GetIconID() int64 { + if p.HasIcon() { + return p.Icon.GetID() + } + return -1 +} + +// GetIconStrID アイコンID(文字列)を取得 +func (p *propIcon) GetIconStrID() string { + if p.HasIcon() { + return p.Icon.GetStrID() + } + return "" +} + +// HasIcon アイコンがセットされているか +func (p *propIcon) HasIcon() bool { + return p.Icon != nil +} + +// SetIconByID 指定のアイコンIDを設定 +func (p *propIcon) SetIconByID(id int64) { + p.Icon = &Icon{Resource: NewResource(id)} +} + +// SetIcon 指定のアイコンオブジェクトを設定 +func (p *propIcon) SetIcon(icon *Icon) { + p.Icon = icon +} + +// ClearIcon アイコンをクリア(空IDを持つアイコンオブジェクトをセット) +func (p *propIcon) ClearIcon() { + p.Icon = &Icon{Resource: NewResource(EmptyID)} +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/prop_instance.go b/vendor/github.com/sacloud/libsacloud/sacloud/prop_instance.go new file mode 100644 index 00000000..ba4fda6d --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/prop_instance.go @@ -0,0 +1,59 @@ +package sacloud + +// propInstance インスタンス内包型 +type propInstance struct { + Instance *Instance `json:",omitempty"` // インスタンス +} + +// GetInstance インスタンス 取得 +func (p *propInstance) GetInstance() *Instance { + return p.Instance +} + +// IsUp インスタンスが起動しているか判定 +func (p *propInstance) IsUp() bool { + if p.Instance == nil { + return false + } + return p.Instance.IsUp() +} + +// IsDown インスタンスがダウンしているか確認 +func (p *propInstance) IsDown() bool { + if p.Instance == nil { + return false + } + return p.Instance.IsDown() +} + +// GetInstanceStatus ステータス 取得 +func (p *propInstance) GetInstanceStatus() string { + if p.Instance == nil { + return "" + } + return p.Instance.GetStatus() +} + +// GetInstanceBeforeStatus 以前のステータス 取得 +func (p *propInstance) GetInstanceBeforeStatus() string { + if p.Instance == nil { + return "" + } + return p.Instance.GetBeforeStatus() +} + +// MaintenanceScheduled メンテナンス予定の有無 +func (p *propInstance) MaintenanceScheduled() bool { + if p.Instance == nil { + return false + } + return p.Instance.MaintenanceScheduled() +} + +// GetMaintenanceInfoURL メンテナンス情報 URL取得 +func (p *propInstance) GetMaintenanceInfoURL() string { + if p.Instance == nil { + return "" + } + return p.Instance.Host.InfoURL +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/prop_interface_driver.go b/vendor/github.com/sacloud/libsacloud/sacloud/prop_interface_driver.go new file mode 100644 index 00000000..4cfca2be --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/prop_interface_driver.go @@ -0,0 +1,26 @@ +package sacloud + +// propInterfaceDriver インターフェースドライバ内包型 +type propInterfaceDriver struct { + InterfaceDriver EInterfaceDriver `json:",omitempty"` // NIC +} + +// SetInterfaceDriver インターフェースドライバ 設定 +func (p *propInterfaceDriver) SetInterfaceDriver(v EInterfaceDriver) { + p.InterfaceDriver = v +} + +// GetInterfaceDriver インターフェースドライバ 取得 +func (p *propInterfaceDriver) GetInterfaceDriver() EInterfaceDriver { + return p.InterfaceDriver +} + +// SetInterfaceDriverByString インターフェースドライバ 設定(文字列) +func (p *propInterfaceDriver) SetInterfaceDriverByString(v string) { + p.InterfaceDriver = EInterfaceDriver(v) +} + +// GetInterfaceDriverString インターフェースドライバ 取得(文字列) +func (p *propInterfaceDriver) GetInterfaceDriverString() string { + return string(p.InterfaceDriver) +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/prop_interfaces.go b/vendor/github.com/sacloud/libsacloud/sacloud/prop_interfaces.go new file mode 100644 index 00000000..5d5ddd8b --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/prop_interfaces.go @@ -0,0 +1,19 @@ +package sacloud + +// propInterfaces インターフェース(NIC)配列内包型 +type propInterfaces struct { + Interfaces []Interface `json:",omitempty"` // インターフェース +} + +// GetInterfaces インターフェース(NIC)配列 取得 +func (p *propInterfaces) GetInterfaces() []Interface { + return p.Interfaces +} + +// GetFirstInterface インターフェース(NIC)配列の先頭要素を返す +func (p *propInterfaces) GetFirstInterface() *Interface { + if len(p.Interfaces) == 0 { + return nil + } + return &p.Interfaces[0] +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/prop_job_status.go b/vendor/github.com/sacloud/libsacloud/sacloud/prop_job_status.go new file mode 100644 index 00000000..9cfcee1f --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/prop_job_status.go @@ -0,0 +1,11 @@ +package sacloud + +// propJobStatus マイグレーションジョブステータス内包型 +type propJobStatus struct { + JobStatus *MigrationJobStatus `json:",omitempty"` // マイグレーションジョブステータス +} + +// GetJobStatus マイグレーションジョブステータス 取得 +func (p *propJobStatus) GetJobStatus() *MigrationJobStatus { + return p.JobStatus +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/prop_memory.go b/vendor/github.com/sacloud/libsacloud/sacloud/prop_memory.go new file mode 100644 index 00000000..5c503a33 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/prop_memory.go @@ -0,0 +1,19 @@ +package sacloud + +// propMemoryMB サイズ(MB)内包型 +type propMemoryMB struct { + MemoryMB int `json:",omitempty"` // サイズ(MB単位) +} + +// GetMemoryMB サイズ(MB単位) 取得 +func (p *propMemoryMB) GetMemoryMB() int { + return p.MemoryMB +} + +// GetMemoryGB サイズ(GB単位) 取得 +func (p *propMemoryMB) GetMemoryGB() int { + if p.MemoryMB <= 0 { + return 0 + } + return p.MemoryMB / 1024 +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/prop_name.go b/vendor/github.com/sacloud/libsacloud/sacloud/prop_name.go new file mode 100644 index 00000000..03f178df --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/prop_name.go @@ -0,0 +1,16 @@ +package sacloud + +// propName 名称内包型 +type propName struct { + Name string `json:",omitempty"` // 名称 +} + +// GetName 名称 取得 +func (p *propName) GetName() string { + return p.Name +} + +// SetName 名称 設定 +func (p *propName) SetName(name string) { + p.Name = name +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/prop_note_class.go b/vendor/github.com/sacloud/libsacloud/sacloud/prop_note_class.go new file mode 100644 index 00000000..a3e6fecf --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/prop_note_class.go @@ -0,0 +1,39 @@ +package sacloud + +// ENoteClass スタートアップスクリプトクラス +type ENoteClass string + +var ( + // NoteClassShell shellクラス + NoteClassShell = ENoteClass("shell") + // NoteClassYAMLCloudConfig yaml_cloud_configクラス + NoteClassYAMLCloudConfig = ENoteClass("yaml_cloud_config") +) + +// ENoteClasses 設定可能なスタートアップスクリプトクラス +var ENoteClasses = []ENoteClass{NoteClassShell, NoteClassYAMLCloudConfig} + +// propNoteClass スタートアップスクリプトクラス情報内包型 +type propNoteClass struct { + Class ENoteClass `json:",omitempty"` // クラス +} + +// GetClass クラス 取得 +func (p *propNoteClass) GetClass() ENoteClass { + return p.Class +} + +// SetClass クラス 設定 +func (p *propNoteClass) SetClass(c ENoteClass) { + p.Class = c +} + +// GetClassStr クラス 取得(文字列) +func (p *propNoteClass) GetClassStr() string { + return string(p.Class) +} + +// SetClassByStr クラス 設定(文字列) +func (p *propNoteClass) SetClassByStr(c string) { + p.Class = ENoteClass(c) +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/prop_original_archive_id.go b/vendor/github.com/sacloud/libsacloud/sacloud/prop_original_archive_id.go new file mode 100644 index 00000000..39b9d376 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/prop_original_archive_id.go @@ -0,0 +1,22 @@ +package sacloud + +// propOriginalArchiveID オリジナルアーカイブID内包型 +type propOriginalArchiveID struct { + OriginalArchive *Resource `json:",omitempty"` // オリジナルアーカイブ +} + +// GetOriginalArchiveID プランID 取得 +func (p *propOriginalArchiveID) GetOriginalArchiveID() int64 { + if p.OriginalArchive == nil { + return -1 + } + return p.OriginalArchive.GetID() +} + +// GetStrOriginalArchiveID プランID(文字列) 取得 +func (p *propOriginalArchiveID) GetStrOriginalArchiveID() string { + if p.OriginalArchive == nil { + return "" + } + return p.OriginalArchive.GetStrID() +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/prop_plan_id.go b/vendor/github.com/sacloud/libsacloud/sacloud/prop_plan_id.go new file mode 100644 index 00000000..1102262c --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/prop_plan_id.go @@ -0,0 +1,22 @@ +package sacloud + +// propPlanID プランID内包型 +type propPlanID struct { + Plan *Resource `json:",omitempty"` // プラン +} + +// GetPlanID プランID 取得 +func (p *propPlanID) GetPlanID() int64 { + if p.Plan == nil { + return -1 + } + return p.Plan.GetID() +} + +// GetStrPlanID プランID(文字列) 取得 +func (p *propPlanID) GetStrPlanID() string { + if p.Plan == nil { + return "" + } + return p.Plan.GetStrID() +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/prop_private_host.go b/vendor/github.com/sacloud/libsacloud/sacloud/prop_private_host.go new file mode 100644 index 00000000..18059413 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/prop_private_host.go @@ -0,0 +1,21 @@ +package sacloud + +// propPrivateHost 専有ホスト内包型 +type propPrivateHost struct { + PrivateHost *PrivateHost // 専有ホスト +} + +// SetPrivateHostByID 指定のアイコンIDを設定 +func (p *propPrivateHost) SetPrivateHostByID(id int64) { + p.PrivateHost = &PrivateHost{Resource: NewResource(id)} +} + +// SetPrivateHost 指定のアイコンオブジェクトを設定 +func (p *propPrivateHost) SetPrivateHost(icon *PrivateHost) { + p.PrivateHost = icon +} + +// ClearPrivateHost アイコンをクリア(空IDを持つアイコンオブジェクトをセット) +func (p *propPrivateHost) ClearPrivateHost() { + p.PrivateHost = &PrivateHost{Resource: NewResource(EmptyID)} +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/prop_private_host_plan.go b/vendor/github.com/sacloud/libsacloud/sacloud/prop_private_host_plan.go new file mode 100644 index 00000000..572502b4 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/prop_private_host_plan.go @@ -0,0 +1,51 @@ +package sacloud + +// propPrivateHostPlan 専有ホストプラン内包型 +type propPrivateHostPlan struct { + Plan *ProductPrivateHost `json:",omitempty"` // 専有ホストプラン +} + +// GetPrivateHostPlan 専有ホストプラン取得 +func (p *propPrivateHostPlan) GetPrivateHostPlan() *ProductPrivateHost { + return p.Plan +} + +// SetPrivateHostPlan 専有ホストプラン設定 +func (p *propPrivateHostPlan) SetPrivateHostPlan(plan *ProductPrivateHost) { + p.Plan = plan +} + +// SetPrivateHostPlanByID 専有ホストプラン設定 +func (p *propPrivateHostPlan) SetPrivateHostPlanByID(planID int64) { + if p.Plan == nil { + p.Plan = &ProductPrivateHost{} + } + p.Plan.Resource = NewResource(planID) +} + +// GetCPU CPUコア数 取得 +func (p *propPrivateHostPlan) GetCPU() int { + if p.Plan == nil { + return -1 + } + + return p.Plan.GetCPU() +} + +// GetMemoryMB メモリ(MB) 取得 +func (p *propPrivateHostPlan) GetMemoryMB() int { + if p.Plan == nil { + return -1 + } + + return p.Plan.GetMemoryMB() +} + +// GetMemoryGB メモリ(GB) 取得 +func (p *propPrivateHostPlan) GetMemoryGB() int { + if p.Plan == nil { + return -1 + } + + return p.Plan.GetMemoryGB() +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/prop_region.go b/vendor/github.com/sacloud/libsacloud/sacloud/prop_region.go new file mode 100644 index 00000000..1a38851c --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/prop_region.go @@ -0,0 +1,44 @@ +package sacloud + +// propRegion リージョン内包型 +type propRegion struct { + Region *Region `json:",omitempty"` // リージョン +} + +// GetRegion リージョン 取得 +func (p *propRegion) GetRegion() *Region { + return p.Region +} + +// GetRegionID リージョンID 取得 +func (p *propRegion) GetRegionID() int64 { + if p.Region == nil { + return -1 + } + return p.Region.GetID() +} + +// GetRegionName リージョン名 取得 +func (p *propRegion) GetRegionName() string { + if p.Region == nil { + return "" + } + return p.Region.GetName() +} + +// GetRegionDescription リージョン説明 取得 +func (p *propRegion) GetRegionDescription() string { + if p.Region == nil { + return "" + } + return p.Region.GetDescription() +} + +// GetRegionNameServers リージョンのネームサーバー(のIPアドレス)取得 +func (p *propRegion) GetRegionNameServers() []string { + if p.Region == nil { + return []string{} + } + + return p.Region.GetNameServers() +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/prop_scope.go b/vendor/github.com/sacloud/libsacloud/sacloud/prop_scope.go new file mode 100644 index 00000000..d1146a6d --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/prop_scope.go @@ -0,0 +1,42 @@ +package sacloud + +// propScope スコープ内包型 +type propScope struct { + Scope string `json:",omitempty"` // スコープ +} + +// GetScope スコープ 取得 +func (p *propScope) GetScope() string { + return p.Scope +} + +// SetScope スコープ 設定 +func (p *propScope) SetScope(scope string) { + p.Scope = scope +} + +// SetSharedScope 共有スコープに設定 +func (p *propScope) SetSharedScope() { + p.Scope = string(ESCopeShared) +} + +// SetUserScope ユーザースコープに設定 +func (p *propScope) SetUserScope() { + p.Scope = string(ESCopeUser) +} + +// IsSharedScope 共有スコープか判定 +func (p *propScope) IsSharedScope() bool { + if p == nil { + return false + } + return p.Scope == string(ESCopeShared) +} + +// IsUserScope ユーザースコープか判定 +func (p *propScope) IsUserScope() bool { + if p == nil { + return false + } + return p.Scope == string(ESCopeUser) +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/prop_server.go b/vendor/github.com/sacloud/libsacloud/sacloud/prop_server.go new file mode 100644 index 00000000..2d573082 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/prop_server.go @@ -0,0 +1,21 @@ +package sacloud + +// propServer 接続先サーバー内包型 +type propServer struct { + Server *Server `json:",omitempty"` // 接続先サーバー +} + +// GetServer 接続先サーバー 取得 +func (p *propServer) GetServer() *Server { + return p.Server +} + +// SetServer 接続先サーバー 設定 +func (p *propServer) SetServer(server *Server) { + p.Server = server +} + +// SetServerID サーバーIDの設定 +func (p *propServer) SetServerID(id int64) { + p.Server = &Server{Resource: &Resource{ID: id}} +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/prop_server_plan.go b/vendor/github.com/sacloud/libsacloud/sacloud/prop_server_plan.go new file mode 100644 index 00000000..b5fa3454 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/prop_server_plan.go @@ -0,0 +1,51 @@ +package sacloud + +// propServerPlan サーバープラン内包型 +type propServerPlan struct { + ServerPlan *ProductServer `json:",omitempty"` // サーバープラン +} + +// GetServerPlan サーバープラン取得 +func (p *propServerPlan) GetServerPlan() *ProductServer { + return p.ServerPlan +} + +// SetServerPlan サーバープラン設定 +func (p *propServerPlan) SetServerPlan(plan *ProductServer) { + p.ServerPlan = plan +} + +// SetServerPlanByID サーバープラン設定 +func (p *propServerPlan) SetServerPlanByID(planID string) { + if p.ServerPlan == nil { + p.ServerPlan = &ProductServer{} + } + p.ServerPlan.Resource = NewResourceByStringID(planID) +} + +// GetCPU CPUコア数 取得 +func (p *propServerPlan) GetCPU() int { + if p.ServerPlan == nil { + return -1 + } + + return p.ServerPlan.GetCPU() +} + +// GetMemoryMB メモリ(MB) 取得 +func (p *propServerPlan) GetMemoryMB() int { + if p.ServerPlan == nil { + return -1 + } + + return p.ServerPlan.GetMemoryMB() +} + +// GetMemoryGB メモリ(GB) 取得 +func (p *propServerPlan) GetMemoryGB() int { + if p.ServerPlan == nil { + return -1 + } + + return p.ServerPlan.GetMemoryGB() +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/prop_service_class.go b/vendor/github.com/sacloud/libsacloud/sacloud/prop_service_class.go new file mode 100644 index 00000000..8b5d2168 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/prop_service_class.go @@ -0,0 +1,11 @@ +package sacloud + +// propServiceClass サービスクラス内包型 +type propServiceClass struct { + ServiceClass string `json:",omitempty"` // サービスクラス +} + +// GetServiceClass サービスクラス 取得 +func (p *propServiceClass) GetServiceClass() string { + return p.ServiceClass +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/prop_storage.go b/vendor/github.com/sacloud/libsacloud/sacloud/prop_storage.go new file mode 100644 index 00000000..fd45a84a --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/prop_storage.go @@ -0,0 +1,11 @@ +package sacloud + +// propStorage ストーレジ内包型 +type propStorage struct { + Storage *Storage `json:",omitempty"` // ストレージ +} + +// GetStorage ストレージ 取得 +func (p *propStorage) GetStorage() *Storage { + return p.Storage +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/prop_storage_class.go b/vendor/github.com/sacloud/libsacloud/sacloud/prop_storage_class.go new file mode 100644 index 00000000..aba0e28d --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/prop_storage_class.go @@ -0,0 +1,11 @@ +package sacloud + +// propStorageClass ストレージクラス内包型 +type propStorageClass struct { + StorageClass string `json:",omitempty"` // ストレージクラス +} + +// GetStorageClass ストレージクラス 取得 +func (p *propStorageClass) GetStorageClass() string { + return p.StorageClass +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/prop_switch.go b/vendor/github.com/sacloud/libsacloud/sacloud/prop_switch.go new file mode 100644 index 00000000..f217c6bf --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/prop_switch.go @@ -0,0 +1,21 @@ +package sacloud + +// propSwitch スイッチ内包型 +type propSwitch struct { + Switch *Switch `json:",omitempty"` // スイッチ +} + +// GetSwitch スイッチ 取得 +func (p *propSwitch) GetSwitch() *Switch { + return p.Switch +} + +// SetSwitch スイッチ 設定 +func (p *propSwitch) SetSwitch(sw *Switch) { + p.Switch = sw +} + +// SetSwitchID スイッチID 設定 +func (p *Interface) SetSwitchID(id int64) { + p.Switch = &Switch{Resource: &Resource{ID: id}} +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/prop_tags.go b/vendor/github.com/sacloud/libsacloud/sacloud/prop_tags.go new file mode 100644 index 00000000..450cebd3 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/prop_tags.go @@ -0,0 +1,57 @@ +package sacloud + +// propTags タグ内包型 +type propTags struct { + Tags []string // タグ +} + +// HasTag 指定のタグを持っているか判定 +func (p *propTags) HasTag(target string) bool { + + for _, tag := range p.Tags { + if target == tag { + return true + } + } + + return false +} + +// AppendTag タグを追加 +func (p *propTags) AppendTag(target string) { + if p.HasTag(target) { + return + } + + p.Tags = append(p.Tags, target) +} + +// RemoveTag 指定のタグを削除 +func (p *propTags) RemoveTag(target string) { + if !p.HasTag(target) { + return + } + res := []string{} + for _, tag := range p.Tags { + if tag != target { + res = append(res, tag) + } + } + + p.Tags = res +} + +// ClearTags 全タグを削除 +func (p *propTags) ClearTags() { + p.Tags = []string{} +} + +// GetTags タグ取得 +func (p *propTags) GetTags() []string { + return p.Tags +} + +// SetTags タグを設定 +func (p *propTags) SetTags(tags []string) { + p.Tags = tags +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/prop_timestamp.go b/vendor/github.com/sacloud/libsacloud/sacloud/prop_timestamp.go new file mode 100644 index 00000000..732fd07f --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/prop_timestamp.go @@ -0,0 +1,35 @@ +package sacloud + +import "time" + +// propCreatedAt 作成日時内包型 +type propCreatedAt struct { + CreatedAt *time.Time `json:",omitempty"` // 作成日時 +} + +// GetCreatedAt 作成日時 取得 +func (p *propCreatedAt) GetCreatedAt() *time.Time { + return p.CreatedAt +} + +// propModifiedAt 変更日時内包型 +type propModifiedAt struct { + // ModifiedAt 変更日時 + ModifiedAt *time.Time `json:",omitempty"` +} + +// GetModifiedAt 変更日時 取得 +func (p *propModifiedAt) GetModifiedAt() *time.Time { + return p.ModifiedAt +} + +// propUpdatedAt 変更日時内包型 +type propUpdatedAt struct { + // UpdatedAt 変更日時 + UpdatedAt *time.Time `json:",omitempty"` +} + +// GetModifiedAt 変更日時 取得 +func (p *propUpdatedAt) GetModifiedAt() *time.Time { + return p.UpdatedAt +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/prop_zone.go b/vendor/github.com/sacloud/libsacloud/sacloud/prop_zone.go new file mode 100644 index 00000000..2fdfb899 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/prop_zone.go @@ -0,0 +1,118 @@ +package sacloud + +// PropZone ゾーン内包型 +type propZone struct { + Zone *Zone `json:",omitempty"` // ゾーン +} + +// GetZone ゾーン 取得 +func (p *propZone) GetZone() *Zone { + return p.Zone +} + +// GetZoneID ゾーンID 取得 +func (p *propZone) GetZoneID() int64 { + if p.Zone == nil { + return -1 + } + return p.Zone.GetID() +} + +// GetZoneName ゾーン名 取得 +func (p *propZone) GetZoneName() string { + if p.Zone == nil { + return "" + } + + return p.Zone.GetName() +} + +// GetZoneDescription ゾーン説明 取得 +func (p *propZone) GetZoneDescription() string { + if p.Zone == nil { + return "" + } + return p.Zone.GetDescription() +} + +// GetRegion リージョン 取得 +func (p *propZone) GetRegion() *Region { + if p.Zone == nil { + return nil + } + return p.Zone.GetRegion() +} + +// GetRegionID リージョンID 取得 +func (p *propZone) GetRegionID() int64 { + if p.Zone == nil { + return -1 + } + return p.Zone.GetRegionID() +} + +// GetRegionName リージョン名 取得 +func (p *propZone) GetRegionName() string { + if p.Zone == nil { + return "" + } + return p.Zone.GetRegionName() +} + +// GetRegionDescription リージョン説明 取得 +func (p *propZone) GetRegionDescription() string { + if p.Zone == nil { + return "" + } + return p.Zone.GetRegionDescription() +} + +// GetRegionNameServers リージョンのネームサーバー(のIPアドレス)取得 +func (p *propZone) GetRegionNameServers() []string { + if p.Zone == nil { + return []string{} + } + + return p.Zone.GetRegionNameServers() +} + +// ZoneIsDummy ダミーフラグ 取得 +func (p *propZone) ZoneIsDummy() bool { + if p.Zone == nil { + return false + } + return p.Zone.ZoneIsDummy() +} + +// GetVNCProxyHostName VNCプロキシホスト名 取得 +func (p *propZone) GetVNCProxyHostName() string { + if p.Zone == nil { + return "" + } + + return p.Zone.GetVNCProxyHostName() +} + +// GetVPCProxyIPAddress VNCプロキシIPアドレス 取得 +func (p *propZone) GetVPCProxyIPAddress() string { + if p.Zone == nil { + return "" + } + return p.Zone.GetVPCProxyIPAddress() +} + +// GetFTPHostName FTPサーバーホスト名 取得 +func (p *propZone) GetFTPHostName() string { + if p.Zone == nil { + return "" + } + return p.Zone.GetFTPHostName() +} + +// GetFTPServerIPAddress FTPサーバーIPアドレス 取得 +func (p *propZone) GetFTPServerIPAddress() string { + if p.Zone == nil { + return "" + } + return p.Zone.GetFTPServerIPAddress() +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/public_price.go b/vendor/github.com/sacloud/libsacloud/sacloud/public_price.go new file mode 100644 index 00000000..8d85c3d3 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/public_price.go @@ -0,0 +1,18 @@ +package sacloud + +// PublicPrice 料金 +type PublicPrice struct { + DisplayName string `json:",omitempty"` // 表示名 + IsPublic bool `json:",omitempty"` // 公開フラグ + ServiceClassID int `json:",omitempty"` // サービスクラスID + ServiceClassName string `json:",omitempty"` // サービスクラス名 + ServiceClassPath string `json:",omitempty"` // サービスクラスパス + + Price struct { // 価格 + Base int `json:",omitempty"` // 基本料金 + Daily int `json:",omitempty"` // 日単位料金 + Hourly int `json:",omitempty"` // 時間単位料金 + Monthly int `json:",omitempty"` // 分単位料金 + Zone string `json:",omitempty"` // ゾーン + } +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/region.go b/vendor/github.com/sacloud/libsacloud/sacloud/region.go new file mode 100644 index 00000000..1e31f421 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/region.go @@ -0,0 +1,18 @@ +package sacloud + +// Region リージョン +type Region struct { + *Resource // ID + propName // 名称 + propDescription // 説明 + + NameServers []string `json:",omitempty"` // NameServers ネームサーバー +} + +// GetNameServers リージョン内のネームサーバー取得 +func (r *Region) GetNameServers() []string { + if r == nil { + return []string{} + } + return r.NameServers +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/server.go b/vendor/github.com/sacloud/libsacloud/sacloud/server.go new file mode 100644 index 00000000..ad009044 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/server.go @@ -0,0 +1,87 @@ +package sacloud + +// Server サーバー +type Server struct { + *Resource // ID + propName // 名称 + propDescription // 説明 + propHostName // ホスト名 + propInterfaceDriver // インターフェースドライバ + propAvailability // 有功状態 + propServerPlan // サーバープラン + propZone // ゾーン + propServiceClass // サービスクラス + propConnectedSwitches // 接続スイッチ + propDisks // ディスク配列 + propInstance // インスタンス + propInterfaces // インターフェース配列 + propPrivateHost // 専有ホスト + propIcon // アイコン + propTags // タグ + propCreatedAt // 作成日時 +} + +const ( + // ServerMaxInterfaceLen サーバーに接続できるNICの最大数 + ServerMaxInterfaceLen = 10 + // ServerMaxDiskLen サーバーに接続できるディスクの最大数 + ServerMaxDiskLen = 4 +) + +// KeyboardRequest キーボード送信リクエスト +type KeyboardRequest struct { + Keys []string `json:",omitempty"` // キー(複数) + Key string `json:",omitempty"` // キー(単体) +} + +// MouseRequest マウス送信リクエスト +type MouseRequest struct { + X *int `json:",omitempty"` // X + Y *int `json:",omitempty"` // Y + Z *int `json:",omitempty"` // Z + Buttons *MouseRequestButtons `json:",omitempty"` // マウスボタン + +} + +// VNCSnapshotRequest VNCスナップショット取得リクエスト +type VNCSnapshotRequest struct { + ScreenSaverExitTimeMS int `json:",omitempty"` // スクリーンセーバーからの復帰待ち時間 +} + +// MouseRequestButtons マウスボタン +type MouseRequestButtons struct { + L bool `json:",omitempty"` // 左ボタン + R bool `json:",omitempty"` // 右ボタン + M bool `json:",omitempty"` // 中ボタン +} + +// VNCProxyResponse VNCプロキシ取得レスポンス +type VNCProxyResponse struct { + *ResultFlagValue + Status string `json:",omitempty"` // ステータス + Host string `json:",omitempty"` // プロキシホスト + IOServerHost string `json:",omitempty"` // 新プロキシホスト(Hostがlocalhostの場合にこちらを利用する) + Port string `json:",omitempty"` // ポート番号 + Password string `json:",omitempty"` // VNCパスワード + VNCFile string `json:",omitempty"` // VNC接続情報ファイル(VNCビューア用) +} + +// ActualHost プロキシホスト名(Host or IOServerHost)を返す +func (r *VNCProxyResponse) ActualHost() string { + host := r.Host + if host == "localhost" { + host = r.IOServerHost + } + return host +} + +// VNCSizeResponse VNC画面サイズレスポンス +type VNCSizeResponse struct { + Width int `json:",string,omitempty"` // 幅 + Height int `json:",string,omitempty"` // 高さ +} + +// VNCSnapshotResponse VPCスナップショットレスポンス +type VNCSnapshotResponse struct { + Image string `json:",omitempty"` // スナップショット画像データ +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/sim.go b/vendor/github.com/sacloud/libsacloud/sacloud/sim.go new file mode 100644 index 00000000..e513a1e8 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/sim.go @@ -0,0 +1,111 @@ +package sacloud + +import ( + "encoding/json" + "strings" + "time" +) + +// SIM SIM(CommonServiceItem) +type SIM struct { + *Resource // ID + propName // 名称 + propDescription // 説明 + propServiceClass // サービスクラス + propIcon // アイコン + propTags // タグ + propCreatedAt // 作成日時 + propModifiedAt // 変更日時 + propAvailability // 有効状態 + + Status SIMStatus `json:",omitempty"` // ステータス + Provider SIMProvider `json:",omitempty"` // プロバイダ + Remark *SIMRemark `json:",omitempty"` // Remark +} + +// SIMStatus SIMステータス +type SIMStatus struct { + ICCID string `json:",omitempty"` // ICCID + SIMInfo *SIMInfo `json:"sim,omitempty"` // SIM詳細情報 +} + +// SIMInfo SIM詳細情報 +type SIMInfo struct { + ICCID string `json:"iccid,omitempty"` + IMSI []string `json:"imsi,omitempty"` + IP string `json:"ip,omitempty"` + SessionStatus string `json:"session_status,omitempty"` + IMEILock bool `json:"imei_lock,omitempty"` + Registered bool `json:"registered,omitempty"` + Activated bool `json:"activated,omitempty"` + ResourceID string `json:"resource_id,omitempty"` + RegisteredDate *time.Time `json:"registered_date,omitempty"` + ActivatedDate *time.Time `json:"activated_date,omitempty"` + DeactivatedDate *time.Time `json:"deactivated_date,omitempty"` + SIMGroupID string `json:"simgroiup_id,omitempty"` + TrafficBytesOfCurrentMonth *SIMTrafficBytes `json:"traffic_bytes_of_current_month,omitempty"` + ConnectedIMEI string `json:"connected_imei,omitempty"` +} + +// SIMTrafficBytes 当月通信量 +type SIMTrafficBytes struct { + UplinkBytes int64 `json:"uplink_bytes,omitempty"` + DownlinkBytes int64 `json:"downlink_bytes,omitempty"` +} + +// UnmarshalJSON JSONアンマーシャル(配列、オブジェクトが混在するためここで対応) +func (s *SIMTrafficBytes) UnmarshalJSON(data []byte) error { + targetData := strings.Replace(strings.Replace(string(data), " ", "", -1), "\n", "", -1) + if targetData == `[]` { + return nil + } + tmp := &struct { + UplinkBytes int64 `json:"uplink_bytes,omitempty"` + DownlinkBytes int64 `json:"downlink_bytes,omitempty"` + }{} + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + s.UplinkBytes = tmp.UplinkBytes + s.DownlinkBytes = tmp.DownlinkBytes + return nil +} + +// SIMRemark remark +type SIMRemark struct { + PassCode string `json:",omitempty"` +} + +// SIMProvider プロバイダ +type SIMProvider struct { + Class string `json:",omitempty"` // クラス + Name string `json:",omitempty"` + ServiceClass string `json:",omitempty"` +} + +// SIMLog SIMログ +type SIMLog struct { + Date *time.Time `json:"date,omitempty"` + SessionStatus string `json:"session_status,omitempty"` + ResourceID string `json:"resource_id,omitempty"` + IMEI string `json:"imei,omitempty"` + IMSI string `json:"imsi,omitempty"` +} + +// CreateNewSIM SIM作成 +func CreateNewSIM(name string, iccID string, passcode string) *SIM { + return &SIM{ + Resource: &Resource{}, + propName: propName{Name: name}, + Provider: SIMProvider{ + Class: "sim", + }, + Status: SIMStatus{ + ICCID: iccID, + }, + Remark: &SIMRemark{ + PassCode: passcode, + }, + } +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/simple_monitor.go b/vendor/github.com/sacloud/libsacloud/sacloud/simple_monitor.go new file mode 100644 index 00000000..f4c51750 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/simple_monitor.go @@ -0,0 +1,248 @@ +package sacloud + +// SimpleMonitor シンプル監視 +type SimpleMonitor struct { + *Resource // ID + propName // 名称 + propDescription // 説明 + propServiceClass // サービスクラス + propIcon // アイコン + propTags // タグ + propCreatedAt // 作成日時 + propModifiedAt // 変更日時 + + Settings *SimpleMonitorSettings `json:",omitempty"` // 設定 + Status *SimpleMonitorStatus `json:",omitempty"` // ステータス + Provider *SimpleMonitorProvider `json:",omitempty"` // プロバイダ + +} + +// SimpleMonitorSettings シンプル監視設定 リスト +type SimpleMonitorSettings struct { + SimpleMonitor *SimpleMonitorSetting `json:",omitempty"` // シンプル監視設定値 +} + +// SimpleMonitorSetting シンプル監視設定 +type SimpleMonitorSetting struct { + DelayLoop int `json:",omitempty"` // 監視間隔 + HealthCheck *SimpleMonitorHealthCheck `json:",omitempty"` // ヘルスチェック + Enabled string `json:",omitempty"` // 有効/無効 + NotifyEmail *SimpleMonitorNotify `json:",omitempty"` // Email通知 + NotifySlack *SimpleMonitorNotify `json:",omitempty"` // Slack通知 +} + +// SimpleMonitorStatus シンプル監視ステータス +type SimpleMonitorStatus struct { + Target string `json:",omitempty"` // 対象(IP or FQDN) +} + +// SimpleMonitorProvider プロバイダ +type SimpleMonitorProvider struct { + *Resource // ID + propName // 名称 + propServiceClass // サービスクラス + + Class string `json:",omitempty"` // クラス +} + +// SimpleMonitorHealthCheck ヘルスチェック +type SimpleMonitorHealthCheck struct { + Protocol string `json:",omitempty"` // プロトコル + Port string `json:",omitempty"` // ポート + Path string `json:",omitempty"` // HTTP/HTTPS監視の場合のリクエストパス + Status string `json:",omitempty"` // HTTP/HTTPS監視の場合の期待ステータスコード + Host string `json:",omitempty"` // 対象ホスト(IP or FQDN) + QName string `json:",omitempty"` // DNS監視の場合の問い合わせFQDN + ExpectedData string `json:",omitempty"` // 期待値 + Community string `json:",omitempty"` // SNMP監視の場合のコミュニティ名 + SNMPVersion string `json:",omitempty"` // SNMP監視 SNMPバージョン + OID string `json:",omitempty"` // SNMP監視 OID + RemainingDays int `json:",omitempty"` // SSL証明書 有効残日数 +} + +// SimpleMonitorNotify シンプル監視通知 +type SimpleMonitorNotify struct { + Enabled string `json:",omitempty"` // 有効/無効 + HTML string `json:",omitempty"` // メール通知の場合のHTMLメール有効フラグ + IncomingWebhooksURL string `json:",omitempty"` // Slack通知の場合のWebhook URL +} + +// CreateNewSimpleMonitor シンプル監視作成 +func CreateNewSimpleMonitor(target string) *SimpleMonitor { + return &SimpleMonitor{ + propName: propName{Name: target}, + Provider: &SimpleMonitorProvider{ + Class: "simplemon", + }, + Status: &SimpleMonitorStatus{ + Target: target, + }, + Settings: &SimpleMonitorSettings{ + SimpleMonitor: &SimpleMonitorSetting{ + HealthCheck: &SimpleMonitorHealthCheck{}, + Enabled: "True", + NotifyEmail: &SimpleMonitorNotify{ + Enabled: "False", + }, + NotifySlack: &SimpleMonitorNotify{ + Enabled: "False", + }, + }, + }, + } + +} + +// AllowSimpleMonitorHealthCheckProtocol シンプル監視対応プロトコルリスト +func AllowSimpleMonitorHealthCheckProtocol() []string { + return []string{"http", "https", "ping", "tcp", "dns", "ssh", "smtp", "pop3", "snmp", "sslcertificate"} +} + +func createSimpleMonitorNotifyEmail(withHTML bool) *SimpleMonitorNotify { + n := &SimpleMonitorNotify{ + Enabled: "True", + HTML: "False", + } + + if withHTML { + n.HTML = "True" + } + + return n +} + +func createSimpleMonitorNotifySlack(incomingWebhooksURL string) *SimpleMonitorNotify { + return &SimpleMonitorNotify{ + Enabled: "True", + IncomingWebhooksURL: incomingWebhooksURL, + } + +} + +// SetTarget 対象ホスト(IP or FQDN)の設定 +func (s *SimpleMonitor) SetTarget(target string) { + s.Name = target + s.Status.Target = target +} + +// SetHealthCheckPing pingでのヘルスチェック設定 +func (s *SimpleMonitor) SetHealthCheckPing() { + s.Settings.SimpleMonitor.HealthCheck = &SimpleMonitorHealthCheck{ + Protocol: "ping", + } +} + +// SetHealthCheckTCP TCPでのヘルスチェック設定 +func (s *SimpleMonitor) SetHealthCheckTCP(port string) { + s.Settings.SimpleMonitor.HealthCheck = &SimpleMonitorHealthCheck{ + Protocol: "tcp", + Port: port, + } +} + +// SetHealthCheckHTTP HTTPでのヘルスチェック設定 +func (s *SimpleMonitor) SetHealthCheckHTTP(port string, path string, status string, host string) { + s.Settings.SimpleMonitor.HealthCheck = &SimpleMonitorHealthCheck{ + Protocol: "http", + Port: port, + Path: path, + Status: status, + Host: host, + } +} + +// SetHealthCheckHTTPS HTTPSでのヘルスチェック設定 +func (s *SimpleMonitor) SetHealthCheckHTTPS(port string, path string, status string, host string) { + s.Settings.SimpleMonitor.HealthCheck = &SimpleMonitorHealthCheck{ + Protocol: "https", + Port: port, + Path: path, + Status: status, + Host: host, + } +} + +// SetHealthCheckDNS DNSクエリでのヘルスチェック設定 +func (s *SimpleMonitor) SetHealthCheckDNS(qname string, expectedData string) { + s.Settings.SimpleMonitor.HealthCheck = &SimpleMonitorHealthCheck{ + Protocol: "dns", + QName: qname, + ExpectedData: expectedData, + } +} + +// SetHealthCheckSSH SSHヘルスチェック設定 +func (s *SimpleMonitor) SetHealthCheckSSH(port string) { + s.Settings.SimpleMonitor.HealthCheck = &SimpleMonitorHealthCheck{ + Protocol: "ssh", + Port: port, + } +} + +// SetHealthCheckSMTP SMTPヘルスチェック設定 +func (s *SimpleMonitor) SetHealthCheckSMTP(port string) { + s.Settings.SimpleMonitor.HealthCheck = &SimpleMonitorHealthCheck{ + Protocol: "smtp", + Port: port, + } +} + +// SetHealthCheckPOP3 POP3ヘルスチェック設定 +func (s *SimpleMonitor) SetHealthCheckPOP3(port string) { + s.Settings.SimpleMonitor.HealthCheck = &SimpleMonitorHealthCheck{ + Protocol: "pop3", + Port: port, + } +} + +// SetHealthCheckSNMP SNMPヘルスチェック設定 +func (s *SimpleMonitor) SetHealthCheckSNMP(community string, version string, oid string, expectedData string) { + s.Settings.SimpleMonitor.HealthCheck = &SimpleMonitorHealthCheck{ + Protocol: "snmp", + Community: community, + SNMPVersion: version, + OID: oid, + ExpectedData: expectedData, + } +} + +// SetHealthCheckSSLCertificate SSLサーバ証明書有効期限ヘルスチェック設定 +func (s *SimpleMonitor) SetHealthCheckSSLCertificate(remainingDays int) { + // set default + if remainingDays < 0 { + remainingDays = 30 + } + s.Settings.SimpleMonitor.HealthCheck = &SimpleMonitorHealthCheck{ + Protocol: "sslcertificate", + RemainingDays: remainingDays, + } +} + +// EnableNotifyEmail Email通知の有効か +func (s *SimpleMonitor) EnableNotifyEmail(withHTML bool) { + s.Settings.SimpleMonitor.NotifyEmail = createSimpleMonitorNotifyEmail(withHTML) +} + +// DisableNotifyEmail Email通知の無効化 +func (s *SimpleMonitor) DisableNotifyEmail() { + s.Settings.SimpleMonitor.NotifyEmail = &SimpleMonitorNotify{ + Enabled: "False", + } +} + +// EnableNofitySlack Slack通知の有効化 +func (s *SimpleMonitor) EnableNofitySlack(incomingWebhooksURL string) { + s.Settings.SimpleMonitor.NotifySlack = createSimpleMonitorNotifySlack(incomingWebhooksURL) +} + +// DisableNotifySlack Slack通知の無効化 +func (s *SimpleMonitor) DisableNotifySlack() { + s.Settings.SimpleMonitor.NotifySlack = &SimpleMonitorNotify{ + Enabled: "False", + } +} + +// SetDelayLoop 監視間隔の設定 +func (s *SimpleMonitor) SetDelayLoop(loop int) { + s.Settings.SimpleMonitor.DelayLoop = loop +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/sitetosite_connection_detail.go b/vendor/github.com/sacloud/libsacloud/sacloud/sitetosite_connection_detail.go new file mode 100644 index 00000000..9ff081a7 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/sitetosite_connection_detail.go @@ -0,0 +1,38 @@ +package sacloud + +// SiteToSiteConnectionDetail サイト間VPN接続詳細情報 +type SiteToSiteConnectionDetail struct { + ESP struct { + AuthenticationProtocol string + DHGroup string + EncryptionProtocol string + Lifetime string + Mode string + PerfectForwardSecrecy string + } + IKE struct { + AuthenticationProtocol string + EncryptionProtocol string + Lifetime string + Mode string + PerfectForwardSecrecy string + PreSharedSecret string + } + Peer struct { + ID string + InsideNetworks []string + OutsideIPAddress string + } + VPCRouter struct { + ID string + InsideNetworks []string + OutsideIPAddress string + } +} + +// SiteToSiteConnectionInfo サイト間VPN接続情報 +type SiteToSiteConnectionInfo struct { + Details struct { + Config []SiteToSiteConnectionDetail + } +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/ssh_key.go b/vendor/github.com/sacloud/libsacloud/sacloud/ssh_key.go new file mode 100644 index 00000000..5d6b5924 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/ssh_key.go @@ -0,0 +1,38 @@ +package sacloud + +// SSHKey 公開鍵 +type SSHKey struct { + *Resource // ID + propName // 名称 + propDescription // 説明 + propCreatedAt // 作成日時 + + PublicKey string `json:",omitempty"` // 公開鍵 + Fingerprint string `json:",omitempty"` // フィンガープリント +} + +// SSHKeyGenerated 公開鍵生成戻り値(秘密鍵のダウンロード用) +type SSHKeyGenerated struct { + SSHKey + PrivateKey string `json:",omitempty"` // 秘密鍵 +} + +// GetPublicKey 公開鍵取得 +func (k *SSHKey) GetPublicKey() string { + return k.PublicKey +} + +// SetPublicKey 公開鍵設定 +func (k *SSHKey) SetPublicKey(pKey string) { + k.PublicKey = pKey +} + +// GetFingerprint フィンガープリント取得 +func (k *SSHKey) GetFingerprint() string { + return k.Fingerprint +} + +// GetPrivateKey 秘密鍵取得 +func (k *SSHKeyGenerated) GetPrivateKey() string { + return k.PrivateKey +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/storage.go b/vendor/github.com/sacloud/libsacloud/sacloud/storage.go new file mode 100644 index 00000000..31555a67 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/storage.go @@ -0,0 +1,18 @@ +package sacloud + +// Storage ストレージ +type Storage struct { + *Resource // ID + propName // 名称 + propDescription // 説明 + propZone // ゾーン + + Class string `json:",omitempty"` // クラス + DiskPlan struct { // ディスクプラン + *Resource // ID + propName // 名称 + propStorageClass // ストレージクラス + } `json:",omitempty"` + + //Capacity []string `json:",omitempty"` +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/subnet.go b/vendor/github.com/sacloud/libsacloud/sacloud/subnet.go new file mode 100644 index 00000000..cd4296e2 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/subnet.go @@ -0,0 +1,18 @@ +package sacloud + +// Subnet IPv4サブネット +type Subnet struct { + *Resource // ID + propServiceClass // サービスクラス + propCreatedAt // 作成日時 + + DefaultRoute string `json:",omitempty"` // デフォルトルート + IPAddresses []*IPAddress `json:",omitempty"` // IPv4アドレス範囲 + NetworkAddress string `json:",omitempty"` // ネットワークアドレス + NetworkMaskLen int `json:",omitempty"` // ネットワークマスク長 + ServiceID int64 `json:",omitempty"` // サービスID + StaticRoute string `json:",omitempty"` // スタティックルート + NextHop string `json:",omitempty"` // ネクストホップ + Switch *Switch `json:",omitempty"` // スイッチ + Internet *Internet `json:",omitempty"` // ルーター +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/switch.go b/vendor/github.com/sacloud/libsacloud/sacloud/switch.go new file mode 100644 index 00000000..cb90bfb1 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/switch.go @@ -0,0 +1,84 @@ +package sacloud + +import ( + "encoding/json" + "fmt" + "net" +) + +// Switch スイッチ +type Switch struct { + *Resource // ID + propName // 名称 + propDescription // 説明 + propServiceClass // サービスクラス + propIcon // アイコン + propTags // タグ + propCreatedAt // 作成日時 + + ServerCount int `json:",omitempty"` // 接続サーバー数 + ApplianceCount int `json:",omitempty"` // 接続アプライアンス数 + Scope EScope `json:",omitempty"` // スコープ + Subnet *Subnet `json:",omitempty"` // サブネット + UserSubnet *Subnet `json:",omitempty"` // ユーザー定義サブネット + Subnets []SwitchSubnet `json:",omitempty"` // サブネット + IPv6Nets []IPv6Net `json:",omitempty"` // IPv6サブネットリスト + Internet *Internet `json:",omitempty"` // ルーター + + Bridge *struct { // 接続先ブリッジ(Info.Switches配下のIDデータ型HACK) + *Bridge // ブリッジ + Info *struct { + Switches []struct { // 接続スイッチリスト + *Switch // スイッチ + ID json.Number `json:",omitempty"` // HACK + } + } + } `json:",omitempty"` + + //HybridConnection //REMARK: !!ハイブリッド接続 not support!! +} + +// SwitchSubnet スイッチサブネット +type SwitchSubnet struct { + *Subnet + IPAddresses struct { // IPアドレス範囲 + Min string `json:",omitempty"` // IPアドレス開始 + Max string `json:",omitempty"` // IPアドレス終了 + } +} + +// GetDefaultIPAddressesForVPCRouter VPCルーター接続用にサブネットからIPアドレスを3つ取得 +func (s *Switch) GetDefaultIPAddressesForVPCRouter() (string, string, string, error) { + + if s.Subnets == nil || len(s.Subnets) < 1 { + return "", "", "", fmt.Errorf("switch[%d].Subnets is nil", s.ID) + } + + baseAddress := net.ParseIP(s.Subnets[0].IPAddresses.Min).To4() + address1 := net.IPv4(baseAddress[0], baseAddress[1], baseAddress[2], baseAddress[3]+1) + address2 := net.IPv4(baseAddress[0], baseAddress[1], baseAddress[2], baseAddress[3]+2) + + return baseAddress.String(), address1.String(), address2.String(), nil +} + +// GetIPAddressList IPアドレス範囲内の全てのIPアドレスを取得 +func (s *Switch) GetIPAddressList() ([]string, error) { + if s.Subnets == nil || len(s.Subnets) < 1 { + return nil, fmt.Errorf("switch[%d].Subnets is nil", s.ID) + } + + //さくらのクラウドの仕様上/24までしか割り当てできないためこのロジックでOK + baseIP := net.ParseIP(s.Subnets[0].IPAddresses.Min).To4() + min := baseIP[3] + max := net.ParseIP(s.Subnets[0].IPAddresses.Max).To4()[3] + + var i byte + ret := []string{} + for (min + i) <= max { //境界含む + ip := net.IPv4(baseIP[0], baseIP[1], baseIP[2], baseIP[3]+i) + ret = append(ret, ip.String()) + i++ + } + + return ret, nil +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/vpc_router.go b/vendor/github.com/sacloud/libsacloud/sacloud/vpc_router.go new file mode 100644 index 00000000..20bee798 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/vpc_router.go @@ -0,0 +1,238 @@ +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 +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/vpc_router_setting.go b/vendor/github.com/sacloud/libsacloud/sacloud/vpc_router_setting.go new file mode 100644 index 00000000..a9e85ca5 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/vpc_router_setting.go @@ -0,0 +1,1158 @@ +package sacloud + +import ( + "bytes" + "fmt" + "net" + "reflect" + "strconv" + "strings" +) + +// VPCRouterSetting VPCルーター設定 +type VPCRouterSetting struct { + Interfaces []*VPCRouterInterface `json:",omitempty"` // NIC設定 + StaticNAT *VPCRouterStaticNAT `json:",omitempty"` // スタティックNAT設定 + PortForwarding *VPCRouterPortForwarding `json:",omitempty"` // ポートフォワーディング設定 + Firewall *VPCRouterFirewall `json:",omitempty"` // ファイアウォール設定 + DHCPServer *VPCRouterDHCPServer `json:",omitempty"` // DHCPサーバー設定 + DHCPStaticMapping *VPCRouterDHCPStaticMapping `json:",omitempty"` // DHCPスタティックマッピング設定 + L2TPIPsecServer *VPCRouterL2TPIPsecServer `json:",omitempty"` // L2TP/IPSecサーバー設定 + PPTPServer *VPCRouterPPTPServer `json:",omitempty"` // PPTPサーバー設定 + RemoteAccessUsers *VPCRouterRemoteAccessUsers `json:",omitempty"` // リモートアクセスユーザー設定 + SiteToSiteIPsecVPN *VPCRouterSiteToSiteIPsecVPN `json:",omitempty"` // サイト間VPN設定 + StaticRoutes *VPCRouterStaticRoutes `json:",omitempty"` // スタティックルート設定 + VRID *int `json:",omitempty"` // VRID + SyslogHost string `json:",omitempty"` // syslog転送先ホスト + +} + +// VPCRouterInterface NIC設定 +type VPCRouterInterface struct { + IPAddress []string `json:",omitempty"` // IPアドレスリスト + NetworkMaskLen int `json:",omitempty"` // ネットワークマスク長 + VirtualIPAddress string `json:",omitempty"` // 仮想IPアドレス + IPAliases []string `json:",omitempty"` // IPエイリアス +} + +// AddInterface NIC追加 +func (s *VPCRouterSetting) AddInterface(vip string, ipaddress []string, maskLen int) { + if s.Interfaces == nil { + s.Interfaces = []*VPCRouterInterface{nil} + } + s.Interfaces = append(s.Interfaces, &VPCRouterInterface{ + VirtualIPAddress: vip, + IPAddress: ipaddress, + NetworkMaskLen: maskLen, + }) +} + +// HasInterfaces NIC設定を保持しているか +func (s *VPCRouterSetting) HasInterfaces() bool { + return s.Interfaces != nil && len(s.Interfaces) > 0 +} + +// VPCRouterStaticNAT スタティックNAT設定 +type VPCRouterStaticNAT struct { + Config []*VPCRouterStaticNATConfig `json:",omitempty"` // スタティックNAT設定 + Enabled string `json:",omitempty"` // 有効/無効 +} + +// VPCRouterStaticNATConfig スタティックNAT設定 +type VPCRouterStaticNATConfig struct { + GlobalAddress string `json:",omitempty"` // グローバルIPアドレス + PrivateAddress string `json:",omitempty"` // プライベートIPアドレス + Description string `json:",omitempty"` // 説明 +} + +// HasStaticNAT スタティックNAT設定を保持しているか +func (s *VPCRouterSetting) HasStaticNAT() bool { + return s.StaticNAT != nil && len(s.StaticNAT.Config) > 0 +} + +// AddStaticNAT スタティックNAT設定 追加 +func (s *VPCRouterSetting) AddStaticNAT(globalAddress string, privateAddress string, description string) (int, *VPCRouterStaticNATConfig) { + if s.StaticNAT == nil { + s.StaticNAT = &VPCRouterStaticNAT{ + Enabled: "True", + } + } + + if s.StaticNAT.Config == nil { + s.StaticNAT.Config = []*VPCRouterStaticNATConfig{} + } + + c := &VPCRouterStaticNATConfig{ + GlobalAddress: globalAddress, + PrivateAddress: privateAddress, + Description: description, + } + + s.StaticNAT.Config = append(s.StaticNAT.Config, c) + return len(s.StaticNAT.Config) - 1, c +} + +// RemoveStaticNAT スタティックNAT設定 削除 +func (s *VPCRouterSetting) RemoveStaticNAT(globalAddress string, privateAddress string) { + if s.StaticNAT == nil { + return + } + + if s.StaticNAT.Config == nil { + s.StaticNAT.Enabled = "False" + return + } + + dest := []*VPCRouterStaticNATConfig{} + for _, c := range s.StaticNAT.Config { + if c.GlobalAddress != globalAddress || c.PrivateAddress != privateAddress { + dest = append(dest, c) + } + } + s.StaticNAT.Config = dest + if len(s.StaticNAT.Config) == 0 { + s.StaticNAT.Enabled = "False" + s.StaticNAT.Config = nil + return + } + s.StaticNAT.Enabled = "True" +} + +// RemoveStaticNATAt スタティックNAT設定 削除 +func (s *VPCRouterSetting) RemoveStaticNATAt(index int) { + if s.StaticNAT == nil { + return + } + + if s.StaticNAT.Config == nil || len(s.StaticNAT.Config) == 0 { + s.StaticNAT.Enabled = "False" + return + } + + if index < len(s.StaticNAT.Config) { + c := s.StaticNAT.Config[index] + s.RemoveStaticNAT(c.GlobalAddress, c.PrivateAddress) + } +} + +// FindStaticNAT スタティックNAT設定検索 +func (s *VPCRouterSetting) FindStaticNAT(globalAddress string, privateAddress string) (int, *VPCRouterStaticNATConfig) { + for i, c := range s.StaticNAT.Config { + if c.GlobalAddress == globalAddress && c.PrivateAddress == privateAddress { + return i, c + } + } + return -1, nil +} + +// HasPortForwarding ポートフォワーディング設定を保持しているか +func (s *VPCRouterSetting) HasPortForwarding() bool { + return s.PortForwarding != nil && len(s.PortForwarding.Config) > 0 +} + +// VPCRouterPortForwarding ポートフォワーディング設定 +type VPCRouterPortForwarding struct { + Config []*VPCRouterPortForwardingConfig `json:",omitempty"` // ポートフォワーディング設定 + Enabled string `json:",omitempty"` // 有効/無効 +} + +// VPCRouterPortForwardingConfig ポートフォワーディング設定 +type VPCRouterPortForwardingConfig struct { + Protocol string `json:",omitempty"` // プロトコル(tcp/udp) + GlobalPort string `json:",omitempty"` // グローバル側ポート + PrivateAddress string `json:",omitempty"` // プライベートIPアドレス + PrivatePort string `json:",omitempty"` // プライベート側ポート + Description string `json:",omitempty"` // 説明 +} + +// AddPortForwarding ポートフォワーディング 追加 +func (s *VPCRouterSetting) AddPortForwarding(protocol string, globalPort string, privateAddress string, + privatePort string, description string) (int, *VPCRouterPortForwardingConfig) { + if s.PortForwarding == nil { + s.PortForwarding = &VPCRouterPortForwarding{ + Enabled: "True", + } + } + + if s.PortForwarding.Config == nil { + s.PortForwarding.Config = []*VPCRouterPortForwardingConfig{} + } + + c := &VPCRouterPortForwardingConfig{ + Protocol: protocol, + GlobalPort: globalPort, + PrivateAddress: privateAddress, + PrivatePort: privatePort, + Description: description, + } + + s.PortForwarding.Config = append(s.PortForwarding.Config, c) + + return len(s.PortForwarding.Config) - 1, c +} + +// RemovePortForwarding ポートフォワーディング 削除 +func (s *VPCRouterSetting) RemovePortForwarding(protocol string, globalPort string, privateAddress string, privatePort string) { + if s.PortForwarding == nil { + return + } + + if s.PortForwarding.Config == nil { + s.PortForwarding.Enabled = "False" + return + } + + dest := []*VPCRouterPortForwardingConfig{} + for _, c := range s.PortForwarding.Config { + if c.Protocol != protocol || c.GlobalPort != globalPort || + c.PrivateAddress != privateAddress || c.PrivatePort != privatePort { + dest = append(dest, c) + } + } + s.PortForwarding.Config = dest + if len(s.PortForwarding.Config) == 0 { + s.PortForwarding.Enabled = "False" + s.PortForwarding.Config = nil + return + } + s.PortForwarding.Enabled = "True" +} + +// RemovePortForwardingAt ポートフォワーディング 削除 +func (s *VPCRouterSetting) RemovePortForwardingAt(index int) { + if s.PortForwarding == nil { + return + } + + if s.PortForwarding.Config == nil || len(s.PortForwarding.Config) == 0 { + s.PortForwarding.Enabled = "False" + return + } + + if index < len(s.PortForwarding.Config) { + c := s.PortForwarding.Config[index] + s.RemovePortForwarding(c.Protocol, c.GlobalPort, c.PrivateAddress, c.PrivatePort) + } +} + +// FindPortForwarding ポートフォワーディング検索 +func (s *VPCRouterSetting) FindPortForwarding(protocol string, globalPort string, + privateAddress string, privatePort string) (int, *VPCRouterPortForwardingConfig) { + + for i, c := range s.PortForwarding.Config { + if c.Protocol == protocol && c.GlobalPort == globalPort && + c.PrivateAddress == privateAddress && c.PrivatePort == privatePort { + return i, c + } + } + return -1, nil +} + +// HasFirewall ファイアウォール設定を保持しているか +func (s *VPCRouterSetting) HasFirewall() bool { + return s.Firewall != nil && len(s.Firewall.Config) > 0 +} + +// VPCRouterFirewall ファイアウォール設定 +type VPCRouterFirewall struct { + Config []*VPCRouterFirewallSetting // ファイアウォール設定 + Enabled string `json:",omitempty"` // 有効/無効 +} + +// VPCRouterFirewallSetting ファイアウォール設定 +type VPCRouterFirewallSetting struct { + Receive []*VPCRouterFirewallRule // 受信ルール + Send []*VPCRouterFirewallRule // 送信ルール +} + +// VPCRouterFirewallRule ファイアウォール ルール +type VPCRouterFirewallRule struct { + Action string `json:",omitempty"` // 許可/拒否 + Protocol string `json:",omitempty"` // プロトコル + SourceNetwork string `json:",omitempty"` // 送信元ネットワーク + SourcePort string `json:",omitempty"` // 送信元ポート + DestinationNetwork string `json:",omitempty"` // 宛先ネットワーク + DestinationPort string `json:",omitempty"` // 宛先ポート + Logging string `json:",omitempty"` // ログ記録 + Description string `json:",omitempty"` // 説明 +} + +// VPCRouterMaxInterfaceCount VPCルータでの最大NIC数(グローバル含む) +const VPCRouterMaxInterfaceCount = 8 + +func (s *VPCRouterSetting) addFirewallRule(ifIndex int, direction string, rule *VPCRouterFirewallRule) int { + if ifIndex < 0 { + ifIndex = 0 + } + if s.Firewall == nil { + s.Firewall = &VPCRouterFirewall{ + Enabled: "True", + } + } + if s.Firewall.Config == nil { + s.Firewall.Config = []*VPCRouterFirewallSetting{} + } + for len(s.Firewall.Config) < VPCRouterMaxInterfaceCount { + s.Firewall.Config = append(s.Firewall.Config, &VPCRouterFirewallSetting{ + Receive: []*VPCRouterFirewallRule{}, + Send: []*VPCRouterFirewallRule{}, + }) + } + + switch direction { + case "send": + s.Firewall.Config[ifIndex].Send = append(s.Firewall.Config[ifIndex].Send, rule) + return len(s.Firewall.Config[ifIndex].Send) - 1 + case "receive": + s.Firewall.Config[ifIndex].Receive = append(s.Firewall.Config[ifIndex].Receive, rule) + return len(s.Firewall.Config[ifIndex].Receive) - 1 + } + return -1 +} + +func (s *VPCRouterSetting) removeFirewallRule(ifIndex int, direction string, rule *VPCRouterFirewallRule) { + + if s.Firewall == nil || !(len(s.Firewall.Config) < ifIndex) { + return + } + if ifIndex < 0 { + ifIndex = 0 + } + switch direction { + case "send": + dest := []*VPCRouterFirewallRule{} + for _, c := range s.Firewall.Config[ifIndex].Send { + if !s.isSameRule(rule, c) { + dest = append(dest, c) + } + } + s.Firewall.Config[ifIndex].Send = dest + case "receive": + dest := []*VPCRouterFirewallRule{} + for _, c := range s.Firewall.Config[ifIndex].Receive { + if !s.isSameRule(rule, c) { + dest = append(dest, c) + } + } + s.Firewall.Config[ifIndex].Receive = dest + } + + //if len(s.Firewall.Config) == 0 { + // s.Firewall.Enabled = "False" + // return + //} + // + //if len(s.Firewall.Config[0].Send) == 0 && len(s.Firewall.Config[0].Send) == 0 { + // s.Firewall.Enabled = "False" + // return + //} + + s.PortForwarding.Enabled = "True" + +} + +func (s *VPCRouterSetting) removeFirewallRuleAt(ifIndex int, direction string, index int) { + if s.Firewall == nil || !(len(s.Firewall.Config) < ifIndex) { + return + } + if ifIndex < 0 { + ifIndex = 0 + } + + switch direction { + case "send": + dest := []*VPCRouterFirewallRule{} + for i, c := range s.Firewall.Config[ifIndex].Send { + if i != index { + dest = append(dest, c) + } + } + s.Firewall.Config[0].Send = dest + case "receive": + dest := []*VPCRouterFirewallRule{} + for i, c := range s.Firewall.Config[ifIndex].Receive { + if i != index { + dest = append(dest, c) + } + } + s.Firewall.Config[0].Receive = dest + } + + //if len(s.Firewall.Config) == 0 { + // s.Firewall.Enabled = "False" + // return + //} + // + //if len(s.Firewall.Config[0].Send) == 0 && len(s.Firewall.Config[0].Send) == 0 { + // s.Firewall.Enabled = "False" + // return + //} + + s.PortForwarding.Enabled = "True" + +} + +func (s *VPCRouterSetting) findFirewallRule(ifIndex int, direction string, rule *VPCRouterFirewallRule) (int, *VPCRouterFirewallRule) { + if s.Firewall == nil || !(len(s.Firewall.Config) < ifIndex) { + return -1, nil + } + if ifIndex < 0 { + ifIndex = 0 + } + + switch direction { + case "send": + for i, c := range s.Firewall.Config[ifIndex].Send { + if s.isSameRule(rule, c) { + return i, c + } + } + case "receive": + for i, c := range s.Firewall.Config[ifIndex].Receive { + if s.isSameRule(rule, c) { + return i, c + } + } + } + + return -1, nil + +} + +func (s *VPCRouterSetting) isSameRule(r1 *VPCRouterFirewallRule, r2 *VPCRouterFirewallRule) bool { + return r1.Action == r2.Action && + r1.Protocol == r2.Protocol && + r1.SourceNetwork == r2.SourceNetwork && + r1.SourcePort == r2.SourcePort && + r1.DestinationNetwork == r2.DestinationNetwork && + r1.DestinationPort == r2.DestinationPort +} + +// AddFirewallRuleSend 送信ルール 追加 +func (s *VPCRouterSetting) AddFirewallRuleSend(ifIndex int, isAllow bool, protocol string, + sourceNetwork string, sourcePort string, destNetwork string, destPort string, + logging bool, description string) (int, *VPCRouterFirewallRule) { + action := "deny" + if isAllow { + action = "allow" + } + strLogging := "False" + if logging { + strLogging = "True" + } + + rule := &VPCRouterFirewallRule{ + Action: action, + Protocol: protocol, + SourceNetwork: sourceNetwork, + SourcePort: sourcePort, + DestinationNetwork: destNetwork, + DestinationPort: destPort, + Logging: strLogging, + Description: description, + } + + i := s.addFirewallRule(ifIndex, "send", rule) + return i, rule +} + +// RemoveFirewallRuleSend 送信ルール 削除 +func (s *VPCRouterSetting) RemoveFirewallRuleSend(ifIndex int, isAllow bool, protocol string, sourceNetwork string, sourcePort string, destNetwork string, destPort string) { + action := "deny" + if isAllow { + action = "allow" + } + + rule := &VPCRouterFirewallRule{ + Action: action, + Protocol: protocol, + SourceNetwork: sourceNetwork, + SourcePort: sourcePort, + DestinationNetwork: destNetwork, + DestinationPort: destPort, + } + + s.removeFirewallRule(ifIndex, "send", rule) +} + +// RemoveFirewallRuleSendAt 指定位置の送信ルールを削除 +func (s *VPCRouterSetting) RemoveFirewallRuleSendAt(ifIndex int, index int) { + s.removeFirewallRuleAt(ifIndex, "send", index) +} + +// FindFirewallRuleSend 送信ルール 検索 +func (s *VPCRouterSetting) FindFirewallRuleSend(ifIndex int, isAllow bool, protocol string, + sourceNetwork string, sourcePort string, destNetwork string, destPort string) (int, *VPCRouterFirewallRule) { + action := "deny" + if isAllow { + action = "allow" + } + rule := &VPCRouterFirewallRule{ + Action: action, + Protocol: protocol, + SourceNetwork: sourceNetwork, + SourcePort: sourcePort, + DestinationNetwork: destNetwork, + DestinationPort: destPort, + } + + return s.findFirewallRule(ifIndex, "send", rule) +} + +// AddFirewallRuleReceive 受信ルール 追加 +func (s *VPCRouterSetting) AddFirewallRuleReceive(ifIndex int, isAllow bool, protocol string, + sourceNetwork string, sourcePort string, destNetwork string, destPort string, logging bool, description string) (int, *VPCRouterFirewallRule) { + action := "deny" + if isAllow { + action = "allow" + } + strLogging := "False" + if logging { + strLogging = "True" + } + rule := &VPCRouterFirewallRule{ + Action: action, + Protocol: protocol, + SourceNetwork: sourceNetwork, + SourcePort: sourcePort, + DestinationNetwork: destNetwork, + DestinationPort: destPort, + Logging: strLogging, + Description: description, + } + + i := s.addFirewallRule(ifIndex, "receive", rule) + return i, rule +} + +// RemoveFirewallRuleReceiveAt 指定位置の受信ルールを削除 +func (s *VPCRouterSetting) RemoveFirewallRuleReceiveAt(ifIndex int, index int) { + s.removeFirewallRuleAt(ifIndex, "receive", index) +} + +// RemoveFirewallRuleReceive 受信ルール 削除 +func (s *VPCRouterSetting) RemoveFirewallRuleReceive(ifIndex int, isAllow bool, protocol string, sourceNetwork string, sourcePort string, destNetwork string, destPort string) { + action := "deny" + if isAllow { + action = "allow" + } + rule := &VPCRouterFirewallRule{ + Action: action, + Protocol: protocol, + SourceNetwork: sourceNetwork, + SourcePort: sourcePort, + DestinationNetwork: destNetwork, + DestinationPort: destPort, + } + + s.removeFirewallRule(ifIndex, "receive", rule) +} + +// FindFirewallRuleReceive 受信ルール 検索 +func (s *VPCRouterSetting) FindFirewallRuleReceive(ifIndex int, isAllow bool, protocol string, + sourceNetwork string, sourcePort string, destNetwork string, destPort string) (int, *VPCRouterFirewallRule) { + action := "deny" + if isAllow { + action = "allow" + } + rule := &VPCRouterFirewallRule{ + Action: action, + Protocol: protocol, + SourceNetwork: sourceNetwork, + SourcePort: sourcePort, + DestinationNetwork: destNetwork, + DestinationPort: destPort, + } + + return s.findFirewallRule(ifIndex, "receive", rule) +} + +// HasDHCPServer DHCPサーバー設定を保持しているか +func (s *VPCRouterSetting) HasDHCPServer() bool { + return s.DHCPServer != nil && len(s.DHCPServer.Config) > 0 +} + +// VPCRouterDHCPServer DHCPサーバー設定 +type VPCRouterDHCPServer struct { + Config []*VPCRouterDHCPServerConfig `json:",omitempty"` // DHCPサーバー設定 + Enabled string `json:",omitempty"` // 有効/無効 +} + +// VPCRouterDHCPServerConfig DHCPサーバー設定 +type VPCRouterDHCPServerConfig struct { + Interface string `json:",omitempty"` // 対象NIC + RangeStart string `json:",omitempty"` // 割り当て範囲 開始アドレス + RangeStop string `json:",omitempty"` // 割り当て範囲 終了アドレス + DNSServers []string // 配布するDNSサーバIPアドレスのリスト +} + +// InterfaceIndex 対象NICのインデックス +func (c *VPCRouterDHCPServerConfig) InterfaceIndex() int { + strIndex := strings.Replace(c.Interface, "eth", "", -1) + index, err := strconv.Atoi(strIndex) + if err != nil { + return -1 + } + return index +} + +// AddDHCPServer DHCPサーバー設定追加 +func (s *VPCRouterSetting) AddDHCPServer(nicIndex int, rangeStart string, rangeStop string, dnsServers ...string) (int, *VPCRouterDHCPServerConfig) { + if s.DHCPServer == nil { + s.DHCPServer = &VPCRouterDHCPServer{ + Enabled: "True", + } + } + if s.DHCPServer.Config == nil { + s.DHCPServer.Config = []*VPCRouterDHCPServerConfig{} + } + + nic := fmt.Sprintf("eth%d", nicIndex) + c := &VPCRouterDHCPServerConfig{ + Interface: nic, + RangeStart: rangeStart, + RangeStop: rangeStop, + DNSServers: dnsServers, + } + s.DHCPServer.Config = append(s.DHCPServer.Config, c) + + return len(s.DHCPServer.Config) - 1, c +} + +// RemoveDHCPServer DHCPサーバー設定削除 +func (s *VPCRouterSetting) RemoveDHCPServer(nicIndex int) { + if s.DHCPServer == nil { + return + } + + if s.DHCPServer.Config == nil { + s.DHCPServer.Enabled = "False" + return + } + + dest := []*VPCRouterDHCPServerConfig{} + for _, c := range s.DHCPServer.Config { + if c.Interface != fmt.Sprintf("eth%d", nicIndex) { + dest = append(dest, c) + } + } + s.DHCPServer.Config = dest + + if len(s.DHCPServer.Config) == 0 { + s.DHCPServer.Enabled = "False" + s.DHCPServer.Config = nil + return + } + s.DHCPServer.Enabled = "True" + +} + +// RemoveDHCPServerAt DHCPサーバー設定削除 +func (s *VPCRouterSetting) RemoveDHCPServerAt(nicIndex int) { + s.RemoveDHCPServer(nicIndex) +} + +// FindDHCPServer DHCPサーバー設定 検索 +func (s *VPCRouterSetting) FindDHCPServer(nicIndex int) (int, *VPCRouterDHCPServerConfig) { + for i, c := range s.DHCPServer.Config { + if c.InterfaceIndex() == nicIndex { + return i, c + } + } + return -1, nil +} + +// FindDHCPServerAt DHCPサーバー設定 検索 +func (s *VPCRouterSetting) FindDHCPServerAt(nicIndex int) (int, *VPCRouterDHCPServerConfig) { + return s.FindDHCPServer(nicIndex) +} + +// FindBelongsDHCPServer 指定のIPアドレスが所属するIPレンジを持つをDHCPサーバを検索 +func (s *VPCRouterSetting) FindBelongsDHCPServer(ip net.IP) (int, *VPCRouterDHCPServerConfig) { + target := ip.To4() + for i, c := range s.DHCPServer.Config { + start := net.ParseIP(c.RangeStart).To4() + end := net.ParseIP(c.RangeStop).To4() + + if bytes.Compare(target, start) >= 0 && bytes.Compare(target, end) <= 0 { + return i, c + } + } + return -1, nil +} + +// HasDHCPStaticMapping DHCPスタティックマッピング設定を保持しているか +func (s *VPCRouterSetting) HasDHCPStaticMapping() bool { + return s.DHCPStaticMapping != nil && len(s.DHCPStaticMapping.Config) > 0 +} + +// VPCRouterDHCPStaticMapping DHCPスタティックマッピング設定 +type VPCRouterDHCPStaticMapping struct { + Config []*VPCRouterDHCPStaticMappingConfig `json:",omitempty"` // DHCPスタティックマッピング設定 + Enabled string `json:",omitempty"` // 有効/無効 +} + +// VPCRouterDHCPStaticMappingConfig DHCPスタティックマッピング設定 +type VPCRouterDHCPStaticMappingConfig struct { + IPAddress string `json:",omitempty"` // 割り当てIPアドレス + MACAddress string `json:",omitempty"` // ソースMACアドレス +} + +// AddDHCPStaticMapping DHCPスタティックマッピング設定追加 +func (s *VPCRouterSetting) AddDHCPStaticMapping(ipAddress string, macAddress string) (int, *VPCRouterDHCPStaticMappingConfig) { + if s.DHCPStaticMapping == nil { + s.DHCPStaticMapping = &VPCRouterDHCPStaticMapping{ + Enabled: "True", + } + } + if s.DHCPStaticMapping.Config == nil { + s.DHCPStaticMapping.Config = []*VPCRouterDHCPStaticMappingConfig{} + } + + c := &VPCRouterDHCPStaticMappingConfig{ + IPAddress: ipAddress, + MACAddress: macAddress, + } + s.DHCPStaticMapping.Config = append(s.DHCPStaticMapping.Config, c) + return len(s.DHCPStaticMapping.Config) - 1, c +} + +// RemoveDHCPStaticMapping DHCPスタティックマッピング設定 削除 +func (s *VPCRouterSetting) RemoveDHCPStaticMapping(ipAddress string, macAddress string) { + if s.DHCPStaticMapping == nil { + return + } + + if s.DHCPStaticMapping.Config == nil { + s.DHCPStaticMapping.Enabled = "False" + return + } + + dest := []*VPCRouterDHCPStaticMappingConfig{} + for _, c := range s.DHCPStaticMapping.Config { + if c.IPAddress != ipAddress || c.MACAddress != macAddress { + dest = append(dest, c) + } + } + s.DHCPStaticMapping.Config = dest + + if len(s.DHCPStaticMapping.Config) == 0 { + s.DHCPStaticMapping.Enabled = "False" + s.DHCPStaticMapping.Config = nil + return + } + s.DHCPStaticMapping.Enabled = "True" + +} + +// RemoveDHCPStaticMappingAt DHCPスタティックマッピング設定 削除 +func (s *VPCRouterSetting) RemoveDHCPStaticMappingAt(index int) { + if s.DHCPStaticMapping == nil { + return + } + + if s.DHCPStaticMapping.Config == nil || len(s.DHCPStaticMapping.Config) == 0 { + s.DHCPStaticMapping.Enabled = "False" + return + } + + if index < len(s.DHCPStaticMapping.Config) { + c := s.DHCPStaticMapping.Config[index] + s.RemoveDHCPStaticMapping(c.IPAddress, c.MACAddress) + } +} + +// FindDHCPStaticMapping DHCPスタティックマッピング設定 検索 +func (s *VPCRouterSetting) FindDHCPStaticMapping(ipAddress string, macAddress string) (int, *VPCRouterDHCPStaticMappingConfig) { + for i, c := range s.DHCPStaticMapping.Config { + if c.IPAddress == ipAddress && c.MACAddress == macAddress { + return i, c + } + } + return -1, nil +} + +// HasL2TPIPsecServer L2TP/IPSecサーバを保持しているか +func (s *VPCRouterSetting) HasL2TPIPsecServer() bool { + return s.L2TPIPsecServer != nil && s.L2TPIPsecServer.Config != nil +} + +// VPCRouterL2TPIPsecServer L2TP/IPSecサーバー設定 +type VPCRouterL2TPIPsecServer struct { + Config *VPCRouterL2TPIPsecServerConfig `json:",omitempty"` // L2TP/IPSecサーバー設定 + Enabled string `json:",omitempty"` // 有効/無効 +} + +// VPCRouterL2TPIPsecServerConfig L2TP/IPSecサーバー設定 +type VPCRouterL2TPIPsecServerConfig struct { + PreSharedSecret string `json:",omitempty"` // 事前共有シークレット + RangeStart string `json:",omitempty"` // 割り当て範囲 開始IPアドレス + RangeStop string `json:",omitempty"` // 割り当て範囲 終了IPアドレス +} + +// EnableL2TPIPsecServer L2TP/IPSecサーバー設定 有効化 +func (s *VPCRouterSetting) EnableL2TPIPsecServer(preSharedSecret string, rangeStart string, rangeStop string) { + if s.L2TPIPsecServer == nil { + s.L2TPIPsecServer = &VPCRouterL2TPIPsecServer{ + Enabled: "True", + } + } + s.L2TPIPsecServer.Config = &VPCRouterL2TPIPsecServerConfig{ + PreSharedSecret: preSharedSecret, + RangeStart: rangeStart, + RangeStop: rangeStop, + } +} + +// DisableL2TPIPsecServer L2TP/IPSecサーバー設定 無効化 +func (s *VPCRouterSetting) DisableL2TPIPsecServer() { + if s.L2TPIPsecServer == nil { + s.L2TPIPsecServer = &VPCRouterL2TPIPsecServer{} + } + s.L2TPIPsecServer.Enabled = "False" + s.L2TPIPsecServer.Config = nil +} + +// HasPPTPServer PPTPサーバを保持しているか +func (s *VPCRouterSetting) HasPPTPServer() bool { + return s.PPTPServer != nil && s.PPTPServer.Config != nil +} + +// VPCRouterPPTPServer PPTPサーバー設定 +type VPCRouterPPTPServer struct { + Config *VPCRouterPPTPServerConfig `json:",omitempty"` // PPTPサーバー設定 + Enabled string `json:",omitempty"` // 有効/無効 +} + +// VPCRouterPPTPServerConfig PPTPサーバー設定 +type VPCRouterPPTPServerConfig struct { + RangeStart string `json:",omitempty"` // 割り当て範囲 開始IPアドレス + RangeStop string `json:",omitempty"` // 割り当て範囲 終了IPアドレス +} + +// EnablePPTPServer PPTPサーバー設定 有効化 +func (s *VPCRouterSetting) EnablePPTPServer(rangeStart string, rangeStop string) { + if s.PPTPServer == nil { + s.PPTPServer = &VPCRouterPPTPServer{ + Enabled: "True", + } + } + s.PPTPServer.Config = &VPCRouterPPTPServerConfig{ + RangeStart: rangeStart, + RangeStop: rangeStop, + } +} + +// DisablePPTPServer PPTPサーバー設定 無効化 +func (s *VPCRouterSetting) DisablePPTPServer() { + if s.PPTPServer == nil { + s.PPTPServer = &VPCRouterPPTPServer{} + } + s.PPTPServer.Enabled = "False" + s.PPTPServer.Config = nil +} + +// HasRemoteAccessUsers リモートアクセスユーザー設定を保持しているか +func (s *VPCRouterSetting) HasRemoteAccessUsers() bool { + return s.RemoteAccessUsers != nil && len(s.RemoteAccessUsers.Config) > 0 +} + +// VPCRouterRemoteAccessUsers リモートアクセスユーザー設定 +type VPCRouterRemoteAccessUsers struct { + Config []*VPCRouterRemoteAccessUsersConfig `json:",omitempty"` // リモートアクセスユーザー設定 + Enabled string `json:",omitempty"` // 有効/無効 +} + +// VPCRouterRemoteAccessUsersConfig リモートアクセスユーザー設定 +type VPCRouterRemoteAccessUsersConfig struct { + UserName string `json:",omitempty"` // ユーザー名 + Password string `json:",omitempty"` // パスワード +} + +// AddRemoteAccessUser リモートアクセスユーザー設定 追加 +func (s *VPCRouterSetting) AddRemoteAccessUser(userName string, password string) (int, *VPCRouterRemoteAccessUsersConfig) { + if s.RemoteAccessUsers == nil { + s.RemoteAccessUsers = &VPCRouterRemoteAccessUsers{ + Enabled: "True", + } + } + if s.RemoteAccessUsers.Config == nil { + s.RemoteAccessUsers.Config = []*VPCRouterRemoteAccessUsersConfig{} + } + + c := &VPCRouterRemoteAccessUsersConfig{ + UserName: userName, + Password: password, + } + s.RemoteAccessUsers.Config = append(s.RemoteAccessUsers.Config, c) + return len(s.RemoteAccessUsers.Config) - 1, c +} + +// RemoveRemoteAccessUser リモートアクセスユーザー設定 削除 +func (s *VPCRouterSetting) RemoveRemoteAccessUser(userName string, password string) { + if s.RemoteAccessUsers == nil { + return + } + + if s.RemoteAccessUsers.Config == nil { + s.RemoteAccessUsers.Enabled = "False" + return + } + + dest := []*VPCRouterRemoteAccessUsersConfig{} + for _, c := range s.RemoteAccessUsers.Config { + if c.UserName != userName || c.Password != password { + dest = append(dest, c) + } + } + s.RemoteAccessUsers.Config = dest + + if len(s.RemoteAccessUsers.Config) == 0 { + s.RemoteAccessUsers.Enabled = "False" + s.RemoteAccessUsers.Config = nil + return + } + s.RemoteAccessUsers.Enabled = "True" +} + +// RemoveRemoteAccessUserAt リモートアクセスユーザー設定 削除 +func (s *VPCRouterSetting) RemoveRemoteAccessUserAt(index int) { + if s.RemoteAccessUsers == nil { + return + } + + if s.RemoteAccessUsers.Config == nil || len(s.RemoteAccessUsers.Config) == 0 { + s.RemoteAccessUsers.Enabled = "False" + return + } + + if index < len(s.RemoteAccessUsers.Config) { + c := s.RemoteAccessUsers.Config[index] + s.RemoveRemoteAccessUser(c.UserName, c.Password) + } +} + +// FindRemoteAccessUser リモートアクセスユーザー設定 検索 +func (s *VPCRouterSetting) FindRemoteAccessUser(userName string, password string) (int, *VPCRouterRemoteAccessUsersConfig) { + for i, c := range s.RemoteAccessUsers.Config { + if c.UserName == userName && c.Password == password { + return i, c + } + } + return -1, nil +} + +// HasSiteToSiteIPsecVPN サイト間VPN設定を保持しているか +func (s *VPCRouterSetting) HasSiteToSiteIPsecVPN() bool { + return s.SiteToSiteIPsecVPN != nil && len(s.SiteToSiteIPsecVPN.Config) > 0 +} + +// VPCRouterSiteToSiteIPsecVPN サイト間VPN設定 +type VPCRouterSiteToSiteIPsecVPN struct { + Config []*VPCRouterSiteToSiteIPsecVPNConfig `json:",omitempty"` // サイト間VPC設定 + Enabled string `json:",omitempty"` // 有効/無効 +} + +// VPCRouterSiteToSiteIPsecVPNConfig サイト間VPN設定 +type VPCRouterSiteToSiteIPsecVPNConfig struct { + LocalPrefix []string `json:",omitempty"` // ローカルプレフィックス リスト + Peer string `json:",omitempty"` // 対向IPアドレス + PreSharedSecret string `json:",omitempty"` // 事前共有シークレット + RemoteID string `json:",omitempty"` // 対向ID + Routes []string `json:",omitempty"` // 対向プレフィックス リスト +} + +// AddSiteToSiteIPsecVPN サイト間VPN設定 追加 +func (s *VPCRouterSetting) AddSiteToSiteIPsecVPN(localPrefix []string, peer string, + preSharedSecret string, remoteID string, routes []string) (int, *VPCRouterSiteToSiteIPsecVPNConfig) { + if s.SiteToSiteIPsecVPN == nil { + s.SiteToSiteIPsecVPN = &VPCRouterSiteToSiteIPsecVPN{ + Enabled: "True", + } + } else { + s.SiteToSiteIPsecVPN.Enabled = "True" + } + + if s.SiteToSiteIPsecVPN.Config == nil { + s.SiteToSiteIPsecVPN.Config = []*VPCRouterSiteToSiteIPsecVPNConfig{} + } + + c := &VPCRouterSiteToSiteIPsecVPNConfig{ + LocalPrefix: localPrefix, + Peer: peer, + PreSharedSecret: preSharedSecret, + RemoteID: remoteID, + Routes: routes, + } + s.SiteToSiteIPsecVPN.Config = append(s.SiteToSiteIPsecVPN.Config, c) + return len(s.SiteToSiteIPsecVPN.Config) - 1, c +} + +// RemoveSiteToSiteIPsecVPN サイト間VPN設定 削除 +func (s *VPCRouterSetting) RemoveSiteToSiteIPsecVPN(localPrefix []string, peer string, preSharedSecret string, remoteID string, routes []string) { + config := &VPCRouterSiteToSiteIPsecVPNConfig{ + LocalPrefix: localPrefix, + Peer: peer, + PreSharedSecret: preSharedSecret, + RemoteID: remoteID, + Routes: routes, + } + + if s.SiteToSiteIPsecVPN == nil { + return + } + + if s.SiteToSiteIPsecVPN.Config == nil { + s.SiteToSiteIPsecVPN.Enabled = "False" + return + } + + dest := []*VPCRouterSiteToSiteIPsecVPNConfig{} + for _, c := range s.SiteToSiteIPsecVPN.Config { + if !s.isSameSiteToSiteIPsecVPNConfig(c, config) { + dest = append(dest, c) + } + } + s.SiteToSiteIPsecVPN.Config = dest + + if len(s.SiteToSiteIPsecVPN.Config) == 0 { + s.SiteToSiteIPsecVPN.Enabled = "False" + s.SiteToSiteIPsecVPN.Config = nil + return + } + s.SiteToSiteIPsecVPN.Enabled = "True" +} + +// RemoveSiteToSiteIPsecVPNAt サイト間VPN設定 削除 +func (s *VPCRouterSetting) RemoveSiteToSiteIPsecVPNAt(index int) { + if s.SiteToSiteIPsecVPN == nil { + return + } + + if s.SiteToSiteIPsecVPN.Config == nil || len(s.SiteToSiteIPsecVPN.Config) == 0 { + s.SiteToSiteIPsecVPN.Enabled = "False" + return + } + + if index < len(s.SiteToSiteIPsecVPN.Config) { + c := s.SiteToSiteIPsecVPN.Config[index] + s.RemoveSiteToSiteIPsecVPN(c.LocalPrefix, c.Peer, c.PreSharedSecret, c.RemoteID, c.Routes) + } +} + +// FindSiteToSiteIPsecVPN サイト間VPC設定 検索 +func (s *VPCRouterSetting) FindSiteToSiteIPsecVPN(localPrefix []string, peer string, + preSharedSecret string, remoteID string, routes []string) (int, *VPCRouterSiteToSiteIPsecVPNConfig) { + config := &VPCRouterSiteToSiteIPsecVPNConfig{ + LocalPrefix: localPrefix, + Peer: peer, + PreSharedSecret: preSharedSecret, + RemoteID: remoteID, + Routes: routes, + } + + for i, c := range s.SiteToSiteIPsecVPN.Config { + if s.isSameSiteToSiteIPsecVPNConfig(c, config) { + return i, c + } + } + return -1, nil +} + +func (s *VPCRouterSetting) isSameSiteToSiteIPsecVPNConfig(c1 *VPCRouterSiteToSiteIPsecVPNConfig, c2 *VPCRouterSiteToSiteIPsecVPNConfig) bool { + return reflect.DeepEqual(c1.LocalPrefix, c2.LocalPrefix) && + c1.Peer == c2.Peer && + c1.PreSharedSecret == c2.PreSharedSecret && + c1.RemoteID == c2.RemoteID && + reflect.DeepEqual(c1.Routes, c2.Routes) +} + +// HasStaticRoutes スタティックルートを保持しているか +func (s *VPCRouterSetting) HasStaticRoutes() bool { + return s.StaticRoutes != nil && len(s.StaticRoutes.Config) > 0 +} + +// VPCRouterStaticRoutes スタティックルート設定 +type VPCRouterStaticRoutes struct { + Config []*VPCRouterStaticRoutesConfig `json:",omitempty"` // スタティックルート設定 + Enabled string `json:",omitempty"` // 有効/無効 +} + +// VPCRouterStaticRoutesConfig スタティックルート設定 +type VPCRouterStaticRoutesConfig struct { + Prefix string `json:",omitempty"` // プレフィックス + NextHop string `json:",omitempty"` // ネクストホップ +} + +// AddStaticRoute スタティックルート設定 追加 +func (s *VPCRouterSetting) AddStaticRoute(prefix string, nextHop string) (int, *VPCRouterStaticRoutesConfig) { + if s.StaticRoutes == nil { + s.StaticRoutes = &VPCRouterStaticRoutes{ + Enabled: "True", + } + } + if s.StaticRoutes.Config == nil { + s.StaticRoutes.Config = []*VPCRouterStaticRoutesConfig{} + } + + c := &VPCRouterStaticRoutesConfig{ + Prefix: prefix, + NextHop: nextHop, + } + s.StaticRoutes.Config = append(s.StaticRoutes.Config, c) + return len(s.StaticRoutes.Config) - 1, c +} + +// RemoveStaticRoute スタティックルート設定 削除 +func (s *VPCRouterSetting) RemoveStaticRoute(prefix string, nextHop string) { + if s.StaticRoutes == nil { + return + } + + if s.StaticRoutes.Config == nil { + s.StaticRoutes.Enabled = "False" + return + } + + dest := []*VPCRouterStaticRoutesConfig{} + for _, c := range s.StaticRoutes.Config { + if c.Prefix != prefix || c.NextHop != nextHop { + dest = append(dest, c) + } + } + s.StaticRoutes.Config = dest + + if len(s.StaticRoutes.Config) == 0 { + s.StaticRoutes.Enabled = "False" + s.StaticRoutes.Config = nil + return + } + s.StaticRoutes.Enabled = "True" +} + +// RemoveStaticRouteAt スタティックルート設定 削除 +func (s *VPCRouterSetting) RemoveStaticRouteAt(index int) { + if s.StaticRoutes == nil { + return + } + + if s.StaticRoutes.Config == nil || len(s.StaticRoutes.Config) == 0 { + s.StaticRoutes.Enabled = "False" + return + } + + if index < len(s.StaticRoutes.Config) { + c := s.StaticRoutes.Config[index] + s.RemoveStaticRoute(c.Prefix, c.NextHop) + } +} + +// FindStaticRoute スタティックルート設定 検索 +func (s *VPCRouterSetting) FindStaticRoute(prefix string, nextHop string) (int, *VPCRouterStaticRoutesConfig) { + for i, c := range s.StaticRoutes.Config { + if c.Prefix == prefix && c.NextHop == nextHop { + return i, c + } + } + return -1, nil +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/vpc_router_status.go b/vendor/github.com/sacloud/libsacloud/sacloud/vpc_router_status.go new file mode 100644 index 00000000..ffe0ea0e --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/vpc_router_status.go @@ -0,0 +1,8 @@ +package sacloud + +// VPCRouterStatus VPCルータのステータス情報 +type VPCRouterStatus struct { + FirewallReceiveLogs []string + FirewallSendLogs []string + VPNLogs []string +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/webaccel.go b/vendor/github.com/sacloud/libsacloud/sacloud/webaccel.go new file mode 100644 index 00000000..b7282b29 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/webaccel.go @@ -0,0 +1,201 @@ +package sacloud + +import ( + "encoding/json" + "fmt" + "strconv" + "strings" +) + +// EWebAccelDomainType ウェブアクセラレータ ドメイン種別 +type EWebAccelDomainType string + +const ( + // EWebAccelDomainTypeOwn 独自ドメイン + EWebAccelDomainTypeOwn = EWebAccelDomainType("own_domain") + // EWebAccelDomainTypeSubDomain サブドメイン + EWebAccelDomainTypeSubDomain = EWebAccelDomainType("subdomain") +) + +// EWebAccelStatus ウェブアクセラレータ ステータス +type EWebAccelStatus string + +const ( + // EWebAccelStatusEnabled 状態:有効 + EWebAccelStatusEnabled = EWebAccelStatus("enabled") + // EWebAccelStatusDisabled 状態:無効 + EWebAccelStatusDisabled = EWebAccelStatus("disabled") +) + +// WebAccelSite ウェブアクセラレータ サイト +type WebAccelSite struct { + ID string // ID + Name string `json:",omitempty"` + DomainType EWebAccelDomainType `json:",omitempty"` + Domain string `json:",omitempty"` + Subdomain string `json:",omitempty"` + ASCIIDomain string `json:",omitempty"` + Origin string `json:",omitempty"` + HostHeader string + Status EWebAccelStatus `json:",omitempty"` + HasCertificate bool `json:",omitempty"` + HasOldCertificate bool `json:",omitempty"` + GibSentInLastWeek int64 `json:",omitempty"` + CertValidNotBefore int64 `json:",omitempty"` + CertValidNotAfter int64 `json:",omitempty"` + propCreatedAt +} + +// SetID ID 設定 +func (n *WebAccelSite) SetID(id int64) { + n.ID = fmt.Sprintf("%d", id) +} + +// GetID ID 取得 +func (n *WebAccelSite) GetID() int64 { + if n == nil { + return -1 + } + i, err := strconv.ParseInt(n.ID, 10, 64) + if err != nil { + return -1 + } + return i +} + +// GetStrID 文字列でID取得 +func (n *WebAccelSite) GetStrID() string { + if n == nil { + return "" + } + return n.ID +} + +// GetName 名称取得 +func (n *WebAccelSite) GetName() string { + if n == nil { + return "" + } + return n.Name +} + +// SetName 名称取得 +func (n *WebAccelSite) SetName(name string) { + if n == nil { + return + } + n.Name = name +} + +// WebAccelCert ウェブアクセラレータ証明書 +type WebAccelCert struct { + ID string `json:",omitempty"` + SiteID string `json:",omitempty"` + CertificateChain string `json:",omitempty"` + Key string `json:",omitempty"` + propCreatedAt `json:",omitempty"` + propUpdatedAt `json:",omitempty"` + + SerialNumber string `json:",omitempty"` + NotBefore int64 `json:",omitempty"` + NotAfter int64 `json:",omitempty"` + Issuer *struct { + Country string `json:",omitempty"` + Organization string `json:",omitempty"` + OrganizationalUnit string `json:",omitempty"` + CommonName string `json:",omitempty"` + } `json:",omitempty"` + Subject *struct { + Country string `json:",omitempty"` + Organization string `json:",omitempty"` + OrganizationalUnit string `json:",omitempty"` + Locality string `json:",omitempty"` + Province string `json:",omitempty"` + StreetAddress string `json:",omitempty"` + PostalCode string `json:",omitempty"` + SerialNumber string `json:",omitempty"` + CommonName string `json:",omitempty"` + } `json:",omitempty"` + DNSNames []string `json:",omitempty"` + SHA256Fingerprint string `json:",omitempty"` +} + +// SetID ID 設定 +func (n *WebAccelCert) SetID(id int64) { + n.ID = fmt.Sprintf("%d", id) +} + +// GetID ID 取得 +func (n *WebAccelCert) GetID() int64 { + if n == nil { + return -1 + } + i, err := strconv.ParseInt(n.ID, 10, 64) + if err != nil { + return -1 + } + return i +} + +// GetStrID 文字列でID取得 +func (n *WebAccelCert) GetStrID() string { + if n == nil { + return "" + } + return n.ID +} + +// WebAccelCertRequest ウェブアクセラレータ証明書API リクエスト +type WebAccelCertRequest struct { + CertificateChain string + Key string `json:",omitempty"` +} + +// WebAccelCertResponse ウェブアクセラレータ証明書API レスポンス +type WebAccelCertResponse struct { + Certificate *WebAccelCertResponseBody `json:",omitempty"` + ResultFlagValue +} + +// WebAccelCertResponseBody ウェブアクセラレータ証明書API レスポンスボディ +type WebAccelCertResponseBody struct { + Current *WebAccelCert `json:",omitempty"` + Old []*WebAccelCert `json:",omitempty"` +} + +// UnmarshalJSON JSONアンマーシャル(配列、オブジェクトが混在するためここで対応) +func (s *WebAccelCertResponse) UnmarshalJSON(data []byte) error { + tmp := &struct { + Certificate *WebAccelCertResponseBody `json:",omitempty"` + ResultFlagValue + }{} + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + if tmp.Certificate.Current != nil || len(tmp.Certificate.Old) > 0 { + s.Certificate = tmp.Certificate + } + s.ResultFlagValue = tmp.ResultFlagValue + return nil +} + +// UnmarshalJSON JSONアンマーシャル(配列、オブジェクトが混在するためここで対応) +func (s *WebAccelCertResponseBody) UnmarshalJSON(data []byte) error { + targetData := strings.Replace(strings.Replace(string(data), " ", "", -1), "\n", "", -1) + if targetData == `[]` { + return nil + } + + tmp := &struct { + Current *WebAccelCert `json:",omitempty"` + Old []*WebAccelCert `json:",omitempty"` + }{} + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + s.Current = tmp.Current + s.Old = tmp.Old + return nil +} diff --git a/vendor/github.com/sacloud/libsacloud/sacloud/zone.go b/vendor/github.com/sacloud/libsacloud/sacloud/zone.go new file mode 100644 index 00000000..c3ae58f9 --- /dev/null +++ b/vendor/github.com/sacloud/libsacloud/sacloud/zone.go @@ -0,0 +1,46 @@ +package sacloud + +// Zone ゾーン +type Zone struct { + *Resource // ID + propName // 名称 + propDescription // 説明 + propRegion // リージョン + + IsDummy bool `json:",omitempty"` // IsDummy ダミーフラグ + + VNCProxy struct { // VNCProxy VPCプロキシ + HostName string `json:",omitempty"` // HostName ホスト名 + IPAddress string `json:",omitempty"` // IPAddress IPアドレス + } `json:",omitempty"` + + FTPServer struct { // FTPServer FTPサーバー + HostName string `json:",omitempty"` // HostName ホスト名 + IPAddress string `json:",omitempty"` // IPAddress IPアドレス + } `json:",omitempty"` +} + +// ZoneIsDummy ダミーフラグ 取得 +func (z *Zone) ZoneIsDummy() bool { + return z.IsDummy +} + +// GetVNCProxyHostName VNCプロキシホスト名 取得 +func (z *Zone) GetVNCProxyHostName() string { + return z.VNCProxy.HostName +} + +// GetVPCProxyIPAddress VNCプロキシIPアドレス 取得 +func (z *Zone) GetVPCProxyIPAddress() string { + return z.VNCProxy.IPAddress +} + +// GetFTPHostName FTPサーバーホスト名 取得 +func (z *Zone) GetFTPHostName() string { + return z.FTPServer.HostName +} + +// GetFTPServerIPAddress FTPサーバーIPアドレス 取得 +func (z *Zone) GetFTPServerIPAddress() string { + return z.FTPServer.IPAddress +}