Skip to content

Commit 7205e69

Browse files
authored
Merge 19365b5 into e9077be
2 parents e9077be + 19365b5 commit 7205e69

40 files changed

+3041
-506
lines changed

docs/proposals/commands-semantic.md

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# Semantic of commands
2+
3+
Components:
4+
- container
5+
- cluster resource (Kubernetes/OpenShift)
6+
- volume
7+
- image
8+
9+
| Command | PreStart | PostStart | PreStop | PostStop |
10+
|-----------------------------|----------|-----------|---------|-----------|
11+
| exec on container | | Yt | Yt | |
12+
| exec on cluster resource | N/A | N/A | N/A | N/A |
13+
| exec on volume | N/A | N/A | N/A | N/A |
14+
| exec on image | N/A | N/A | N/A | N/A |
15+
|   | | | | |
16+
| apply on container | ? | ? | ? | ? |
17+
| apply on cluster resource | | Yt | Yt | |
18+
| apply on volume | ? | ? | ? | ? |
19+
| apply on image | | Yt | Yt | |
20+
|   | | | | |
21+
| composite serial | | | | |
22+
| composite parallel | | | | |
23+
24+
25+
| Command | Build | Run/Debug | Deploy |
26+
|-----------------------------|-------|-----------|--------|
27+
| exec on container | Yt | Yt | Yt |
28+
| exec on cluster resource | N/A | N/A | N/A |
29+
| exec on volume | N/A | N/A | N/A |
30+
| exec on image | N/A | N/A | N/A |
31+
|   | | | |
32+
| apply on container | ? | ? | ? |
33+
| apply on cluster resource | Yt | Yt | Yt |
34+
| apply on volume | ? | ? | ? |
35+
| apply on image | Yt | Yt | Yt |
36+
|   | | | |
37+
| composite serial | | | |
38+
| composite parallel | | | |
39+
40+
41+
Legend:
42+
43+
- 0: Supported by handler but not implemented
44+
- Y: Implemented by pkg/component.NewRunHandler (Yt: tested in pkg/component/handler_test.go)
45+
- N/A: Not applicable (by spec)
46+
- ?: Spec is not clear

pkg/component/component.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -538,3 +538,11 @@ func ListRoutesAndIngresses(client kclient.ClientInterface, componentName, appNa
538538

539539
return ings, routes, nil
540540
}
541+
542+
func GetContainersNames(pod *corev1.Pod) []string {
543+
result := make([]string, 0, len(pod.Spec.Containers))
544+
for _, container := range pod.Spec.Containers {
545+
result = append(result, container.Name)
546+
}
547+
return result
548+
}

pkg/component/delete/delete.go

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"k8s.io/klog"
1616

1717
"github.com/redhat-developer/odo/pkg/component"
18+
"github.com/redhat-developer/odo/pkg/configAutomount"
1819
"github.com/redhat-developer/odo/pkg/exec"
1920
"github.com/redhat-developer/odo/pkg/kclient"
2021
odolabels "github.com/redhat-developer/odo/pkg/labels"
@@ -28,9 +29,10 @@ import (
2829
)
2930

3031
type DeleteComponentClient struct {
31-
kubeClient kclient.ClientInterface
32-
podmanClient podman.Client
33-
execClient exec.Client
32+
kubeClient kclient.ClientInterface
33+
podmanClient podman.Client
34+
execClient exec.Client
35+
configAutomountClient configAutomount.Client
3436
}
3537

3638
var _ Client = (*DeleteComponentClient)(nil)
@@ -39,11 +41,13 @@ func NewDeleteComponentClient(
3941
kubeClient kclient.ClientInterface,
4042
podmanClient podman.Client,
4143
execClient exec.Client,
44+
configAutomountClient configAutomount.Client,
4245
) *DeleteComponentClient {
4346
return &DeleteComponentClient{
44-
kubeClient: kubeClient,
45-
podmanClient: podmanClient,
46-
execClient: execClient,
47+
kubeClient: kubeClient,
48+
podmanClient: podmanClient,
49+
execClient: execClient,
50+
configAutomountClient: configAutomountClient,
4751
}
4852
}
4953

@@ -216,7 +220,20 @@ func (do *DeleteComponentClient) ExecutePreStopEvents(ctx context.Context, devfi
216220

217221
klog.V(4).Infof("Executing %q event commands for component %q", libdevfile.PreStop, componentName)
218222
// ignore the failures if any; delete should not fail because preStop events failed to execute
219-
err = libdevfile.ExecPreStopEvents(ctx, devfileObj, component.NewExecHandler(do.kubeClient, do.execClient, appName, componentName, pod.Name, "Executing pre-stop command in container", false, false))
223+
handler := component.NewRunHandler(
224+
ctx,
225+
do.kubeClient,
226+
do.execClient,
227+
do.configAutomountClient,
228+
pod.Name,
229+
false,
230+
component.GetContainersNames(pod),
231+
"Executing pre-stop command in container",
232+
233+
// TODO(feloy) set these values when we want to support Apply Image/Kubernetes/OpenShift commands for PreStop events
234+
nil, nil, parser.DevfileObj{}, "",
235+
)
236+
err = libdevfile.ExecPreStopEvents(ctx, devfileObj, handler)
220237
if err != nil {
221238
klog.V(4).Infof("Failed to execute %q event commands for component %q, cause: %v", libdevfile.PreStop, componentName, err.Error())
222239
}

pkg/component/delete/delete_test.go

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ func TestDeleteComponentClient_ListClusterResourcesToDelete(t *testing.T) {
160160
ctrl := gomock.NewController(t)
161161
kubeClient := tt.fields.kubeClient(ctrl)
162162
execClient := exec.NewExecClient(kubeClient)
163-
do := NewDeleteComponentClient(kubeClient, nil, execClient)
163+
do := NewDeleteComponentClient(kubeClient, nil, execClient, nil)
164164
ctx := odocontext.WithApplication(context.TODO(), "app")
165165
got, err := do.ListClusterResourcesToDelete(ctx, tt.args.componentName, tt.args.namespace, tt.args.mode)
166166
if (err != nil) != tt.wantErr {
@@ -277,7 +277,7 @@ func TestDeleteComponentClient_DeleteResources(t *testing.T) {
277277
ctrl := gomock.NewController(t)
278278
kubeClient := tt.fields.kubeClient(ctrl)
279279
execClient := exec.NewExecClient(kubeClient)
280-
do := NewDeleteComponentClient(kubeClient, nil, execClient)
280+
do := NewDeleteComponentClient(kubeClient, nil, execClient, nil)
281281
got := do.DeleteResources(tt.args.resources, false)
282282
if diff := cmp.Diff(tt.want, got); diff != "" {
283283
t.Errorf("DeleteComponentClient.DeleteResources() mismatch (-want +got):\n%s", diff)
@@ -686,10 +686,10 @@ func TestDeleteComponentClient_ExecutePreStopEvents(t *testing.T) {
686686
client := kclient.NewMockClientInterface(ctrl)
687687

688688
selector := odolabels.GetSelector(componentName, "app", odolabels.ComponentDevMode, false)
689-
client.EXPECT().GetRunningPodFromSelector(selector).Return(odoTestingUtil.CreateFakePod(componentName, "runtime"), nil)
689+
client.EXPECT().GetRunningPodFromSelector(selector).Return(odoTestingUtil.CreateFakePod(componentName, "mypod", "runtime"), nil)
690690

691691
cmd := []string{"/bin/sh", "-c", "cd /projects/nodejs-starter && (echo \"Hello World!\") 1>>/proc/1/fd/1 2>>/proc/1/fd/2"}
692-
client.EXPECT().ExecCMDInContainer(gomock.Any(), "runtime", "runtime", cmd, gomock.Any(), gomock.Any(), nil, false).Return(nil)
692+
client.EXPECT().ExecCMDInContainer(gomock.Any(), "runtime", "mypod", cmd, gomock.Any(), gomock.Any(), nil, false).Return(nil)
693693

694694
return client
695695
},
@@ -707,7 +707,7 @@ func TestDeleteComponentClient_ExecutePreStopEvents(t *testing.T) {
707707
client := kclient.NewMockClientInterface(ctrl)
708708

709709
selector := odolabels.GetSelector(componentName, "app", odolabels.ComponentDevMode, false)
710-
pod := odoTestingUtil.CreateFakePod(componentName, "runtime")
710+
pod := odoTestingUtil.CreateFakePod(componentName, "mypod", "runtime")
711711
pod.Status.Phase = corev1.PodFailed
712712
client.EXPECT().GetRunningPodFromSelector(selector).Return(pod, nil)
713713
return client
@@ -726,14 +726,14 @@ func TestDeleteComponentClient_ExecutePreStopEvents(t *testing.T) {
726726
client := kclient.NewMockClientInterface(ctrl)
727727

728728
selector := odolabels.GetSelector(componentName, "app", odolabels.ComponentDevMode, false)
729-
fakePod := odoTestingUtil.CreateFakePod(componentName, "runtime")
729+
fakePod := odoTestingUtil.CreateFakePod(componentName, "mypod", "runtime")
730730
// Expecting this method to be called twice because if the command execution fails, we try to get the pod logs by calling GetOnePodFromSelector again.
731731
client.EXPECT().GetRunningPodFromSelector(selector).Return(fakePod, nil).Times(2)
732732

733733
client.EXPECT().GetPodLogs(fakePod.Name, gomock.Any(), gomock.Any()).Return(nil, errors.New("an error"))
734734

735735
cmd := []string{"/bin/sh", "-c", "cd /projects/nodejs-starter && (echo \"Hello World!\") 1>>/proc/1/fd/1 2>>/proc/1/fd/2"}
736-
client.EXPECT().ExecCMDInContainer(gomock.Any(), "runtime", "runtime", cmd, gomock.Any(), gomock.Any(), nil, false).Return(errors.New("some error"))
736+
client.EXPECT().ExecCMDInContainer(gomock.Any(), "runtime", "mypod", cmd, gomock.Any(), gomock.Any(), nil, false).Return(errors.New("some error"))
737737

738738
return client
739739
},
@@ -750,8 +750,11 @@ func TestDeleteComponentClient_ExecutePreStopEvents(t *testing.T) {
750750
ctrl := gomock.NewController(t)
751751
kubeClient := tt.fields.kubeClient(ctrl)
752752
execClient := exec.NewExecClient(kubeClient)
753-
do := NewDeleteComponentClient(kubeClient, nil, execClient)
754-
if err := do.ExecutePreStopEvents(context.Background(), tt.args.devfileObj, tt.args.appName, tt.args.devfileObj.GetMetadataName()); (err != nil) != tt.wantErr {
753+
do := NewDeleteComponentClient(kubeClient, nil, execClient, nil)
754+
ctx := context.Background()
755+
ctx = odocontext.WithApplication(ctx, appName)
756+
ctx = odocontext.WithComponentName(ctx, componentName)
757+
if err := do.ExecutePreStopEvents(ctx, tt.args.devfileObj, tt.args.appName, tt.args.devfileObj.GetMetadataName()); (err != nil) != tt.wantErr {
755758
t.Errorf("DeleteComponent() error = %v, wantErr %v", err, tt.wantErr)
756759
}
757760
})

0 commit comments

Comments
 (0)