Skip to content

Commit

Permalink
Merge pull request #12867 from ycliuhw/fix/lp-1923561
Browse files Browse the repository at this point in the history
#12867

*Add support for newer eksctl for juju add-k8s --eks eks;*

## Checklist

 - [ ] ~Requires a [pylibjuju](https://github.com/juju/python-libjuju) change~
 - [ ] ~Added [integration tests](https://github.com/juju/juju/tree/develop/tests) for the PR~
 - [ ] ~Added or updated [doc.go](https://discourse.jujucharms.com/t/readme-in-packages/451) related to packages changed~
 - [x] Comments answer the question of why design decisions were made

## QA steps

```console
$ eksctl version
0.40.0

# create an EKS cluster;
$ eksctl create cluster \n --name k1 \n --node-ami-family=Ubuntu2004 \n --node-type='m5.large'

$ eksctl get cluster -o json --region ap-southeast-2
[
 {
 "metadata": {
 "name": "k1",
 "region": "ap-southeast-2"
 },
 "status": {
 "eksctlCreated": "True"
 }
 }
]

$ juju add-k8s --eks eks
Enter region: ap-southeast-2

This operation can be applied to both a copy on this client and to the one on a controller.
No current controller was detected and there are no registered controllers on this client: either bootstrap one or register one.

k8s substrate "k1.ap-southeast-2.eksctl.io" added as cloud "eks".
You can now bootstrap to this cloud by running 'juju bootstrap eks'.

```

## Documentation changes

No

## Bug reference

https://bugs.launchpad.net/juju/+bug/1923561
  • Loading branch information
jujubot committed Apr 14, 2021
2 parents 7fd72d5 + 450a38b commit 0c0068f
Show file tree
Hide file tree
Showing 2 changed files with 104 additions and 12 deletions.
47 changes: 36 additions & 11 deletions cmd/juju/caas/eks.go
Original file line number Diff line number Diff line change
Expand Up @@ -106,11 +106,45 @@ func (e *eks) interactiveParams(ctx *cmd.Context, p *clusterParams) (*clusterPar
return p, nil
}

type eksDetail struct {
type eksDetailLegacy struct {
Name string `json:"name"`
Region string `json:"region"`
}

type eksStatus struct {
EKSCTLCreated string `json:"eksctlCreated"`
}

type eksDetail struct {
MetaData eksDetailLegacy `json:"metadata"`
Status eksStatus `json:"status"`
}

func getClusterNames(data []byte) (out []string, err error) {
var clusterDetails []eksDetail
if err := json.Unmarshal(data, &clusterDetails); err == nil {
for _, detail := range clusterDetails {
if len(detail.MetaData.Name) > 0 {
out = append(out, detail.MetaData.Name)
}
}
}
if len(out) > 0 {
return out, nil
}
var clusterDetailsLegacy []eksDetailLegacy
if err := json.Unmarshal(data, &clusterDetailsLegacy); err != nil {
return nil, errors.Trace(err)
}
for _, detail := range clusterDetailsLegacy {
if len(detail.Name) > 0 {
out = append(out, detail.Name)
}
}

return out, nil
}

func (e *eks) listClusters(region string) (clusters []string, err error) {
cmd := []string{
e.tool, "get", "cluster", "--region", region, "-o", "json",
Expand All @@ -122,14 +156,5 @@ func (e *eks) listClusters(region string) (clusters []string, err error) {
if result.Code != 0 {
return nil, errors.New(string(result.Stderr))
}

var eksClusters []eksDetail
if err := json.Unmarshal(result.Stdout, &eksClusters); err != nil {
return nil, errors.Trace(err)
}

for _, item := range eksClusters {
clusters = append(clusters, item.Name)
}
return clusters, nil
return getClusterNames(result.Stdout)
}
69 changes: 68 additions & 1 deletion cmd/juju/caas/eks_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ Enter region:
c.Check(cmdtesting.Stdout(ctx), gc.Equals, expected)
}

func (s *eksSuite) TestInteractiveParamMultiClusters(c *gc.C) {
func (s *eksSuite) TestInteractiveParamMultiClustersLegacyCLI(c *gc.C) {
ctrl := gomock.NewController(c)
defer ctrl.Finish()

Expand Down Expand Up @@ -215,6 +215,73 @@ Select cluster [mycluster]:
})
}

func (s *eksSuite) TestInteractiveParamMultiClusters(c *gc.C) {
ctrl := gomock.NewController(c)
defer ctrl.Finish()

mockRunner := mocks.NewMockCommandRunner(ctrl)
eksCMD := &eks{
tool: "eksctl",
CommandRunner: mockRunner,
}
clusterJSONResp := `
[
{
"metadata": {
"name": "nw-deploy-kubeflow-1272",
"region": "ap-southeast-2"
},
"status": {
"eksctlCreated": "True"
}
},
{
"metadata": {
"name": "k1",
"region": "ap-southeast-2"
},
"status": {
"eksctlCreated": "True"
}
}
]`

gomock.InOrder(
mockRunner.EXPECT().RunCommands(exec.RunParams{
Commands: "eksctl get cluster --region ap-southeast-2 -o json",
Environment: os.Environ(),
}).
Return(&exec.ExecResponse{
Code: 0,
Stdout: []byte(clusterJSONResp),
}, nil),
)
stdin := strings.NewReader("ap-southeast-2\nk1\n")
out := &bytes.Buffer{}
ctx := &cmd.Context{
Dir: c.MkDir(),
Stdout: out,
Stderr: ioutil.Discard,
Stdin: stdin,
}
expected := `
Enter region:
Available Clusters In Ap-Southeast-2
nw-deploy-kubeflow-1272
k1
Select cluster [nw-deploy-kubeflow-1272]:
`[1:]

outParams, err := eksCMD.interactiveParams(ctx, &clusterParams{})
c.Check(err, jc.ErrorIsNil)
c.Check(cmdtesting.Stdout(ctx), gc.Equals, expected)
c.Assert(outParams, jc.DeepEquals, &clusterParams{
name: "k1",
region: "ap-southeast-2",
})
}

func (s *eksSuite) TestEnsureExecutable(c *gc.C) {
ctrl := gomock.NewController(c)
defer ctrl.Finish()
Expand Down

0 comments on commit 0c0068f

Please sign in to comment.