Skip to content

Commit 1eaa907

Browse files
authored
Fix: Resolve start and stop commands related issue (#166)
* fixes#163 bug: Resolved Podman socket retrival issue for windows and linux Signed-off-by: Harsh4902 <[email protected]> * feat: redesigned container-client creation and config updates after executing start and stop commands Signed-off-by: Harsh4902 <[email protected]> --------- Signed-off-by: Harsh4902 <[email protected]>
1 parent 4281037 commit 1eaa907

File tree

6 files changed

+292
-297
lines changed

6 files changed

+292
-297
lines changed

cmd/start.go

Lines changed: 97 additions & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,17 @@
11
package cmd
22

33
import (
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

2013
func 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
4234
microcks 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-
}

cmd/stop.go

Lines changed: 44 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
package cmd
22

33
import (
4-
"context"
54
"fmt"
65
"log"
76

8-
containertypes "github.com/docker/docker/api/types/container"
9-
"github.com/docker/docker/client"
107
"github.com/microcks/microcks-cli/pkg/config"
8+
"github.com/microcks/microcks-cli/pkg/connectors"
9+
"github.com/microcks/microcks-cli/pkg/errors"
1110
"github.com/spf13/cobra"
1211
)
1312

@@ -19,54 +18,60 @@ func NewStopCommand() *cobra.Command {
1918
Long: "stop microcks instance",
2019
Run: func(cmd *cobra.Command, args []string) {
2120

22-
cfg, err := config.LoadConfig(config.ConfigPath)
23-
if err != nil {
24-
log.Fatalf("Failed to load config: %v", err)
25-
}
21+
configFile, err := config.DefaultLocalConfigPath()
22+
errors.CheckError(err)
23+
localConfig, err := config.ReadLocalConfig(configFile)
24+
errors.CheckError(err)
2625

27-
cli, err := createClient(cfg.Instance.Driver)
28-
29-
if err != nil {
30-
fmt.Println(err)
26+
if localConfig == nil {
27+
fmt.Println("Config not found, nothing to stop")
3128
return
3229
}
3330

34-
stopContainer(cfg.Instance.ContainerID, cli)
31+
ctx, err := localConfig.ResolveContext("")
32+
errors.CheckError(err)
33+
instance := ctx.Instance
3534

36-
cfg.Instance.Status = "Stopped"
37-
38-
if cfg.Instance.AutoRemove {
39-
cfg.Instance = struct {
40-
Name string "yaml:\"name\""
41-
Image string "yaml:\"image\""
42-
Status string "yaml:\"status\""
43-
Port string "yaml:\"port\""
44-
ContainerID string "yaml:\"containerID\""
45-
AutoRemove bool "yaml:\"autoRemove\""
46-
Driver string "yaml:\"driver\""
47-
}{}
35+
if instance.Name == "" {
36+
fmt.Println("No instance is associated with this context")
37+
return
4838
}
4939

50-
err = config.SaveConfig(config.ConfigPath, cfg)
40+
containerClient, err := connectors.NewContainerClient(instance.Driver)
41+
errors.CheckError(err)
42+
defer containerClient.CloseClient()
5143

44+
err = containerClient.StopContainer(instance.ContainerID)
5245
if err != nil {
53-
log.Fatalf("Failed to save config: %v", err)
46+
log.Fatalf("Failed to stop a container: %v", err)
47+
return
5448
}
55-
56-
fmt.Println("Microcks stopped successfully...")
49+
log.Printf("Instance %s stopped successfully", instance.Name)
50+
51+
// update configs
52+
53+
if instance.AutoRemove {
54+
_, ok := localConfig.RemoveContext(ctx.Name)
55+
if !ok {
56+
log.Fatalf("Context %s does not exist", ctx.Name)
57+
return
58+
}
59+
_ = localConfig.RemoveServer(ctx.Server.Server)
60+
_ = localConfig.RemoveUser(ctx.User.Name)
61+
_ = localConfig.RemoveAuth(ctx.Server.Server)
62+
_ = localConfig.RemoveInstance(instance.Name)
63+
64+
localConfig.CurrentContext = ""
65+
log.Printf("Instance %s removed successfully", instance.Name)
66+
} else {
67+
instance.Status = "Exited"
68+
localConfig.UpsertInstance(instance)
69+
log.Printf("Instance %s status update to Exited", instance.Name)
70+
}
71+
err = config.WriteLocalConfig(*localConfig, configFile)
72+
errors.CheckError(err)
5773
},
5874
}
5975

6076
return stopCmd
6177
}
62-
63-
func stopContainer(containerId string, cli *client.Client) {
64-
ctx := context.Background()
65-
66-
fmt.Print("Stopping container ", containerId, "... ")
67-
noWaitTimeout := 0 // to not wait for the container to exit gracefully
68-
if err := cli.ContainerStop(ctx, containerId, containertypes.StopOptions{Timeout: &noWaitTimeout}); err != nil {
69-
panic(err)
70-
}
71-
fmt.Println("Success")
72-
}

0 commit comments

Comments
 (0)