Skip to content
This repository has been archived by the owner on Sep 15, 2022. It is now read-only.

Addons docs configurable #4

Merged
Merged
Show file tree
Hide file tree
Changes from all 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
1 change: 1 addition & 0 deletions internal/config/controller_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ type ControllerConfig struct {
Storage []storage.Config `valid:"required"`
DevelopMode bool
UploadServiceURL string `default:"http://assetstore-asset-upload-service.kyma-system.svc.cluster.local:3000"`
DocumentationEnabled bool
}

// LoadControllerConfig method has following strategy:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,19 @@ import (
"github.com/Masterminds/semver"
"github.com/kubernetes-incubator/service-catalog/pkg/apis/servicecatalog/v1beta1"
"github.com/kyma-project/helm-broker/internal"
"github.com/kyma-project/helm-broker/internal/addon"
"github.com/kyma-project/helm-broker/internal/controller/automock"
"github.com/kyma-project/helm-broker/pkg/apis"
"github.com/kyma-project/helm-broker/pkg/apis/addons/v1alpha1"
"github.com/kyma-project/helm-broker/platform/logger/spy"
cms "github.com/kyma-project/kyma/components/cms-controller-manager/pkg/apis/cms/v1alpha1"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/types"
"k8s.io/helm/pkg/proto/hapi/chart"
"sigs.k8s.io/controller-runtime/pkg/client/fake"
"sigs.k8s.io/controller-runtime/pkg/manager"
"sigs.k8s.io/controller-runtime/pkg/reconcile"
Expand Down Expand Up @@ -449,3 +452,83 @@ func fixDeletedClusterAddonsConfiguration() *v1alpha1.ClusterAddonsConfiguration
},
}
}

func fixAddonWithDocsURL(id, name, url, docsURL string) addon.CompleteAddon {
chartName := fmt.Sprintf("chart-%s", name)
chartVersion := semver.MustParse("1.0.0")
return addon.CompleteAddon{
Addon: &internal.Addon{
ID: internal.AddonID(id),
Name: internal.AddonName(name),
Description: "simple description",
Version: *semver.MustParse("0.0.1"),
RepositoryURL: url,
Plans: map[internal.AddonPlanID]internal.AddonPlan{
internal.AddonPlanID(fmt.Sprintf("plan-%s", name)): {
ChartRef: internal.ChartRef{
Name: internal.ChartName(chartName),
Version: *chartVersion,
},
},
},
Docs: []internal.AddonDocs{
{
Template: cms.CommonDocsTopicSpec{
Sources: []cms.Source{
{
URL: docsURL,
},
},
},
},
},
},
Charts: []*chart.Chart{
{
Metadata: &chart.Metadata{
Name: chartName,
Version: chartVersion.String(),
},
},
},
}
}

func fixAddonWithEmptyDocs(id, name, url string) addon.CompleteAddon {
chartName := fmt.Sprintf("chart-%s", name)
chartVersion := semver.MustParse("1.0.0")
return addon.CompleteAddon{
Addon: &internal.Addon{
ID: internal.AddonID(id),
Name: internal.AddonName(name),
Description: "simple description",
Version: *semver.MustParse("0.0.1"),
RepositoryURL: url,
Plans: map[internal.AddonPlanID]internal.AddonPlan{
internal.AddonPlanID(fmt.Sprintf("plan-%s", name)): {
ChartRef: internal.ChartRef{
Name: internal.ChartName(chartName),
Version: *chartVersion,
},
},
},
Docs: []internal.AddonDocs{
{
Template: cms.CommonDocsTopicSpec{
Sources: []cms.Source{
{},
},
},
},
},
},
Charts: []*chart.Chart{
{
Metadata: &chart.Metadata{
Name: chartName,
Version: chartVersion.String(),
},
},
},
}
}
27 changes: 27 additions & 0 deletions internal/controller/docs/dummy_provider.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package docs

import "github.com/kyma-project/helm-broker/internal"

// DummyProvider is an implementation which does not perform any work but have the same interface as the Provider
type DummyProvider struct {
}

// EnsureDocsTopic fulfills the docsFacade interface
func (s *DummyProvider) EnsureDocsTopic(addon *internal.Addon, namespace string) error {
return nil
}

// EnsureDocsTopicRemoved fulfills the docsFacade interface
func (*DummyProvider) EnsureDocsTopicRemoved(id string, namespace string) error {
return nil
}

// EnsureClusterDocsTopic fulfills the docsFacade interface
func (*DummyProvider) EnsureClusterDocsTopic(addon *internal.Addon) error {
return nil
}

// EnsureClusterDocsTopicRemoved fulfills the docsFacade interface
func (*DummyProvider) EnsureClusterDocsTopicRemoved(id string) error {
return nil
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package controller
package docs

import (
"context"
Expand All @@ -14,14 +14,14 @@ import (
"sigs.k8s.io/controller-runtime/pkg/client"
)

// DocsProvider allows to maintain the addons documentation
type DocsProvider struct {
// Provider allows to maintain the addons documentation
type Provider struct {
dynamicClient client.Client
}

// NewDocsProvider creates a new DocsProvider
func NewDocsProvider(dynamicClient client.Client) *DocsProvider {
return &DocsProvider{
// NewProvider creates a new Provider
func NewProvider(dynamicClient client.Client) *Provider {
return &Provider{
dynamicClient: dynamicClient,
}
}
Expand All @@ -32,7 +32,7 @@ const (
)

// EnsureClusterDocsTopic creates ClusterDocsTopic for a given addon or updates it in case it already exists
func (d *DocsProvider) EnsureClusterDocsTopic(addon *internal.Addon) error {
func (d *Provider) EnsureClusterDocsTopic(addon *internal.Addon) error {
addon.Docs[0].Template.Sources = d.defaultDocsSourcesURLs(addon)
cdt := &v1alpha1.ClusterDocsTopic{
ObjectMeta: v1.ObjectMeta{
Expand Down Expand Up @@ -60,7 +60,7 @@ func (d *DocsProvider) EnsureClusterDocsTopic(addon *internal.Addon) error {
}

// EnsureClusterDocsTopicRemoved removes ClusterDocsTopic for a given addon
func (d *DocsProvider) EnsureClusterDocsTopicRemoved(id string) error {
func (d *Provider) EnsureClusterDocsTopicRemoved(id string) error {
cdt := &v1alpha1.ClusterDocsTopic{
ObjectMeta: v1.ObjectMeta{
Name: id,
Expand All @@ -74,7 +74,7 @@ func (d *DocsProvider) EnsureClusterDocsTopicRemoved(id string) error {
}

// EnsureDocsTopic creates ClusterDocsTopic for a given addon or updates it in case it already exists
func (d *DocsProvider) EnsureDocsTopic(addon *internal.Addon, namespace string) error {
func (d *Provider) EnsureDocsTopic(addon *internal.Addon, namespace string) error {
addon.Docs[0].Template.Sources = d.defaultDocsSourcesURLs(addon)
dt := &v1alpha1.DocsTopic{
ObjectMeta: v1.ObjectMeta{
Expand Down Expand Up @@ -103,7 +103,7 @@ func (d *DocsProvider) EnsureDocsTopic(addon *internal.Addon, namespace string)
}

// EnsureDocsTopicRemoved removes ClusterDocsTopic for a given addon
func (d *DocsProvider) EnsureDocsTopicRemoved(id string, namespace string) error {
func (d *Provider) EnsureDocsTopicRemoved(id string, namespace string) error {
dt := &v1alpha1.DocsTopic{
ObjectMeta: v1.ObjectMeta{
Name: id,
Expand All @@ -117,7 +117,7 @@ func (d *DocsProvider) EnsureDocsTopicRemoved(id string, namespace string) error
return nil
}

func (d *DocsProvider) defaultDocsSourcesURLs(addon *internal.Addon) []v1alpha1.Source {
func (d *Provider) defaultDocsSourcesURLs(addon *internal.Addon) []v1alpha1.Source {
// we use repositoryURL as the default sourceURL if its not provided
var sources []v1alpha1.Source
for _, source := range addon.Docs[0].Template.Sources {
Expand All @@ -129,7 +129,7 @@ func (d *DocsProvider) defaultDocsSourcesURLs(addon *internal.Addon) []v1alpha1.
return sources
}

func (d *DocsProvider) updateClusterDocsTopic(addon *internal.Addon) error {
func (d *Provider) updateClusterDocsTopic(addon *internal.Addon) error {
cdt := &v1alpha1.ClusterDocsTopic{}
if err := d.dynamicClient.Get(context.Background(), types.NamespacedName{Name: string(addon.ID)}, cdt); err != nil {
return errors.Wrapf(err, "while getting ClusterDocsTopic %s", addon.ID)
Expand All @@ -146,7 +146,7 @@ func (d *DocsProvider) updateClusterDocsTopic(addon *internal.Addon) error {
return nil
}

func (d *DocsProvider) updateDocsTopic(addon *internal.Addon, namespace string) error {
func (d *Provider) updateDocsTopic(addon *internal.Addon, namespace string) error {
dt := &v1alpha1.DocsTopic{}
if err := d.dynamicClient.Get(context.Background(), types.NamespacedName{Name: string(addon.ID), Namespace: namespace}, dt); err != nil {
return errors.Wrapf(err, "while getting DocsTopic %s", addon.ID)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package controller
package docs

import (
"context"
Expand All @@ -20,7 +20,7 @@ import (
"sigs.k8s.io/controller-runtime/pkg/client/fake"
)

func TestDocsProvider_EnsureClusterDocsTopic(t *testing.T) {
func TestProvider_EnsureClusterDocsTopic(t *testing.T) {
// given
err := v1alpha1.AddToScheme(scheme.Scheme)
require.NoError(t, err)
Expand All @@ -35,7 +35,7 @@ func TestDocsProvider_EnsureClusterDocsTopic(t *testing.T) {
t.Run(tn, func(t *testing.T) {
c := fake.NewFakeClient()
cdt := fixClusterDocsTopic(id)
docsProvider := NewDocsProvider(c)
docsProvider := NewProvider(c)

// when
err = docsProvider.EnsureClusterDocsTopic(tc.givenAddon.Addon)
Expand All @@ -49,7 +49,7 @@ func TestDocsProvider_EnsureClusterDocsTopic(t *testing.T) {
}
}

func TestDocsProvider_EnsureClusterDocsTopic_UpdateIfExist(t *testing.T) {
func TestProvider_EnsureClusterDocsTopic_UpdateIfExist(t *testing.T) {
// given
err := v1alpha1.AddToScheme(scheme.Scheme)
require.NoError(t, err)
Expand All @@ -60,7 +60,7 @@ func TestDocsProvider_EnsureClusterDocsTopic_UpdateIfExist(t *testing.T) {
addonWithEmptyDocsURL.Addon.Docs[0].Template.Description = "new description"

c := fake.NewFakeClient(cdt)
docsProvider := NewDocsProvider(c)
docsProvider := NewProvider(c)

// when
err = docsProvider.EnsureClusterDocsTopic(addonWithEmptyDocsURL.Addon)
Expand All @@ -80,7 +80,7 @@ func TestDocsProvider_EnsureClusterDocsTopicRemoved(t *testing.T) {
const id = "123"
cdt := fixClusterDocsTopic(id)
c := fake.NewFakeClient(cdt)
docsProvider := NewDocsProvider(c)
docsProvider := NewProvider(c)

// when
err = docsProvider.EnsureClusterDocsTopicRemoved(id)
Expand All @@ -99,7 +99,7 @@ func TestDocsProvider_EnsureClusterDocsTopicRemoved_NotExists(t *testing.T) {
const id = "123"
cdt := fixClusterDocsTopic(id)
c := fake.NewFakeClient()
docsProvider := NewDocsProvider(c)
docsProvider := NewProvider(c)

// when
err = docsProvider.EnsureClusterDocsTopicRemoved(id)
Expand All @@ -124,7 +124,7 @@ func TestDocsProvider_EnsureDocsTopic(t *testing.T) {
} {
t.Run(tn, func(t *testing.T) {
c := fake.NewFakeClient(dt)
docsProvider := NewDocsProvider(c)
docsProvider := NewProvider(c)

// when
err = docsProvider.EnsureDocsTopic(tc.givenAddon.Addon, dt.Namespace)
Expand All @@ -150,7 +150,7 @@ func TestDocsProvider_EnsureDocsTopic_UpdateIfExist(t *testing.T) {
addonWithEmptyDocsURL.Addon.Docs[0].Template.Description = "new description"

c := fake.NewFakeClient(dt)
docsProvider := NewDocsProvider(c)
docsProvider := NewProvider(c)

// when
err = docsProvider.EnsureDocsTopic(addonWithEmptyDocsURL.Addon, dt.Namespace)
Expand All @@ -170,7 +170,7 @@ func TestDocsProvider_EnsureDocsTopicRemoved(t *testing.T) {

dt := fixDocsTopic()
c := fake.NewFakeClient(dt)
docsProvider := NewDocsProvider(c)
docsProvider := NewProvider(c)

// when
err = docsProvider.EnsureDocsTopicRemoved(dt.Name, dt.Namespace)
Expand All @@ -189,7 +189,7 @@ func TestDocsProvider_EnsureDocsTopicRemoved_NotExists(t *testing.T) {

dt := fixDocsTopic()
c := fake.NewFakeClient()
docsProvider := NewDocsProvider(c)
docsProvider := NewProvider(c)

// when
err = docsProvider.EnsureDocsTopicRemoved(dt.Name, dt.Namespace)
Expand Down
5 changes: 5 additions & 0 deletions internal/controller/ext.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,3 +69,8 @@ type clusterDocsProvider interface {
type clusterBrokerSyncer interface {
Sync() error
}

type docsFacade interface {
clusterDocsProvider
docsProvider
}
9 changes: 8 additions & 1 deletion internal/controller/setup.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"github.com/kyma-project/helm-broker/internal/assetstore"
"github.com/kyma-project/helm-broker/internal/config"
"github.com/kyma-project/helm-broker/internal/controller/broker"
"github.com/kyma-project/helm-broker/internal/controller/docs"
"github.com/kyma-project/helm-broker/internal/storage"
"github.com/kyma-project/helm-broker/pkg/apis"
"github.com/kyma-project/kyma/components/cms-controller-manager/pkg/apis/cms/v1alpha1"
Expand Down Expand Up @@ -41,7 +42,13 @@ func SetupAndStartController(cfg *rest.Config, ctrCfg *config.ControllerConfig,
fatalOnError(v1alpha1.AddToScheme(mgr.GetScheme()), "while adding CMS scheme")

// Setup dependencies
docsProvider := NewDocsProvider(mgr.GetClient())

var docsProvider docsFacade
docsProvider = docs.NewProvider(mgr.GetClient())
if !ctrCfg.DocumentationEnabled {
docsProvider = &docs.DummyProvider{}
}

brokerSyncer := broker.NewServiceBrokerSyncer(mgr.GetClient(), ctrCfg.ClusterServiceBrokerName, lg)
sbFacade := broker.NewBrokersFacade(mgr.GetClient(), brokerSyncer, ctrCfg.Namespace, ctrCfg.ServiceName, lg)
csbFacade := broker.NewClusterBrokersFacade(mgr.GetClient(), brokerSyncer, ctrCfg.Namespace, ctrCfg.ServiceName, ctrCfg.ClusterServiceBrokerName, lg)
Expand Down
Loading