Skip to content

Commit

Permalink
ConvertFrom/ConvertTo approach
Browse files Browse the repository at this point in the history
  • Loading branch information
aorcholski committed Jul 11, 2024
1 parent 903cd05 commit e8af565
Show file tree
Hide file tree
Showing 79 changed files with 1,425 additions and 1,524 deletions.
1 change: 1 addition & 0 deletions pkg/api/v1beta3/dynakube/convert_from.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ func (dst *DynaKube) fromActiveGateSpec(src *v1beta2.DynaKube) {
dst.Spec.ActiveGate.Resources = src.Spec.ActiveGate.Resources
dst.Spec.ActiveGate.Replicas = src.Spec.ActiveGate.Replicas

dst.Spec.ActiveGate.Capabilities = []CapabilityDisplayName{}
for _, capability := range src.Spec.ActiveGate.Capabilities {
dst.Spec.ActiveGate.Capabilities = append(dst.Spec.ActiveGate.Capabilities, CapabilityDisplayName(capability))
}
Expand Down
1 change: 1 addition & 0 deletions pkg/api/v1beta3/dynakube/convert_to.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ func (src *DynaKube) toActiveGateSpec(dst *v1beta2.DynaKube) {
dst.Spec.ActiveGate.Resources = src.Spec.ActiveGate.Resources
dst.Spec.ActiveGate.Replicas = src.Spec.ActiveGate.Replicas

dst.Spec.ActiveGate.Capabilities = []v1beta2.CapabilityDisplayName{}
for _, capability := range src.Spec.ActiveGate.Capabilities {
dst.Spec.ActiveGate.Capabilities = append(dst.Spec.ActiveGate.Capabilities, v1beta2.CapabilityDisplayName(capability))
}
Expand Down
22 changes: 11 additions & 11 deletions pkg/controllers/dynakube/activegate.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,35 +3,35 @@ package dynakube
import (
"context"

"github.com/Dynatrace/dynatrace-operator/pkg/api/v1beta2/dynakube"
"github.com/Dynatrace/dynatrace-operator/pkg/api/v1beta3/dynakube"
"github.com/Dynatrace/dynatrace-operator/pkg/clients/dynatrace"
"github.com/Dynatrace/dynatrace-operator/pkg/controllers/dynakube/istio"
"github.com/pkg/errors"
)

func (controller *Controller) reconcileActiveGate(ctx context.Context, dynakube *dynakube.DynaKube, dtc dynatrace.Client, istioClient *istio.Client) error {
reconciler := controller.activeGateReconcilerBuilder(controller.client, controller.apiReader, dynakube, dtc, istioClient, controller.tokens)
func (controller *Controller) reconcileActiveGate(ctx context.Context, dk *dynakube.DynaKube, dtc dynatrace.Client, istioClient *istio.Client) error {
reconciler := controller.activeGateReconcilerBuilder(controller.client, controller.apiReader, dk, dtc, istioClient, controller.tokens)
err := reconciler.Reconcile(ctx)

if err != nil {
return errors.WithMessage(err, "failed to reconcile ActiveGate")
}

controller.setupAutomaticApiMonitoring(ctx, dtc, dynakube)
controller.setupAutomaticApiMonitoring(ctx, dtc, dk)

return nil
}

func (controller *Controller) setupAutomaticApiMonitoring(ctx context.Context, dtc dynatrace.Client, dynakube *dynakube.DynaKube) {
if dynakube.Status.KubeSystemUUID != "" &&
dynakube.FeatureAutomaticKubernetesApiMonitoring() &&
dynakube.IsKubernetesMonitoringActiveGateEnabled() {
clusterLabel := dynakube.FeatureAutomaticKubernetesApiMonitoringClusterName()
func (controller *Controller) setupAutomaticApiMonitoring(ctx context.Context, dtc dynatrace.Client, dk *dynakube.DynaKube) {
if dk.Status.KubeSystemUUID != "" &&
dk.FeatureAutomaticKubernetesApiMonitoring() &&
dk.IsKubernetesMonitoringActiveGateEnabled() {
clusterLabel := dk.FeatureAutomaticKubernetesApiMonitoringClusterName()
if clusterLabel == "" {
clusterLabel = dynakube.Name
clusterLabel = dk.Name
}

err := controller.apiMonitoringReconcilerBuilder(dtc, dynakube, clusterLabel, dynakube.Status.KubeSystemUUID).
err := controller.apiMonitoringReconcilerBuilder(dtc, dk, clusterLabel, dk.Status.KubeSystemUUID).
Reconcile(ctx)
if err != nil {
log.Error(err, "could not create setting")
Expand Down
16 changes: 4 additions & 12 deletions pkg/controllers/dynakube/activegate/capability/capability.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@ import (
"fmt"
"strings"

"github.com/Dynatrace/dynatrace-operator/pkg/api/v1beta2/dynakube"
dynakubev1beta3 "github.com/Dynatrace/dynatrace-operator/pkg/api/v1beta3/dynakube"
"github.com/Dynatrace/dynatrace-operator/pkg/api/v1beta3/dynakube"
"github.com/Dynatrace/dynatrace-operator/pkg/controllers/dynakube/activegate/consts"
"k8s.io/utils/net"
)
Expand Down Expand Up @@ -76,21 +75,14 @@ func NewMultiCapability(dk *dynakube.DynaKube) Capability {
return &mc
}

dkV1beta3 := &dynakubev1beta3.DynaKube{}

err := dkV1beta3.ConvertFrom(dk)
if err != nil {
return &mc
}

if !dkV1beta3.ActiveGateMode() {
if !dk.ActiveGateMode() {
return &mc
}

mc.enabled = true
mc.properties = &dk.Spec.ActiveGate.CapabilityProperties

if len(dk.Spec.ActiveGate.Capabilities) == 0 && dkV1beta3.HasExtensionsEnabled() {
if len(dk.Spec.ActiveGate.Capabilities) == 0 && dk.HasExtensionsEnabled() {
mc.properties.Replicas = 1
}

Expand All @@ -109,7 +101,7 @@ func NewMultiCapability(dk *dynakube.DynaKube) Capability {
capabilityDisplayNames = append(capabilityDisplayNames, capGen.displayName)
}

if dkV1beta3.HasExtensionsEnabled() {
if dk.HasExtensionsEnabled() {
capabilityNames = append(capabilityNames, "extension_controller")
capabilityDisplayNames = append(capabilityDisplayNames, "extension_controller")
}
Expand Down
69 changes: 13 additions & 56 deletions pkg/controllers/dynakube/activegate/capability/capability_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@ package capability
import (
"testing"

"github.com/Dynatrace/dynatrace-operator/pkg/api/v1beta2/dynakube"
dynakubev1beta3 "github.com/Dynatrace/dynatrace-operator/pkg/api/v1beta3/dynakube"
"github.com/Dynatrace/dynatrace-operator/pkg/api/v1beta3/dynakube"
"github.com/Dynatrace/dynatrace-operator/pkg/controllers/dynakube/proxy"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
Expand All @@ -28,16 +27,9 @@ var (
dynakube.MetricsIngestCapability.DisplayName,
dynakube.DynatraceApiCapability.DisplayName,
}

capabilitiesV1beta3 = []dynakubev1beta3.CapabilityDisplayName{
dynakubev1beta3.RoutingCapability.DisplayName,
dynakubev1beta3.KubeMonCapability.DisplayName,
dynakubev1beta3.MetricsIngestCapability.DisplayName,
dynakubev1beta3.DynatraceApiCapability.DisplayName,
}
)

func buildDynakube(capabilities []dynakube.CapabilityDisplayName) *dynakube.DynaKube {
func buildDynakube(capabilities []dynakube.CapabilityDisplayName, enableExtensions bool) *dynakube.DynaKube {
return &dynakube.DynaKube{
ObjectMeta: metav1.ObjectMeta{
Namespace: testNamespace, Name: testName,
Expand All @@ -47,22 +39,8 @@ func buildDynakube(capabilities []dynakube.CapabilityDisplayName) *dynakube.Dyna
ActiveGate: dynakube.ActiveGateSpec{
Capabilities: capabilities,
},
},
}
}

func buildDynakubeV1beta3(capabilities []dynakubev1beta3.CapabilityDisplayName, enableExtensions bool) *dynakubev1beta3.DynaKube {
return &dynakubev1beta3.DynaKube{
ObjectMeta: metav1.ObjectMeta{
Namespace: testNamespace, Name: testName,
},
Spec: dynakubev1beta3.DynaKubeSpec{
APIURL: testApiUrl,
ActiveGate: dynakubev1beta3.ActiveGateSpec{
Capabilities: capabilities,
},
Extensions: dynakubev1beta3.ExtensionsSpec{
Prometheus: dynakubev1beta3.PrometheusSpec{
Extensions: dynakube.ExtensionsSpec{
Prometheus: dynakube.PrometheusSpec{
Enabled: enableExtensions,
},
},
Expand Down Expand Up @@ -90,17 +68,17 @@ func TestBuildServiceName(t *testing.T) {

func TestNewMultiCapability(t *testing.T) {
t.Run(`creates new multicapability`, func(t *testing.T) {
dynakube := buildDynakube(capabilities)
mc := NewMultiCapability(dynakube)
dk := buildDynakube(capabilities, false)
mc := NewMultiCapability(dk)
require.NotNil(t, mc)
assert.True(t, mc.Enabled())
assert.Equal(t, expectedShortName, mc.ShortName())
assert.Equal(t, expectedArgName, mc.ArgName())
})
t.Run(`creates new multicapability without capabilities set in dynakube`, func(t *testing.T) {
var emptyCapabilites []dynakube.CapabilityDisplayName
dynakube := buildDynakube(emptyCapabilites)
mc := NewMultiCapability(dynakube)
dk := buildDynakube(emptyCapabilites, false)
mc := NewMultiCapability(dk)
require.NotNil(t, mc)
assert.False(t, mc.Enabled())
assert.Equal(t, expectedShortName, mc.ShortName())
Expand All @@ -110,43 +88,22 @@ func TestNewMultiCapability(t *testing.T) {

func TestNewMultiCapabilityWithExtensions(t *testing.T) {
t.Run(`creates new multicapability with Extensions enabled`, func(t *testing.T) {
dynakubeV1beta3 := buildDynakubeV1beta3(capabilitiesV1beta3, true)
dynakube := dynakube.DynaKube{}
err := dynakubeV1beta3.ConvertTo(&dynakube)
require.NoError(t, err)

mc := NewMultiCapability(&dynakube)
dk := buildDynakube(capabilities, true)
mc := NewMultiCapability(dk)
require.NotNil(t, mc)
assert.True(t, mc.Enabled())
assert.Equal(t, expectedShortName, mc.ShortName())
assert.Equal(t, expectedArgNameWithExtensions, mc.ArgName())
})
t.Run(`creates new multicapability without capabilities set in dynakube and Extensions enabled`, func(t *testing.T) {
var emptyCapabilites []dynakubev1beta3.CapabilityDisplayName
dynakubeV1beta3 := buildDynakubeV1beta3(emptyCapabilites, true)
dynakube := dynakube.DynaKube{}
err := dynakubeV1beta3.ConvertTo(&dynakube)
require.NoError(t, err)

mc := NewMultiCapability(&dynakube)
var emptyCapabilites []dynakube.CapabilityDisplayName
dk := buildDynakube(emptyCapabilites, true)
mc := NewMultiCapability(dk)
require.NotNil(t, mc)
assert.True(t, mc.Enabled())
assert.Equal(t, expectedShortName, mc.ShortName())
assert.Equal(t, expectedArgNameWithExtensionsOnly, mc.ArgName())
})
t.Run(`creates new multicapability without capabilities set in dynakube and Extensions disabled`, func(t *testing.T) {
var emptyCapabilites []dynakubev1beta3.CapabilityDisplayName
dynakubeV1beta3 := buildDynakubeV1beta3(emptyCapabilites, false)
dynakube := dynakube.DynaKube{}
err := dynakubeV1beta3.ConvertTo(&dynakube)
require.NoError(t, err)

mc := NewMultiCapability(&dynakube)
require.NotNil(t, mc)
assert.False(t, mc.Enabled())
assert.Equal(t, expectedShortName, mc.ShortName())
assert.Equal(t, "", mc.ArgName())
})
}

func TestBuildServiceDomainNameForDNSEntryPoint(t *testing.T) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,7 @@ import (
"strings"
"time"

"github.com/Dynatrace/dynatrace-operator/pkg/api/v1beta2/dynakube"
dynakubev1beta3 "github.com/Dynatrace/dynatrace-operator/pkg/api/v1beta3/dynakube"
"github.com/Dynatrace/dynatrace-operator/pkg/api/v1beta3/dynakube"
dtclient "github.com/Dynatrace/dynatrace-operator/pkg/clients/dynatrace"
"github.com/Dynatrace/dynatrace-operator/pkg/controllers"
"github.com/Dynatrace/dynatrace-operator/pkg/util/conditions"
Expand Down Expand Up @@ -46,20 +45,13 @@ func NewReconciler(clt client.Client, apiReader client.Reader, dk *dynakube.Dyna
}

func (r *Reconciler) Reconcile(ctx context.Context) error {
dynakubeV1beta3 := &dynakubev1beta3.DynaKube{}

err := dynakubeV1beta3.ConvertFrom(r.dynakube)
if err != nil {
return err
}

if !dynakubeV1beta3.NeedsActiveGate() {
if !r.dynakube.NeedsActiveGate() {
_ = meta.RemoveStatusCondition(r.dynakube.Conditions(), ActiveGateAuthTokenSecretConditionType)

return nil
}

err = r.reconcileAuthTokenSecret(ctx)
err := r.reconcileAuthTokenSecret(ctx)
if err != nil {
return errors.WithMessage(err, "failed to create activeGateAuthToken secret")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import (
"testing"
"time"

dynatracev1beta2 "github.com/Dynatrace/dynatrace-operator/pkg/api/v1beta2/dynakube"
"github.com/Dynatrace/dynatrace-operator/pkg/api/v1beta3/dynakube"
dtclient "github.com/Dynatrace/dynatrace-operator/pkg/clients/dynatrace"
"github.com/Dynatrace/dynatrace-operator/pkg/util/conditions"
dtclientmock "github.com/Dynatrace/dynatrace-operator/test/mocks/pkg/clients/dynatrace"
Expand All @@ -23,7 +23,7 @@ import (
const (
testDynakubeName = "test-dynakube"
testNamespace = "test-namespace"
secretName = testDynakubeName + dynatracev1beta2.AuthTokenSecretSuffix
secretName = testDynakubeName + dynakube.AuthTokenSecretSuffix
testToken = "dt.testtoken.test"
)

Expand All @@ -34,24 +34,24 @@ var (
}
)

func newInstance() *dynatracev1beta2.DynaKube {
return &dynatracev1beta2.DynaKube{
func newInstance() *dynakube.DynaKube {
return &dynakube.DynaKube{
ObjectMeta: metav1.ObjectMeta{
Namespace: testNamespace,
Name: testDynakubeName,
},
Spec: dynatracev1beta2.DynaKubeSpec{
Spec: dynakube.DynaKubeSpec{
APIURL: "https://testing.dev.dynatracelabs.com/api",
ActiveGate: dynatracev1beta2.ActiveGateSpec{
Capabilities: []dynatracev1beta2.CapabilityDisplayName{
dynatracev1beta2.RoutingCapability.DisplayName,
ActiveGate: dynakube.ActiveGateSpec{
Capabilities: []dynakube.CapabilityDisplayName{
dynakube.RoutingCapability.DisplayName,
},
},
},
}
}

func newTestReconciler(t *testing.T, client client.Client, instance *dynatracev1beta2.DynaKube) *Reconciler {
func newTestReconciler(t *testing.T, client client.Client, instance *dynakube.DynaKube) *Reconciler {
dtc := dtclientmock.NewClient(t)
dtc.On("GetActiveGateAuthToken", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(testAgAuthTokenResponse, nil)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@ import (
"context"
"reflect"

"github.com/Dynatrace/dynatrace-operator/pkg/api/v1beta2/dynakube"
dynakubev1beta3 "github.com/Dynatrace/dynatrace-operator/pkg/api/v1beta3/dynakube"
"github.com/Dynatrace/dynatrace-operator/pkg/api/v1beta3/dynakube"
"github.com/Dynatrace/dynatrace-operator/pkg/controllers"
"github.com/Dynatrace/dynatrace-operator/pkg/controllers/dynakube/activegate/capability"
"github.com/Dynatrace/dynatrace-operator/pkg/util/kubeobjects/object"
Expand Down Expand Up @@ -39,19 +38,12 @@ func NewReconciler(clt client.Client, capability capability.Capability, dk *dyna
type NewReconcilerFunc = func(clt client.Client, capability capability.Capability, dk *dynakube.DynaKube, statefulsetReconciler controllers.Reconciler, customPropertiesReconciler controllers.Reconciler) controllers.Reconciler

func (r *Reconciler) Reconcile(ctx context.Context) error {
dynakubeV1beta3 := &dynakubev1beta3.DynaKube{}

err := dynakubeV1beta3.ConvertFrom(r.dynakube)
if err != nil {
return err
}

err = r.customPropertiesReconciler.Reconcile(ctx)
err := r.customPropertiesReconciler.Reconcile(ctx)
if err != nil {
return errors.WithStack(err)
}

if dynakubeV1beta3.NeedsActiveGateService() {
if r.dynakube.NeedsActiveGateService() {
err = r.createOrUpdateService(ctx)
if err != nil {
return err
Expand Down
Loading

0 comments on commit e8af565

Please sign in to comment.