Skip to content

Commit 4034ead

Browse files
Engin Dirialexellis
authored andcommitted
Add OVH as new cloud provider for inletsctl
Signed-off-by: Engin Diri <[email protected]>
1 parent d03fe02 commit 4034ead

File tree

4 files changed

+76
-23
lines changed

4 files changed

+76
-23
lines changed

cmd/create.go

Lines changed: 56 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ func init() {
2626

2727
inletsCmd.AddCommand(createCmd)
2828

29-
createCmd.Flags().StringP("provider", "p", "digitalocean", "The cloud provider - digitalocean, gce, ec2, azure, equinix-metal, scaleway, linode, civo, hetzner or vultr")
29+
createCmd.Flags().StringP("provider", "p", "digitalocean", "The cloud provider - digitalocean, gce, ec2, azure, equinix-metal, scaleway, linode, civo, hetzner, ovh or vultr")
3030
createCmd.Flags().StringP("region", "r", "lon1", "The region for your cloud provider")
3131
createCmd.Flags().StringP("plan", "s", "", "The plan or size for your cloud instance")
3232
createCmd.Flags().StringP("zone", "z", "us-central1-a", "The zone for the exit-server (gce)")
@@ -43,9 +43,12 @@ func init() {
4343
createCmd.Flags().String("session-token-file", "", "Read this file for the session token for ec2 (when using with temporary credentials)")
4444

4545
createCmd.Flags().String("organisation-id", "", "Organisation ID (scaleway)")
46-
createCmd.Flags().String("project-id", "", "Project ID (equinix-metal, gce)")
46+
createCmd.Flags().String("project-id", "", "Project ID (equinix-metal, gce, ovh)")
4747
createCmd.Flags().String("subscription-id", "", "Subscription ID (Azure)")
4848

49+
createCmd.Flags().String("endpoint", "ovh-eu", "API endpoint (ovh), default: ovh-eu")
50+
createCmd.Flags().String("consumer-key", "", "The Consumer Key for using the OVH API")
51+
4952
createCmd.Flags().Bool("tcp", true, `Provision an exit-server with inlets PRO running as a TCP server`)
5053

5154
createCmd.Flags().StringArray("letsencrypt-domain", []string{}, `Domains you want to get a Let's Encrypt certificate for`)
@@ -145,6 +148,8 @@ func runCreate(cmd *cobra.Command, _ []string) error {
145148
region = "LHR" // London
146149
} else if provider == "linode" {
147150
region = "eu-west"
151+
} else if provider == "ovh" {
152+
region = "DE1"
148153
}
149154

150155
var zone string
@@ -161,14 +166,21 @@ func runCreate(cmd *cobra.Command, _ []string) error {
161166
var projectID string
162167
var vpcID string
163168
var subnetID string
164-
if provider == "scaleway" || provider == "ec2" {
169+
if provider == "scaleway" || provider == "ec2" || provider == "ovh" {
165170

166171
var secretKeyErr error
167172
secretKey, secretKeyErr = getFileOrString(cmd.Flags(), "secret-key-file", "secret-key", true)
168173
if secretKeyErr != nil {
169174
return secretKeyErr
170175
}
171176

177+
if provider == "ovh" {
178+
projectID, _ = cmd.Flags().GetString("project-id")
179+
if len(projectID) == 0 {
180+
return fmt.Errorf("--project-id flag must be set")
181+
}
182+
}
183+
172184
if provider == "scaleway" {
173185
organisationID, _ = cmd.Flags().GetString("organisation-id")
174186
if len(organisationID) == 0 {
@@ -209,7 +221,20 @@ func runCreate(cmd *cobra.Command, _ []string) error {
209221
subscriptionID, _ = cmd.Flags().GetString("subscription-id")
210222
}
211223

212-
provisioner, err := getProvisioner(provider, accessToken, secretKey, organisationID, region, subscriptionID, sessionToken)
224+
var endpoint string
225+
var consumerKey string
226+
if provider == "ovh" {
227+
endpoint, err = cmd.Flags().GetString("endpoint")
228+
if err != nil {
229+
return errors.Wrap(err, "failed to get 'endpoint' value")
230+
}
231+
consumerKey, err = cmd.Flags().GetString("consumer-key")
232+
if err != nil {
233+
return errors.Wrap(err, "failed to get 'endpoint' value")
234+
}
235+
}
236+
237+
provisioner, err := getProvisioner(provider, accessToken, secretKey, organisationID, region, subscriptionID, sessionToken, endpoint, consumerKey, projectID)
213238

214239
if err != nil {
215240
return err
@@ -382,29 +407,35 @@ To delete:
382407
return err
383408
}
384409

385-
func getProvisioner(provider, accessToken, secretKey, organisationID, region, subscriptionID, sessionToken string) (provision.Provisioner, error) {
386-
if provider == "digitalocean" {
410+
func getProvisioner(provider, accessToken, secretKey, organisationID, region, subscriptionID, sessionToken, endpoint, consumerKey, projectID string) (provision.Provisioner, error) {
411+
412+
switch provider {
413+
case "digitalocean":
387414
return provision.NewDigitalOceanProvisioner(accessToken)
388-
} else if provider == EquinixMetalProvider {
415+
case EquinixMetalProvider:
389416
return provision.NewEquinixMetalProvisioner(accessToken)
390-
} else if provider == "civo" {
417+
case "civo":
391418
return provision.NewCivoProvisioner(accessToken)
392-
} else if provider == "scaleway" {
419+
case "scaleway":
393420
return provision.NewScalewayProvisioner(accessToken, secretKey, organisationID, region)
394-
} else if provider == "gce" {
421+
case "gce":
395422
return provision.NewGCEProvisioner(accessToken)
396-
} else if provider == "ec2" {
423+
case "ec2":
397424
return provision.NewEC2Provisioner(region, accessToken, secretKey, sessionToken)
398-
} else if provider == "azure" {
425+
case "azure":
399426
return provision.NewAzureProvisioner(subscriptionID, accessToken)
400-
} else if provider == "linode" {
427+
case "linode":
401428
return provision.NewLinodeProvisioner(accessToken)
402-
} else if provider == "hetzner" {
429+
case "hetzner":
403430
return provision.NewHetznerProvisioner(accessToken)
404-
} else if provider == "vultr" {
431+
case "vultr":
405432
return provision.NewVultrProvisioner(accessToken)
433+
case "ovh":
434+
return provision.NewOVHProvisioner(endpoint, accessToken, secretKey, consumerKey, region, projectID)
435+
default:
436+
return nil, fmt.Errorf("no provisioner for provider: %s", provider)
406437
}
407-
return nil, fmt.Errorf("no provisioner for provider: %s", provider)
438+
408439
}
409440

410441
func generateAuth() (string, error) {
@@ -422,6 +453,15 @@ func createHost(provider, name, region, zone, projectID, userData, inletsPort st
422453
UserData: userData,
423454
Additional: map[string]string{},
424455
}, nil
456+
} else if provider == "ovh" {
457+
return &provision.BasicHost{
458+
Name: name,
459+
OS: "Ubuntu 20.04",
460+
Plan: "s1-2",
461+
Region: region,
462+
UserData: userData,
463+
Additional: map[string]string{},
464+
}, nil
425465
} else if provider == EquinixMetalProvider {
426466
return &provision.BasicHost{
427467
Name: name,

cmd/delete.go

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ func init() {
3333
deleteCmd.Flags().String("project-id", "", "Project ID (equinix-metal, gce)")
3434
deleteCmd.Flags().String("subscription-id", "", "Subscription ID (azure)")
3535

36+
deleteCmd.Flags().String("endpoint", "ovh-eu", "API endpoint (ovh), default: ovh-eu")
37+
deleteCmd.Flags().String("consumer-key", "", "The Consumer Key for using the OVH API")
3638
}
3739

3840
// deleteCmd represents the client sub command
@@ -84,7 +86,7 @@ func runDelete(cmd *cobra.Command, _ []string) error {
8486
var secretKey string
8587
var sessionToken string
8688
var organisationID string
87-
if provider == "scaleway" || provider == "ec2" {
89+
if provider == "scaleway" || provider == "ec2" || provider == "ovh" {
8890
var secretKeyErr error
8991
secretKey, secretKeyErr = env.GetRequiredFileOrString(cmd.Flags(),
9092
"secret-key-file",
@@ -115,16 +117,27 @@ func runDelete(cmd *cobra.Command, _ []string) error {
115117
if provider == "azure" {
116118
subscriptionID, _ = cmd.Flags().GetString("subscription-id")
117119
}
118-
119-
provisioner, err := getProvisioner(provider, accessToken, secretKey, organisationID, region, subscriptionID, sessionToken)
120+
var endpoint string
121+
var consumerKey string
122+
if provider == "ovh" {
123+
endpoint, err = cmd.Flags().GetString("endpoint")
124+
if err != nil {
125+
return errors.Wrap(err, "failed to get 'endpoint' value")
126+
}
127+
consumerKey, err = cmd.Flags().GetString("consumer-key")
128+
if err != nil {
129+
return errors.Wrap(err, "failed to get 'endpoint' value")
130+
}
131+
}
132+
projectID, _ := cmd.Flags().GetString("project-id")
133+
provisioner, err := getProvisioner(provider, accessToken, secretKey, organisationID, region, subscriptionID, sessionToken, endpoint, consumerKey, projectID)
120134

121135
if err != nil {
122136
return err
123137
}
124138

125139
hostID, _ := cmd.Flags().GetString("id")
126140
hostIP, _ := cmd.Flags().GetString("ip")
127-
projectID, _ := cmd.Flags().GetString("project-id")
128141
zone, _ := cmd.Flags().GetString("zone")
129142

130143
if isNotSet(hostID) && isNotSet(hostIP) {

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ go 1.13
55
require (
66
github.com/alexellis/go-execute v0.0.0-20191029181357-d17947259f74
77
github.com/golang/mock v1.3.1
8-
github.com/inlets/cloud-provision v0.5.1
8+
github.com/inlets/cloud-provision v0.5.3
99
github.com/linode/linodego v0.19.0
1010
github.com/morikuni/aec v1.0.0
1111
github.com/pkg/errors v0.9.1

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,8 +150,8 @@ github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q=
150150
github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
151151
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
152152
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
153-
github.com/inlets/cloud-provision v0.5.1 h1:NyHnq5urikpOTpvnv+92+yYjDCZrnX0KfRYKXx+jH9s=
154-
github.com/inlets/cloud-provision v0.5.1/go.mod h1:uTyvP59yb+jDlx8QV2nn4/Mpd+AofnJLracWEHvf/MU=
153+
github.com/inlets/cloud-provision v0.5.3 h1:cr5infYFVIA+yIQTjDQyJ5lvPgbix7jj814g4ZJHYXc=
154+
github.com/inlets/cloud-provision v0.5.3/go.mod h1:8FHqBpiE8mPi6+pE0E5eMuY/SGQlDVd+laWPTDgwz/I=
155155
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM=
156156
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
157157
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=

0 commit comments

Comments
 (0)