Skip to content

Commit

Permalink
enables ExtensionsController module on ActiveGate
Browse files Browse the repository at this point in the history
  • Loading branch information
aorcholski committed Jul 9, 2024
1 parent 59e37c6 commit 74de5f2
Show file tree
Hide file tree
Showing 25 changed files with 892 additions and 397 deletions.
26 changes: 16 additions & 10 deletions cmd/troubleshoot/image.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ import (
"context"
"net/http"

dynatracev1beta2 "github.com/Dynatrace/dynatrace-operator/pkg/api/v1beta2/dynakube"
"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/arch"
"github.com/Dynatrace/dynatrace-operator/pkg/logd"
"github.com/google/go-containerregistry/pkg/authn"
Expand All @@ -30,25 +31,30 @@ type Auths struct {

type ImagePullFunc func(image string) error

func verifyAllImagesAvailable(ctx context.Context, baseLog logd.Logger, keychain authn.Keychain, transport *http.Transport, dynakube *dynatracev1beta2.DynaKube) error {
func verifyAllImagesAvailable(ctx context.Context, baseLog logd.Logger, keychain authn.Keychain, transport *http.Transport, dk *dynakube.DynaKube) error {
log := baseLog.WithName("imagepull")

imagePullFunc := CreateImagePullFunc(ctx, keychain, transport)

if dynakube.NeedsOneAgent() {
verifyImageIsAvailable(log, imagePullFunc, dynakube, componentOneAgent, false)
verifyImageIsAvailable(log, imagePullFunc, dynakube, componentCodeModules, true)
if dk.NeedsOneAgent() {
verifyImageIsAvailable(log, imagePullFunc, dk, componentOneAgent, false)
verifyImageIsAvailable(log, imagePullFunc, dk, componentCodeModules, true)
}

if dynakube.NeedsActiveGate() {
verifyImageIsAvailable(log, imagePullFunc, dynakube, componentActiveGate, false)
dynakubeV1beta3 := &dynakubev1beta3.DynaKube{}
if err := dynakubeV1beta3.ConvertFrom(dk); err != nil {
return err
}

if dynakubeV1beta3.NeedsActiveGate() {
verifyImageIsAvailable(log, imagePullFunc, dk, componentActiveGate, false)
}

return nil
}

func verifyImageIsAvailable(log logd.Logger, pullImage ImagePullFunc, dynakube *dynatracev1beta2.DynaKube, comp component, proxyWarning bool) {
image, isCustomImage := comp.getImage(dynakube)
func verifyImageIsAvailable(log logd.Logger, pullImage ImagePullFunc, dk *dynakube.DynaKube, comp component, proxyWarning bool) {
image, isCustomImage := comp.getImage(dk)
if comp.SkipImageCheck(image) {
logErrorf(log, "Unknown %s image", comp.String())

Expand All @@ -64,7 +70,7 @@ func verifyImageIsAvailable(log logd.Logger, pullImage ImagePullFunc, dynakube *
return
}

if dynakube.HasProxy() && proxyWarning {
if dk.HasProxy() && proxyWarning {
logWarningf(log, "Proxy setting in Dynakube is ignored for %s image due to technical limitations.", componentName)
}

Expand Down
4 changes: 2 additions & 2 deletions pkg/api/v1beta3/dynakube/convert_to.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,12 @@ func (src *DynaKube) ConvertTo(dstRaw conversion.Hub) error {
}

func (src *DynaKube) toBase(dst *v1beta2.DynaKube) {
dst.ObjectMeta = *src.ObjectMeta.DeepCopy() // DeepCopy mainly relevant for testing

if dst.Annotations == nil {
dst.Annotations = map[string]string{}
}

dst.ObjectMeta = *src.ObjectMeta.DeepCopy() // DeepCopy mainly relevant for testing

dst.Spec.APIURL = src.Spec.APIURL
dst.Spec.Tokens = src.Spec.Tokens
dst.Spec.CustomPullSecret = src.Spec.CustomPullSecret
Expand Down
15 changes: 8 additions & 7 deletions pkg/api/v1beta3/dynakube/properties.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,11 @@ func (dk *DynaKube) OneAgentDaemonsetName() string {
}

func (dk *DynaKube) ActiveGateMode() bool {
return len(dk.Spec.ActiveGate.Capabilities) > 0
return len(dk.Spec.ActiveGate.Capabilities) > 0 || dk.HasExtensionsEnabled()
}

func (dk *DynaKube) HasExtensionsEnabled() bool {
return dk.Spec.Extensions.Prometheus.Enabled
}

func (dk *DynaKube) IsActiveGateMode(mode CapabilityDisplayName) bool {
Expand Down Expand Up @@ -143,14 +147,11 @@ func (dk *DynaKube) IsMetricsIngestActiveGateEnabled() bool {
return dk.IsActiveGateMode(MetricsIngestCapability.DisplayName)
}

func (dk *DynaKube) NeedsActiveGateServicePorts() bool {
func (dk *DynaKube) NeedsActiveGateService() bool {
return dk.IsRoutingActiveGateEnabled() ||
dk.IsApiActiveGateEnabled() ||
dk.IsMetricsIngestActiveGateEnabled()
}

func (dk *DynaKube) NeedsActiveGateService() bool {
return dk.NeedsActiveGateServicePorts()
dk.IsMetricsIngestActiveGateEnabled() ||
dk.HasExtensionsEnabled()
}

func (dk *DynaKube) HasActiveGateCaCert() bool {
Expand Down
82 changes: 53 additions & 29 deletions pkg/controllers/dynakube/activegate/capability/capability.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,20 @@ import (
"fmt"
"strings"

dynatracev1beta2 "github.com/Dynatrace/dynatrace-operator/pkg/api/v1beta2/dynakube"
"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/controllers/dynakube/activegate/consts"
"k8s.io/utils/net"
)

type baseFunc func() *capabilityBase

var (
activeGateCapabilities = map[dynatracev1beta2.CapabilityDisplayName]baseFunc{
dynatracev1beta2.KubeMonCapability.DisplayName: kubeMonBase,
dynatracev1beta2.RoutingCapability.DisplayName: routingBase,
dynatracev1beta2.MetricsIngestCapability.DisplayName: metricsIngestBase,
dynatracev1beta2.DynatraceApiCapability.DisplayName: dynatraceApiBase,
activeGateCapabilities = map[dynakube.CapabilityDisplayName]baseFunc{
dynakube.KubeMonCapability.DisplayName: kubeMonBase,
dynakube.RoutingCapability.DisplayName: routingBase,
dynakube.MetricsIngestCapability.DisplayName: metricsIngestBase,
dynakube.DynatraceApiCapability.DisplayName: dynatraceApiBase,
}
)

Expand All @@ -25,11 +26,11 @@ type Capability interface {
ShortName() string
ArgName() string
DisplayName() string
Properties() *dynatracev1beta2.CapabilityProperties
Properties() *dynakube.CapabilityProperties
}

type capabilityBase struct {
properties *dynatracev1beta2.CapabilityProperties
properties *dynakube.CapabilityProperties
shortName string
argName string
displayName string
Expand All @@ -40,7 +41,7 @@ func (capability *capabilityBase) Enabled() bool {
return capability.enabled
}

func (capability *capabilityBase) Properties() *dynatracev1beta2.CapabilityProperties {
func (capability *capabilityBase) Properties() *dynakube.CapabilityProperties {
return capability.properties
}

Expand All @@ -64,30 +65,53 @@ type MultiCapability struct {
capabilityBase
}

func NewMultiCapability(dk *dynatracev1beta2.DynaKube) Capability {
func NewMultiCapability(dk *dynakube.DynaKube) Capability {
mc := MultiCapability{
capabilityBase{
shortName: consts.MultiActiveGateName,
},
}
if dk == nil || !dk.ActiveGateMode() {

if dk == nil {
return &mc
}

dkV1beta3 := &dynakubev1beta3.DynaKube{}

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

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

mc.enabled = true
mc.properties = &dk.Spec.ActiveGate.CapabilityProperties
capabilityNames := []string{}
capabilityDisplayNames := make([]string, len(dk.Spec.ActiveGate.Capabilities))

for i, capName := range dk.Spec.ActiveGate.Capabilities {
if len(dk.Spec.ActiveGate.Capabilities) == 0 && dkV1beta3.HasExtensionsEnabled() {
mc.properties.Replicas = 1
}

capabilityNames := make([]string, 0)

capabilityDisplayNames := make([]string, 0)

for _, capName := range dk.Spec.ActiveGate.Capabilities {
capabilityGenerator, ok := activeGateCapabilities[capName]
if !ok {
continue
}

capGen := capabilityGenerator()
capabilityNames = append(capabilityNames, capGen.argName)
capabilityDisplayNames[i] = capGen.displayName
capabilityDisplayNames = append(capabilityDisplayNames, capGen.displayName)
}

if dkV1beta3.HasExtensionsEnabled() {
capabilityNames = append(capabilityNames, "extension_controller")
capabilityDisplayNames = append(capabilityDisplayNames, "extension_controller")
}

mc.argName = strings.Join(capabilityNames, ",")
Expand All @@ -98,45 +122,45 @@ func NewMultiCapability(dk *dynatracev1beta2.DynaKube) Capability {

func kubeMonBase() *capabilityBase {
c := capabilityBase{
shortName: dynatracev1beta2.KubeMonCapability.ShortName,
argName: dynatracev1beta2.KubeMonCapability.ArgumentName,
displayName: string(dynatracev1beta2.KubeMonCapability.DisplayName),
shortName: dynakube.KubeMonCapability.ShortName,
argName: dynakube.KubeMonCapability.ArgumentName,
displayName: string(dynakube.KubeMonCapability.DisplayName),
}

return &c
}

func routingBase() *capabilityBase {
c := capabilityBase{
shortName: dynatracev1beta2.RoutingCapability.ShortName,
argName: dynatracev1beta2.RoutingCapability.ArgumentName,
displayName: string(dynatracev1beta2.RoutingCapability.DisplayName),
shortName: dynakube.RoutingCapability.ShortName,
argName: dynakube.RoutingCapability.ArgumentName,
displayName: string(dynakube.RoutingCapability.DisplayName),
}

return &c
}

func metricsIngestBase() *capabilityBase {
c := capabilityBase{
shortName: dynatracev1beta2.MetricsIngestCapability.ShortName,
argName: dynatracev1beta2.MetricsIngestCapability.ArgumentName,
displayName: string(dynatracev1beta2.MetricsIngestCapability.DisplayName),
shortName: dynakube.MetricsIngestCapability.ShortName,
argName: dynakube.MetricsIngestCapability.ArgumentName,
displayName: string(dynakube.MetricsIngestCapability.DisplayName),
}

return &c
}

func dynatraceApiBase() *capabilityBase {
c := capabilityBase{
shortName: dynatracev1beta2.DynatraceApiCapability.ShortName,
argName: dynatracev1beta2.DynatraceApiCapability.ArgumentName,
displayName: string(dynatracev1beta2.DynatraceApiCapability.DisplayName),
shortName: dynakube.DynatraceApiCapability.ShortName,
argName: dynakube.DynatraceApiCapability.ArgumentName,
displayName: string(dynakube.DynatraceApiCapability.DisplayName),
}

return &c
}

func GenerateActiveGateCapabilities(dk *dynatracev1beta2.DynaKube) []Capability {
func GenerateActiveGateCapabilities(dk *dynakube.DynaKube) []Capability {
return []Capability{
NewMultiCapability(dk),
}
Expand All @@ -150,7 +174,7 @@ func BuildDNSEntryPointWithoutEnvVars(dynakubeName, dynakubeNamespace string, ca
return fmt.Sprintf("%s.%s", BuildServiceName(dynakubeName, capability.ShortName()), dynakubeNamespace)
}

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

for _, ip := range dk.Status.ActiveGate.ServiceIPs {
Expand Down
Loading

0 comments on commit 74de5f2

Please sign in to comment.