Skip to content

Add list of known CAPI providers #174

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 9 commits into from
Oct 12, 2021
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 30 additions & 21 deletions cmd/capi-server/pkg/server/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,19 @@ import (
"sigs.k8s.io/controller-runtime/pkg/client"
)

var providers = map[string]string{
"AWSCluster": "aws",
"AWSManagedCluster": "aws",
"AzureCluster": "azure",
"AzureManagedCluster": "azure",
"DOCluster": "digitalocean",
"DockerCluster": "docker",
"GCPCluster": "gcp",
"OpenStackCluster": "openstack",
"PacketCluster": "packet",
"VSphereCluster": "vsphere",
}

type server struct {
log logr.Logger
library templates.Library
Expand Down Expand Up @@ -56,13 +69,26 @@ func (s *server) ListTemplates(ctx context.Context, msg *capiv1_proto.ListTempla
}

if msg.Provider != "" {
if !isProviderRecognised(msg.Provider) {
return nil, fmt.Errorf("provider %q is not recognised", msg.Provider)
}

templates = filterTemplatesByProvider(templates, msg.Provider)
}

sort.Slice(templates, func(i, j int) bool { return templates[i].Name < templates[j].Name })
return &capiv1_proto.ListTemplatesResponse{Templates: templates, Total: int32(len(tl))}, err
}

func isProviderRecognised(provider string) bool {
for _, p := range providers {
if strings.EqualFold(provider, p) {
return true
}
}
return false
}

func getProvider(t *capiv1.CAPITemplate) string {
meta, err := capi.ParseTemplateMeta(t)

Expand All @@ -71,43 +97,26 @@ func getProvider(t *capiv1.CAPITemplate) string {
}

for _, obj := range meta.Objects {
switch obj.Kind {
case "AWSCluster", "AWSManagedCluster":
return "AWSCluster"
case "AzureCluster", "VSphereCluster":
return obj.Kind
if p, ok := providers[obj.Kind]; ok {
return p
}
}

return "Generic"
return ""
}

func filterTemplatesByProvider(tl []*capiv1_proto.Template, provider string) []*capiv1_proto.Template {
templates := []*capiv1_proto.Template{}

for _, t := range tl {
providerKind := formatProviderName(provider)

if t.Provider == providerKind {
if strings.EqualFold(t.Provider, provider) {
templates = append(templates, t)
}
}

return templates
}

func formatProviderName(provider string) string {
switch name := provider; strings.ToLower(name) {
case "aws":
return "AWSCluster"
case "azure":
return "AzureCluster"
case "vsphere":
return "VSphereCluster"
}
return ""
}

func (s *server) GetTemplate(ctx context.Context, msg *capiv1_proto.GetTemplateRequest) (*capiv1_proto.GetTemplateResponse, error) {
tm, err := s.library.Get(ctx, msg.TemplateName)
if err != nil {
Expand Down
124 changes: 107 additions & 17 deletions cmd/capi-server/pkg/server/server_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ func TestListTemplates(t *testing.T) {
{
Name: "cluster-template-1",
Description: "this is test template 1",
Provider: "AWSCluster",
Provider: "aws",
Objects: []*capiv1_protos.TemplateObject{
{
Name: string("${CLUSTER_NAME}"),
Expand Down Expand Up @@ -89,7 +89,7 @@ func TestListTemplates(t *testing.T) {
{
Name: "cluster-template-1",
Description: "this is test template 1",
Provider: "Generic",
Provider: "",
Objects: []*capiv1_protos.TemplateObject{
{
Name: string("${CLUSTER_NAME}"),
Expand All @@ -109,7 +109,7 @@ func TestListTemplates(t *testing.T) {
{
Name: "cluster-template-2",
Description: "this is test template 2",
Provider: "Generic",
Provider: "",
Objects: []*capiv1_protos.TemplateObject{
{
Name: string("${CLUSTER_NAME}"),
Expand Down Expand Up @@ -155,12 +155,11 @@ func TestListTemplates(t *testing.T) {

func TestListTemplates_FilterByProvider(t *testing.T) {
testCases := []struct {
name string
provider string
clusterState []runtime.Object
expected []*capiv1_protos.Template
err error
expectedErrorStr string
name string
provider string
clusterState []runtime.Object
expected []*capiv1_protos.Template
err error
}{
{
name: "Provider name with upper case letters",
Expand All @@ -175,7 +174,7 @@ func TestListTemplates_FilterByProvider(t *testing.T) {
{
Name: "cluster-template-2",
Description: "this is test template 2",
Provider: "AWSCluster",
Provider: "aws",
Objects: []*capiv1_protos.TemplateObject{
{
Name: string("${CLUSTER_NAME}"),
Expand Down Expand Up @@ -206,7 +205,7 @@ func TestListTemplates_FilterByProvider(t *testing.T) {
{
Name: "cluster-template-2",
Description: "this is test template 2",
Provider: "AWSCluster",
Provider: "aws",
Objects: []*capiv1_protos.TemplateObject{
{
Name: string("${CLUSTER_NAME}"),
Expand Down Expand Up @@ -235,6 +234,17 @@ func TestListTemplates_FilterByProvider(t *testing.T) {
},
expected: []*capiv1_protos.Template{},
},
{
name: "Provider name not recognised",
provider: "foo",
clusterState: []runtime.Object{
makeTemplateConfigMap("template2", makeTemplateWithProvider(t, "AWSCluster", func(ct *capiv1.CAPITemplate) {
ct.ObjectMeta.Name = "cluster-template-2"
ct.Spec.Description = "this is test template 2"
}), "template1", makeTemplate(t)),
},
err: fmt.Errorf("provider %q is not recognised", "foo"),
},
}

for _, tt := range testCases {
Expand Down Expand Up @@ -281,7 +291,7 @@ func TestGetTemplate(t *testing.T) {
expected: &capiv1_protos.Template{
Name: "cluster-template-1",
Description: "this is test template 1",
Provider: "Generic",
Provider: "",
Objects: []*capiv1_protos.TemplateObject{
{
Name: string("${CLUSTER_NAME}"),
Expand Down Expand Up @@ -873,7 +883,7 @@ func TestGetProvider(t *testing.T) {
},
},
},
provider: "AWSCluster",
provider: "aws",
},
{
name: "AWSManagedCluster",
Expand All @@ -889,7 +899,7 @@ func TestGetProvider(t *testing.T) {
},
},
},
provider: "AWSCluster",
provider: "aws",
},
{
name: "AzureCluster",
Expand All @@ -905,7 +915,87 @@ func TestGetProvider(t *testing.T) {
},
},
},
provider: "AzureCluster",
provider: "azure",
},
{
name: "AzureManagedCluster",
template: &capiv1.CAPITemplate{
Spec: capiv1.CAPITemplateSpec{
ResourceTemplates: []capiv1.CAPIResourceTemplate{
{
RawExtension: rawExtension(`{
"apiVersion": "infrastructure.cluster.x-k8s.io/v1alpha4",
"kind": "AzureManagedCluster"
}`),
},
},
},
},
provider: "azure",
},
{
name: "DOCluster",
template: &capiv1.CAPITemplate{
Spec: capiv1.CAPITemplateSpec{
ResourceTemplates: []capiv1.CAPIResourceTemplate{
{
RawExtension: rawExtension(`{
"apiVersion": "infrastructure.cluster.x-k8s.io/v1alpha4",
"kind": "DOCluster"
}`),
},
},
},
},
provider: "digitalocean",
},
{
name: "GCPCluster",
template: &capiv1.CAPITemplate{
Spec: capiv1.CAPITemplateSpec{
ResourceTemplates: []capiv1.CAPIResourceTemplate{
{
RawExtension: rawExtension(`{
"apiVersion": "infrastructure.cluster.x-k8s.io/v1alpha4",
"kind": "GCPCluster"
}`),
},
},
},
},
provider: "gcp",
},
{
name: "OpenStackCluster",
template: &capiv1.CAPITemplate{
Spec: capiv1.CAPITemplateSpec{
ResourceTemplates: []capiv1.CAPIResourceTemplate{
{
RawExtension: rawExtension(`{
"apiVersion": "infrastructure.cluster.x-k8s.io/v1alpha4",
"kind": "OpenStackCluster"
}`),
},
},
},
},
provider: "openstack",
},
{
name: "PacketCluster",
template: &capiv1.CAPITemplate{
Spec: capiv1.CAPITemplateSpec{
ResourceTemplates: []capiv1.CAPIResourceTemplate{
{
RawExtension: rawExtension(`{
"apiVersion": "infrastructure.cluster.x-k8s.io/v1alpha4",
"kind": "PacketCluster"
}`),
},
},
},
},
provider: "packet",
},
{
name: "VSphereCluster",
Expand All @@ -921,7 +1011,7 @@ func TestGetProvider(t *testing.T) {
},
},
},
provider: "VSphereCluster",
provider: "vsphere",
},
{
name: "FooCluster",
Expand All @@ -937,7 +1027,7 @@ func TestGetProvider(t *testing.T) {
},
},
},
provider: "Generic",
provider: "",
},
}

Expand Down
6 changes: 3 additions & 3 deletions cmd/capi-server/pkg/server/template_response_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ func TestToTemplate(t *testing.T) {
name: "empty",
value: "",
expected: &capiv1_protos.Template{
Provider: "Generic",
Provider: "",
},
},
{
Expand All @@ -34,7 +34,7 @@ metadata:
`,
expected: &capiv1_protos.Template{
Name: "foo",
Provider: "Generic",
Provider: "",
},
},
{
Expand All @@ -60,7 +60,7 @@ metadata:
expected: &capiv1_protos.Template{
Name: "cluster-template-1",
Description: "this is test template 1",
Provider: "Generic",
Provider: "",
Objects: []*capiv1_protos.TemplateObject{
{
ApiVersion: "fooversion",
Expand Down
14 changes: 7 additions & 7 deletions test/acceptance/test/mccp_templates.go
Original file line number Diff line number Diff line change
Expand Up @@ -155,10 +155,10 @@ func DescribeMCCPTemplates(mccpTestRunner MCCPTestRunner) {
By("And templates can be filtered by provider - table view", func() {
// Select cluster provider by selecting from the popup list
Expect(templatesPage.TemplateProvider.Click()).To(Succeed())
Expect(templatesPage.SelectProvider("Generic").Click()).To(Succeed())
Expect(templatesPage.SelectProvider("aws").Click()).To(Succeed())

rowCount, _ := templatesPage.TemplatesTable.Count()
Eventually(rowCount).Should(Equal(capdTemplateCount), "The number of DockerCluster provider template tiles rendered should be equal to number of CAPD templates created")
Eventually(rowCount).Should(Equal(4), "The number of selected template tiles rendered should be equal to number of aws templates created")

Expect(templatesPage.TemplateProvider.Click()).To(Succeed())
Expect(templatesPage.TemplateProvider.SendKeys("\uE003")).To(Succeed()) // sending back space key
Expand All @@ -184,19 +184,19 @@ func DescribeMCCPTemplates(mccpTestRunner MCCPTestRunner) {
By("And templates can be filtered by provider - grid view", func() {
// Select cluster provider by selecting from the popup list
Expect(templatesPage.TemplateProvider.Click()).To(Succeed())
Expect(templatesPage.SelectProvider("AWSCluster").Click()).To(Succeed())
Expect(templatesPage.SelectProvider("aws").Click()).To(Succeed())

tileCount, _ := templatesPage.TemplateTiles.Count()
Eventually(tileCount).Should(Equal(awsTemplateCount+eksFargateTemplateCount), "The number of AWSCluster provider template tiles rendered should be equal to number of AWS templates created")
Eventually(tileCount).Should(Equal(awsTemplateCount+eksFargateTemplateCount), "The number of aws provider template tiles rendered should be equal to number of aws templates created")

// Select cluster provider by typing the provider name
Expect(templatesPage.TemplateProvider.Click()).To(Succeed())
Expect(templatesPage.TemplateProvider.SendKeys("\uE003")).To(Succeed()) // sending back space key
Expect(templatesPage.TemplateProvider.SendKeys("AzureCluster")).To(Succeed())
Expect(templatesPage.TemplateProvider.SendKeys("azure")).To(Succeed())
Expect(templatesPage.TemplateProviderPopup.At(0).Click()).To(Succeed())

tileCount, _ = templatesPage.TemplateTiles.Count()
Eventually(tileCount).Should(Equal(azureTemplateCount), "The number of AzureCluster provider template tiles rendered should be equal to number of Azure templates created")
Eventually(tileCount).Should(Equal(azureTemplateCount), "The number of azure provider template tiles rendered should be equal to number of azure templates created")
})
})
})
Expand Down Expand Up @@ -237,7 +237,7 @@ func DescribeMCCPTemplates(mccpTestRunner MCCPTestRunner) {
By("And I should choose a template - table view", func() {

templateRow := pages.GetTemplateRow(webDriver, "cluster-template-10")
Eventually(templateRow.Provider).Should(MatchText("Generic"))
Eventually(templateRow.Provider).Should(MatchText(""))
Eventually(templateRow.Description).Should(MatchText("This is test template 10"))
Expect(templateRow.CreateTemplate).Should(BeFound())
Expect(templateRow.CreateTemplate.Click()).To(Succeed())
Expand Down
4 changes: 2 additions & 2 deletions ui-cra/src/components/Templates/Card.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,9 @@ const TemplateCard: FC<{ template: Template }> = ({ template }) => {
};
const getTile = () => {
switch (template.provider) {
case 'AWSCluster':
case 'aws':
return <EKS />;
case 'GKECluster':
case 'gcp':
return <GKE />;
default:
return <Generic />;
Expand Down