@@ -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
410441func 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 ,
0 commit comments