11package cmd
22
33import (
4- "context"
54 "fmt"
6- "io"
75 "log"
8- "os"
9- "os/exec"
10- "strings"
11-
12- "github.com/docker/docker/api/types/container"
13- "github.com/docker/docker/api/types/image"
14- "github.com/docker/docker/client"
15- "github.com/docker/go-connections/nat"
6+
167 "github.com/microcks/microcks-cli/pkg/config"
8+ "github.com/microcks/microcks-cli/pkg/connectors"
9+ "github.com/microcks/microcks-cli/pkg/errors"
1710 "github.com/spf13/cobra"
1811)
1912
2013func NewStartCommand () * cobra.Command {
2114 var (
22- hostIP string = "0.0.0.0"
2315 name string
2416 hostPort string
2517 imageName string
@@ -41,62 +33,114 @@ microcks start --driver [driver you wnat either 'docker' or 'podman']
4133# Define name of your microcks container/instance
4234microcks start --name [name of you container/instance]` ,
4335 Run : func (cmd * cobra.Command , args []string ) {
44- cfg , err := config .EnsureConfig (config .ConfigPath )
45-
46- if err != nil {
47- log .Fatalf ("Error loading config: %v" , err )
48- }
4936
50- cfg .Instance .Driver = driver
37+ configFile , err := config .DefaultLocalConfigPath ()
38+ errors .CheckError (err )
39+ localConfig , err := config .ReadLocalConfig (configFile )
40+ errors .CheckError (err )
5141
52- cli , err := createClient (cfg .Instance .Driver )
53-
54- if err != nil {
55- fmt .Println (err )
56- return
42+ if localConfig == nil {
43+ localConfig = & config.LocalConfig {}
5744 }
5845
59- defer cli .Close ()
60-
61- if cfg .Instance .Status == "Running" {
62- fmt .Println ("Microcks is already running." )
63- return
46+ instance , _ := localConfig .GetInstance (name )
47+ if instance == nil {
48+ instance = & config.Instance {}
6449 }
6550
66- if cfg .Instance .Status == "Stopped" || cfg .Instance .Status == "Created" {
67- if err := startContainer (cfg .Instance .ContainerID , cli ); err != nil {
68- fmt .Errorf ("failed to start container: %v" , err )
69- }
70- fmt .Println ("Microcks started successfully..." )
51+ if instance .Status == "Running" {
52+ fmt .Printf ("Microcks instance with name %s is already running" , name )
7153 return
7254 }
7355
74- cfg .Instance .Name = name
75- cfg .Instance .Image = imageName
76- cfg .Instance .Port = hostPort
77- cfg .Instance .AutoRemove = autoRemove
78-
79- containerID , err := createContainer (cfg , hostIP , cli )
80-
81- if err != nil {
82- log .Fatalf ("Failed to create a container: %v" , err )
56+ switch instance .Status {
57+ case "Running" :
58+ fmt .Printf ("Microcks instance with name %s is already running" , name )
8359 return
84- }
85- cfg .Instance .ContainerID = containerID
86- cfg .Instance .Status = "Created"
60+ case "Exited" :
61+ containerClient , err := connectors .NewContainerClient (instance .Driver )
62+ errors .CheckError (err )
63+ defer containerClient .CloseClient ()
64+
65+ if err := containerClient .StartContainer (instance .ContainerID ); err != nil {
66+ log .Fatalf ("failed to start container: %v" , err )
67+ return
68+ }
69+ instance .Status = "Running"
70+ default :
71+ containerClient , err := connectors .NewContainerClient (driver )
72+ errors .CheckError (err )
73+ defer containerClient .CloseClient ()
74+
75+ containerId , err := containerClient .CreateContainer (connectors.ContainerOpts {
76+ Image : imageName ,
77+ Port : hostPort ,
78+ Name : name ,
79+ AutoRemove : autoRemove ,
80+ })
81+ if err != nil {
82+ log .Fatalf ("Failed to create a container: %v" , err )
83+ return
84+ }
8785
88- if err := startContainer (cfg .Instance .ContainerID , cli ); err != nil {
89- fmt .Errorf ("failed to start container: %v" , err )
90- return
91- }
92- cfg .Instance .Status = "Running"
93- err = config .SaveConfig (config .ConfigPath , cfg )
86+ if err := containerClient .StartContainer (containerId ); err != nil {
87+ log .Fatalf ("failed to start container: %v" , err )
88+ return
89+ }
9490
95- if err != nil {
96- log .Fatalf ("Failed to save config: %v" , err )
97- return
91+ instance .ContainerID = containerId
92+ instance .AutoRemove = autoRemove
93+ instance .Name = name
94+ instance .Image = imageName
95+ instance .Port = hostPort
96+ instance .Status = "Running"
97+ instance .Driver = driver
9898 }
9999
100+ //Store config and change context
101+ localConfig .UpsertInstance (config.Instance {
102+ ContainerID : instance .ContainerID ,
103+ Name : instance .Name ,
104+ Image : instance .Image ,
105+ Port : instance .Port ,
106+ Status : instance .Status ,
107+ Driver : instance .Driver ,
108+ AutoRemove : instance .AutoRemove ,
109+ })
110+
111+ server := fmt .Sprintf ("http://localhost:%s" , instance .Port )
112+
113+ localConfig .UpsertServer (config.Server {
114+ Name : name ,
115+ Server : server ,
116+ InsecureTLS : true ,
117+ KeycloackEnable : false ,
118+ })
119+
120+ localConfig .UpserAuth (config.Auth {
121+ Server : server ,
122+ ClientId : "" ,
123+ ClientSecret : "" ,
124+ })
125+
126+ localConfig .UpsertUser (config.User {
127+ Name : server ,
128+ AuthToken : "" ,
129+ RefreshToken : "" ,
130+ })
131+
132+ localConfig .CurrentContext = server
133+ localConfig .UpserContext (config.ContextRef {
134+ Name : server ,
135+ Server : server ,
136+ User : server ,
137+ Instance : instance .Name ,
138+ })
139+
140+ // Save configs to config file
141+ err = config .WriteLocalConfig (* localConfig , configFile )
142+ errors .CheckError (err )
143+
100144 fmt .Printf ("Microcks started successfully..." )
101145 },
102146 }
@@ -107,75 +151,3 @@ microcks start --name [name of you container/instance]`,
107151 startCmd .Flags ().StringVar (& driver , "driver" , "docker" , "use --driver to change driver from docker to podman" )
108152 return startCmd
109153}
110-
111- func createClient (driver string ) (* client.Client , error ) {
112-
113- if driver != "docker" {
114- out , err := exec .Command ("podman" , "machine" , "inspect" , "--format" , "{{.ConnectionInfo.PodmanSocket.Path}}" ).Output ()
115- if err != nil {
116- fmt .Println (err )
117- }
118-
119- err = os .Setenv ("DOCKER_HOST" , "unix://" + strings .TrimSpace (string (out )))
120- if err != nil {
121- fmt .Println (err )
122- }
123- }
124-
125- cli , err := client .NewClientWithOpts (client .FromEnv , client .WithAPIVersionNegotiation ())
126-
127- if err != nil {
128- return nil , err
129- }
130-
131- return cli , nil
132- }
133-
134- func createContainer (cfg * config.Config , hostIP string , cli * client.Client ) (string , error ) {
135- ctx := context .Background ()
136-
137- // Define exposed port and bindings
138- exposedPort , _ := nat .NewPort ("tcp" , "8080" )
139- portBindings := nat.PortMap {
140- exposedPort : []nat.PortBinding {
141- {
142- HostIP : hostIP ,
143- HostPort : cfg .Instance .Port ,
144- },
145- },
146- }
147-
148- out , err := cli .ImagePull (ctx , cfg .Instance .Image , image.PullOptions {})
149- if err != nil {
150- return "" , err
151- }
152- defer out .Close ()
153- io .Copy (os .Stdout , out )
154-
155- resp , err := cli .ContainerCreate (
156- ctx ,
157- & container.Config {
158- Image : cfg .Instance .Image ,
159- ExposedPorts : nat.PortSet {exposedPort : struct {}{}},
160- },
161- & container.HostConfig {
162- PortBindings : portBindings ,
163- AutoRemove : cfg .Instance .AutoRemove ,
164- }, nil , nil , cfg .Instance .Name )
165-
166- if err != nil {
167- return "" , err
168- }
169-
170- return resp .ID , nil
171- }
172-
173- func startContainer (cotainerID string , cli * client.Client ) error {
174- ctx := context .Background ()
175-
176- if err := cli .ContainerStart (ctx , cotainerID , container.StartOptions {}); err != nil {
177- panic (err )
178- }
179-
180- return nil
181- }
0 commit comments