| 17 | ) |
| 18 | |
| 19 | func runOpenStackCmd() *cobra.Command { |
| 20 | var ( |
| 21 | flavorName string |
| 22 | instanceName string |
| 23 | networkID string |
| 24 | secGroups string |
| 25 | keyName string |
| 26 | ) |
| 27 | |
| 28 | cmd := &cobra.Command{ |
| 29 | Use: "openstack", |
| 30 | Short: "launch an openstack instance using an existing image", |
| 31 | Long: `Launch an openstack instance using an existing image. |
| 32 | 'name' is the name of an OpenStack image that has already been uploaded using 'linuxkit push'. |
| 33 | `, |
| 34 | Args: cobra.ExactArgs(1), |
| 35 | Example: "linuxkit run openstack [options] [name]", |
| 36 | RunE: func(cmd *cobra.Command, args []string) error { |
| 37 | name := args[0] |
| 38 | if instanceName == "" { |
| 39 | instanceName = name |
| 40 | } |
| 41 | |
| 42 | client, err := clientconfig.NewServiceClient("compute", nil) |
| 43 | if err != nil { |
| 44 | return fmt.Errorf("unable to create Compute client, %s", err) |
| 45 | } |
| 46 | |
| 47 | network := servers.Network{ |
| 48 | UUID: networkID, |
| 49 | } |
| 50 | |
| 51 | var serverOpts servers.CreateOptsBuilder |
| 52 | |
| 53 | serverOpts = &servers.CreateOpts{ |
| 54 | FlavorName: flavorName, |
| 55 | ImageName: name, |
| 56 | Name: instanceName, |
| 57 | Networks: []servers.Network{network}, |
| 58 | ServiceClient: client, |
| 59 | SecurityGroups: strings.Split(secGroups, ","), |
| 60 | } |
| 61 | |
| 62 | if keyName != "" { |
| 63 | serverOpts = &keypairs.CreateOptsExt{ |
| 64 | CreateOptsBuilder: serverOpts, |
| 65 | KeyName: keyName, |
| 66 | } |
| 67 | } |
| 68 | |
| 69 | server, err := servers.Create(client, serverOpts).Extract() |
| 70 | if err != nil { |
| 71 | return fmt.Errorf("unable to create server: %w", err) |
| 72 | } |
| 73 | |
| 74 | _ = servers.WaitForStatus(client, server.ID, "ACTIVE", 600) |
| 75 | log.Infof("Server created, UUID is %s", server.ID) |
| 76 | fmt.Println(server.ID) |