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 de1ae75 commit 8d004dc
Show file tree
Hide file tree
Showing 71 changed files with 1,312 additions and 1,409 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
20 changes: 17 additions & 3 deletions pkg/controllers/dynakube/activegate.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,34 @@ import (
"context"

"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/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 {
dynakubeV1beta3 := &dynakubev1beta3.DynaKube{}
if err := dynakubeV1beta3.ConvertFrom(dk); err != nil {
return err
}

reconciler := controller.activeGateReconcilerBuilder(controller.client, controller.apiReader, dynakubeV1beta3, dtc, istioClient, controller.tokens)
err := reconciler.Reconcile(ctx)

if errc := dynakubeV1beta3.ConvertTo(dk); errc != nil {
if err != nil {
return errors.WithMessage(errors.WithMessage(errc, "failed to convert dynakube version"), "failed to reconcile ActiveGate")
}

return err
}

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

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

return nil
}
Expand Down
50 changes: 4 additions & 46 deletions pkg/controllers/dynakube/activegate/capability/capability.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,8 @@ 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"
)

type baseFunc func() *capabilityBase
Expand Down Expand Up @@ -76,21 +74,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 +100,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 Expand Up @@ -173,36 +164,3 @@ func BuildServiceName(dynakubeName string, module string) string {
func BuildDNSEntryPointWithoutEnvVars(dynakubeName, dynakubeNamespace string, capability Capability) string {
return fmt.Sprintf("%s.%s", BuildServiceName(dynakubeName, capability.ShortName()), dynakubeNamespace)
}

func BuildDNSEntryPoint(dk dynakube.DynaKube, capability Capability) string {
entries := []string{}

for _, ip := range dk.Status.ActiveGate.ServiceIPs {
if net.IsIPv6String(ip) {
ip = "[" + ip + "]"
}

serviceHostEntry := buildDNSEntry(buildServiceHostName(ip))
entries = append(entries, serviceHostEntry)
}

if dk.IsRoutingActiveGateEnabled() {
serviceDomain := buildServiceDomainName(dk.Name, dk.Namespace, capability.ShortName())
serviceDomainEntry := buildDNSEntry(serviceDomain)
entries = append(entries, serviceDomainEntry)
}

return strings.Join(entries, ",")
}

func buildServiceHostName(host string) string {
return fmt.Sprintf("%s:%d", host, consts.HttpsServicePort)
}

func buildServiceDomainName(dynakubeName string, namespaceName string, module string) string {
return fmt.Sprintf("%s.%s:%d", BuildServiceName(dynakubeName, module), namespaceName, consts.HttpsServicePort)
}

func buildDNSEntry(host string) string {
return fmt.Sprintf("https://%s/communication", host)
}
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
43 changes: 43 additions & 0 deletions pkg/controllers/dynakube/activegate/capability/dnsentrypoint.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package capability

import (
"fmt"
"strings"

"github.com/Dynatrace/dynatrace-operator/pkg/api/v1beta3/dynakube"
"github.com/Dynatrace/dynatrace-operator/pkg/controllers/dynakube/activegate/consts"
"k8s.io/utils/net"
)

func BuildDNSEntryPoint(dk dynakube.DynaKube, capability Capability) string {
entries := []string{}

for _, ip := range dk.Status.ActiveGate.ServiceIPs {
if net.IsIPv6String(ip) {
ip = "[" + ip + "]"
}

serviceHostEntry := buildDNSEntry(buildServiceHostName(ip))
entries = append(entries, serviceHostEntry)
}

if dk.IsRoutingActiveGateEnabled() {
serviceDomain := buildServiceDomainName(dk.Name, dk.Namespace, capability.ShortName())
serviceDomainEntry := buildDNSEntry(serviceDomain)
entries = append(entries, serviceDomainEntry)
}

return strings.Join(entries, ",")
}

func buildServiceHostName(host string) string {
return fmt.Sprintf("%s:%d", host, consts.HttpsServicePort)
}

func buildServiceDomainName(dynakubeName string, namespaceName string, module string) string {
return fmt.Sprintf("%s.%s:%d", BuildServiceName(dynakubeName, module), namespaceName, consts.HttpsServicePort)
}

func buildDNSEntry(host string) string {
return fmt.Sprintf("https://%s/communication", host)
}
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
Loading

0 comments on commit 8d004dc

Please sign in to comment.