Skip to content

Commit

Permalink
fix: add default dashboard port specification in container for emqx-e…
Browse files Browse the repository at this point in the history
…xporter (emqx#815)
  • Loading branch information
logo306142054 authored Jun 25, 2023
1 parent a98e50d commit 9837d84
Show file tree
Hide file tree
Showing 8 changed files with 349 additions and 120 deletions.
18 changes: 18 additions & 0 deletions apis/apps/v1beta4/emqxbroker_webhook.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ func (r *EmqxBroker) Default() {
defaultEmqxACL(r)
defaultEmqxConfig(r)
defaultServiceTemplate(r)
defaultContainerPort(r)
defaultPersistent(r)
defaultSecurityContext(r)
}
Expand Down Expand Up @@ -197,6 +198,23 @@ func defaultServiceTemplate(r Emqx) {
r.GetSpec().SetServiceTemplate(s)
}

func defaultContainerPort(r Emqx) {
temp := r.GetSpec().GetTemplate()
container := &temp.Spec.EmqxContainer
container.Ports = MergeContainerPorts(
container.Ports,
[]corev1.ContainerPort{
{
Name: "dashboard-http",
Protocol: corev1.ProtocolTCP,
ContainerPort: 18083,
},
},
)

r.GetSpec().SetTemplate(temp)
}

func defaultPersistent(r Emqx) {
p := r.GetSpec().GetPersistent()
if p == nil {
Expand Down
132 changes: 85 additions & 47 deletions apis/apps/v1beta4/emqxbroker_webhook_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,44 @@ func TestBrokerDefault(t *testing.T) {
SupplementalGroups: []int64{1000},
}, *instance.Spec.Template.Spec.PodSecurityContext)
})

t.Run("default container port", func(t *testing.T) {
assert.GreaterOrEqual(t, len(instance.Spec.Template.Spec.EmqxContainer.Ports), 1)
defaultPort := instance.Spec.Template.Spec.EmqxContainer.Ports[0]
assert.Equal(t, defaultPort.Name, "dashboard-http")
assert.Equal(t, defaultPort.Protocol, corev1.ProtocolTCP)
assert.Equal(t, defaultPort.ContainerPort, int32(18083))
})

t.Run("merge container port by same port", func(t *testing.T) {
instance.Spec.Template.Spec.EmqxContainer.Ports = []corev1.ContainerPort{
{
Name: "user-defined-dashboard-http",
ContainerPort: 18083,
},
}
instance.Default()

assert.GreaterOrEqual(t, len(instance.Spec.Template.Spec.EmqxContainer.Ports), 1)
defaultPort := instance.Spec.Template.Spec.EmqxContainer.Ports[0]
assert.Equal(t, defaultPort.Name, "user-defined-dashboard-http")
assert.Equal(t, defaultPort.ContainerPort, int32(18083))
})

t.Run("merge container port by same name", func(t *testing.T) {
instance.Spec.Template.Spec.EmqxContainer.Ports = []corev1.ContainerPort{
{
Name: "dashboard-http",
ContainerPort: 18084,
},
}
instance.Default()

assert.GreaterOrEqual(t, len(instance.Spec.Template.Spec.EmqxContainer.Ports), 1)
defaultPort := instance.Spec.Template.Spec.EmqxContainer.Ports[0]
assert.Equal(t, defaultPort.Name, "dashboard-http")
assert.Equal(t, defaultPort.ContainerPort, int32(18084))
})
}

func TestBrokerValidateCreate(t *testing.T) {
Expand Down Expand Up @@ -250,49 +288,49 @@ func TestBrokerValidateUpdate(t *testing.T) {

t.Run("valid image version", func(t *testing.T) {
old := broker.DeepCopy()
new := broker.DeepCopy()

new.Spec.Template.Spec.EmqxContainer.Image.Version = "4.4.14"
assert.NoError(t, new.ValidateUpdate(old))
new.Spec.Template.Spec.EmqxContainer.Image.Version = "4.4.14"
assert.NoError(t, new.ValidateUpdate(old))
new.Spec.Template.Spec.EmqxContainer.Image.Version = "4.5.0"
assert.NoError(t, new.ValidateUpdate(old))
new.Spec.Template.Spec.EmqxContainer.Image.Version = "4.10"
assert.NoError(t, new.ValidateUpdate(old))
new.Spec.Template.Spec.EmqxContainer.Image.Version = "4.123456789"
assert.NoError(t, new.ValidateUpdate(old))

new.Spec.Template.Spec.EmqxContainer.Image.Version = "latest"
assert.ErrorContains(t, new.ValidateUpdate(old), "image version can not be latest")
new.Spec.Template.Spec.EmqxContainer.Image.Version = ""
assert.ErrorContains(t, new.ValidateUpdate(old), "invalid image version")
new.Spec.Template.Spec.EmqxContainer.Image.Version = "fake"
assert.ErrorContains(t, new.ValidateUpdate(old), "invalid image version")
new.Spec.Template.Spec.EmqxContainer.Image.Version = "4.4.13"
assert.ErrorContains(t, new.ValidateUpdate(old), "please upgrade to 4.4.14 or later")
new.Spec.Template.Spec.EmqxContainer.Image.Version = "4.4"
assert.ErrorContains(t, new.ValidateUpdate(old), "please upgrade to 4.4.14 or later")
new.Spec.Template.Spec.EmqxContainer.Image.Version = "4.3"
assert.ErrorContains(t, new.ValidateUpdate(old), "please upgrade to 4.4.14 or later")
new.Spec.Template.Spec.EmqxContainer.Image.Version = "4"
assert.ErrorContains(t, new.ValidateUpdate(old), "please upgrade to 4.4.14 or later")
new.Spec.Template.Spec.EmqxContainer.Image.Version = "5.0.0"
assert.ErrorContains(t, new.ValidateUpdate(old), "please downgrade to 5.0.0 earlier")
newIns := broker.DeepCopy()

newIns.Spec.Template.Spec.EmqxContainer.Image.Version = "4.4.14"
assert.NoError(t, newIns.ValidateUpdate(old))
newIns.Spec.Template.Spec.EmqxContainer.Image.Version = "4.4.14"
assert.NoError(t, newIns.ValidateUpdate(old))
newIns.Spec.Template.Spec.EmqxContainer.Image.Version = "4.5.0"
assert.NoError(t, newIns.ValidateUpdate(old))
newIns.Spec.Template.Spec.EmqxContainer.Image.Version = "4.10"
assert.NoError(t, newIns.ValidateUpdate(old))
newIns.Spec.Template.Spec.EmqxContainer.Image.Version = "4.123456789"
assert.NoError(t, newIns.ValidateUpdate(old))

newIns.Spec.Template.Spec.EmqxContainer.Image.Version = "latest"
assert.ErrorContains(t, newIns.ValidateUpdate(old), "image version can not be latest")
newIns.Spec.Template.Spec.EmqxContainer.Image.Version = ""
assert.ErrorContains(t, newIns.ValidateUpdate(old), "invalid image version")
newIns.Spec.Template.Spec.EmqxContainer.Image.Version = "fake"
assert.ErrorContains(t, newIns.ValidateUpdate(old), "invalid image version")
newIns.Spec.Template.Spec.EmqxContainer.Image.Version = "4.4.13"
assert.ErrorContains(t, newIns.ValidateUpdate(old), "please upgrade to 4.4.14 or later")
newIns.Spec.Template.Spec.EmqxContainer.Image.Version = "4.4"
assert.ErrorContains(t, newIns.ValidateUpdate(old), "please upgrade to 4.4.14 or later")
newIns.Spec.Template.Spec.EmqxContainer.Image.Version = "4.3"
assert.ErrorContains(t, newIns.ValidateUpdate(old), "please upgrade to 4.4.14 or later")
newIns.Spec.Template.Spec.EmqxContainer.Image.Version = "4"
assert.ErrorContains(t, newIns.ValidateUpdate(old), "please upgrade to 4.4.14 or later")
newIns.Spec.Template.Spec.EmqxContainer.Image.Version = "5.0.0"
assert.ErrorContains(t, newIns.ValidateUpdate(old), "please downgrade to 5.0.0 earlier")
})

t.Run("valid volume template can not update", func(t *testing.T) {
old := broker.DeepCopy()
new := broker.DeepCopy()
newIns := broker.DeepCopy()

assert.Nil(t, new.ValidateUpdate(old))
assert.Nil(t, newIns.ValidateUpdate(old))

old.Spec.Persistent = &corev1.PersistentVolumeClaimTemplate{
Spec: corev1.PersistentVolumeClaimSpec{
StorageClassName: pointer.String("fake"),
},
}
assert.Error(t, new.ValidateUpdate(old))
assert.Error(t, newIns.ValidateUpdate(old))
})

t.Run("should return error if bootstrap APIKeys is changed", func(t *testing.T) {
Expand All @@ -306,25 +344,25 @@ func TestBrokerValidateUpdate(t *testing.T) {

t.Run("valid emqxConfig can not update", func(t *testing.T) {
old := broker.DeepCopy()
new := broker.DeepCopy()
newIns := broker.DeepCopy()

assert.Nil(t, new.ValidateUpdate(old))
assert.Nil(t, newIns.ValidateUpdate(old))

new.Spec.Template.Spec.EmqxContainer.EmqxConfig["name"] = "emqx-test"
assert.Error(t, new.ValidateUpdate(old))
newIns.Spec.Template.Spec.EmqxContainer.EmqxConfig["name"] = "emqx-test"
assert.Error(t, newIns.ValidateUpdate(old))

new.Spec.Template.Spec.EmqxContainer.EmqxConfig["name"] = "emqx"
new.Spec.Template.Spec.EmqxContainer.EmqxConfig["cluster.dns.app"] = "emqx-test"
assert.Error(t, new.ValidateUpdate(old))
newIns.Spec.Template.Spec.EmqxContainer.EmqxConfig["name"] = "emqx"
newIns.Spec.Template.Spec.EmqxContainer.EmqxConfig["cluster.dns.app"] = "emqx-test"
assert.Error(t, newIns.ValidateUpdate(old))

new.Spec.Template.Spec.EmqxContainer.EmqxConfig["name"] = "emqx"
new.Spec.Template.Spec.EmqxContainer.EmqxConfig["cluster.dns.app"] = "emqx"
new.Spec.Template.Spec.EmqxContainer.EmqxConfig["listener.tcp.internal"] = "0.0.0.0:1884"
assert.Nil(t, new.ValidateUpdate(old))
newIns.Spec.Template.Spec.EmqxContainer.EmqxConfig["name"] = "emqx"
newIns.Spec.Template.Spec.EmqxContainer.EmqxConfig["cluster.dns.app"] = "emqx"
newIns.Spec.Template.Spec.EmqxContainer.EmqxConfig["listener.tcp.internal"] = "0.0.0.0:1884"
assert.Nil(t, newIns.ValidateUpdate(old))

delete(new.Spec.Template.Spec.EmqxContainer.EmqxConfig, "name")
delete(new.Spec.Template.Spec.EmqxContainer.EmqxConfig, "cluster.dns.app")
new.Spec.Template.Spec.EmqxContainer.EmqxConfig["listener.tcp.internal"] = "0.0.0.0:1885"
assert.Nil(t, new.ValidateUpdate(old))
delete(newIns.Spec.Template.Spec.EmqxContainer.EmqxConfig, "name")
delete(newIns.Spec.Template.Spec.EmqxContainer.EmqxConfig, "cluster.dns.app")
newIns.Spec.Template.Spec.EmqxContainer.EmqxConfig["listener.tcp.internal"] = "0.0.0.0:1885"
assert.Nil(t, newIns.ValidateUpdate(old))
})
}
1 change: 1 addition & 0 deletions apis/apps/v1beta4/emqxenterprise_webhook.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ func (r *EmqxEnterprise) Default() {
defaultEmqxACL(r)
defaultEmqxConfig(r)
defaultServiceTemplate(r)
defaultContainerPort(r)
defaultPersistent(r)
defaultSecurityContext(r)
}
Expand Down
134 changes: 86 additions & 48 deletions apis/apps/v1beta4/emqxenterprise_webhook_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,44 @@ func TestEnterpriseDefault(t *testing.T) {
},
}, instance.Spec.Persistent.ObjectMeta)
})

t.Run("default container port", func(t *testing.T) {
assert.GreaterOrEqual(t, len(instance.Spec.Template.Spec.EmqxContainer.Ports), 1)
defaultPort := instance.Spec.Template.Spec.EmqxContainer.Ports[0]
assert.Equal(t, defaultPort.Name, "dashboard-http")
assert.Equal(t, defaultPort.Protocol, corev1.ProtocolTCP)
assert.Equal(t, defaultPort.ContainerPort, int32(18083))
})

t.Run("merge container port by same port", func(t *testing.T) {
instance.Spec.Template.Spec.EmqxContainer.Ports = []corev1.ContainerPort{
{
Name: "user-defined-dashboard-http",
ContainerPort: 18083,
},
}
instance.Default()

assert.GreaterOrEqual(t, len(instance.Spec.Template.Spec.EmqxContainer.Ports), 1)
defaultPort := instance.Spec.Template.Spec.EmqxContainer.Ports[0]
assert.Equal(t, defaultPort.Name, "user-defined-dashboard-http")
assert.Equal(t, defaultPort.ContainerPort, int32(18083))
})

t.Run("merge container port by same name", func(t *testing.T) {
instance.Spec.Template.Spec.EmqxContainer.Ports = []corev1.ContainerPort{
{
Name: "dashboard-http",
ContainerPort: 18084,
},
}
instance.Default()

assert.GreaterOrEqual(t, len(instance.Spec.Template.Spec.EmqxContainer.Ports), 1)
defaultPort := instance.Spec.Template.Spec.EmqxContainer.Ports[0]
assert.Equal(t, defaultPort.Name, "dashboard-http")
assert.Equal(t, defaultPort.ContainerPort, int32(18084))
})
}

func TestEnterpriseValidateCreate(t *testing.T) {
Expand Down Expand Up @@ -253,50 +291,50 @@ func TestEnterpriseValidateUpdate(t *testing.T) {

t.Run("valid image version", func(t *testing.T) {
old := enterprise.DeepCopy()
new := enterprise.DeepCopy()
new.Spec.EmqxBlueGreenUpdate = nil

new.Spec.Template.Spec.EmqxContainer.Image.Version = "4.4.14"
assert.NoError(t, new.ValidateUpdate(old))
new.Spec.Template.Spec.EmqxContainer.Image.Version = "4.4.14"
assert.NoError(t, new.ValidateUpdate(old))
new.Spec.Template.Spec.EmqxContainer.Image.Version = "4.5.0"
assert.NoError(t, new.ValidateUpdate(old))
new.Spec.Template.Spec.EmqxContainer.Image.Version = "4.10"
assert.NoError(t, new.ValidateUpdate(old))
new.Spec.Template.Spec.EmqxContainer.Image.Version = "4.123456789"
assert.NoError(t, new.ValidateUpdate(old))

new.Spec.Template.Spec.EmqxContainer.Image.Version = "latest"
assert.ErrorContains(t, new.ValidateUpdate(old), "image version can not be latest")
new.Spec.Template.Spec.EmqxContainer.Image.Version = ""
assert.ErrorContains(t, new.ValidateUpdate(old), "invalid image version")
new.Spec.Template.Spec.EmqxContainer.Image.Version = "fake"
assert.ErrorContains(t, new.ValidateUpdate(old), "invalid image version")
new.Spec.Template.Spec.EmqxContainer.Image.Version = "4.4.13"
assert.ErrorContains(t, new.ValidateUpdate(old), "please upgrade to 4.4.14 or later")
new.Spec.Template.Spec.EmqxContainer.Image.Version = "4.4"
assert.ErrorContains(t, new.ValidateUpdate(old), "please upgrade to 4.4.14 or later")
new.Spec.Template.Spec.EmqxContainer.Image.Version = "4.3"
assert.ErrorContains(t, new.ValidateUpdate(old), "please upgrade to 4.4.14 or later")
new.Spec.Template.Spec.EmqxContainer.Image.Version = "4"
assert.ErrorContains(t, new.ValidateUpdate(old), "please upgrade to 4.4.14 or later")
new.Spec.Template.Spec.EmqxContainer.Image.Version = "5.0.0"
assert.ErrorContains(t, new.ValidateUpdate(old), "please downgrade to 5.0.0 earlier")
newIns := enterprise.DeepCopy()
newIns.Spec.EmqxBlueGreenUpdate = nil

newIns.Spec.Template.Spec.EmqxContainer.Image.Version = "4.4.14"
assert.NoError(t, newIns.ValidateUpdate(old))
newIns.Spec.Template.Spec.EmqxContainer.Image.Version = "4.4.14"
assert.NoError(t, newIns.ValidateUpdate(old))
newIns.Spec.Template.Spec.EmqxContainer.Image.Version = "4.5.0"
assert.NoError(t, newIns.ValidateUpdate(old))
newIns.Spec.Template.Spec.EmqxContainer.Image.Version = "4.10"
assert.NoError(t, newIns.ValidateUpdate(old))
newIns.Spec.Template.Spec.EmqxContainer.Image.Version = "4.123456789"
assert.NoError(t, newIns.ValidateUpdate(old))

newIns.Spec.Template.Spec.EmqxContainer.Image.Version = "latest"
assert.ErrorContains(t, newIns.ValidateUpdate(old), "image version can not be latest")
newIns.Spec.Template.Spec.EmqxContainer.Image.Version = ""
assert.ErrorContains(t, newIns.ValidateUpdate(old), "invalid image version")
newIns.Spec.Template.Spec.EmqxContainer.Image.Version = "fake"
assert.ErrorContains(t, newIns.ValidateUpdate(old), "invalid image version")
newIns.Spec.Template.Spec.EmqxContainer.Image.Version = "4.4.13"
assert.ErrorContains(t, newIns.ValidateUpdate(old), "please upgrade to 4.4.14 or later")
newIns.Spec.Template.Spec.EmqxContainer.Image.Version = "4.4"
assert.ErrorContains(t, newIns.ValidateUpdate(old), "please upgrade to 4.4.14 or later")
newIns.Spec.Template.Spec.EmqxContainer.Image.Version = "4.3"
assert.ErrorContains(t, newIns.ValidateUpdate(old), "please upgrade to 4.4.14 or later")
newIns.Spec.Template.Spec.EmqxContainer.Image.Version = "4"
assert.ErrorContains(t, newIns.ValidateUpdate(old), "please upgrade to 4.4.14 or later")
newIns.Spec.Template.Spec.EmqxContainer.Image.Version = "5.0.0"
assert.ErrorContains(t, newIns.ValidateUpdate(old), "please downgrade to 5.0.0 earlier")
})

t.Run("valid volume template can not update", func(t *testing.T) {
old := enterprise.DeepCopy()
new := enterprise.DeepCopy()
newIns := enterprise.DeepCopy()

assert.Nil(t, new.ValidateUpdate(old))
assert.Nil(t, newIns.ValidateUpdate(old))

old.Spec.Persistent = &corev1.PersistentVolumeClaimTemplate{
Spec: corev1.PersistentVolumeClaimSpec{
StorageClassName: pointer.String("fake"),
},
}
assert.Error(t, new.ValidateUpdate(old))
assert.Error(t, newIns.ValidateUpdate(old))
})

t.Run("should return error if bootstrap APIKeys is changed", func(t *testing.T) {
Expand All @@ -310,25 +348,25 @@ func TestEnterpriseValidateUpdate(t *testing.T) {

t.Run("valid emqxConfig can not update", func(t *testing.T) {
old := enterprise.DeepCopy()
new := enterprise.DeepCopy()
newIns := enterprise.DeepCopy()

assert.Nil(t, new.ValidateUpdate(old))
assert.Nil(t, newIns.ValidateUpdate(old))

new.Spec.Template.Spec.EmqxContainer.EmqxConfig["name"] = "emqx-test"
assert.Error(t, new.ValidateUpdate(old))
newIns.Spec.Template.Spec.EmqxContainer.EmqxConfig["name"] = "emqx-test"
assert.Error(t, newIns.ValidateUpdate(old))

new.Spec.Template.Spec.EmqxContainer.EmqxConfig["name"] = "emqx"
new.Spec.Template.Spec.EmqxContainer.EmqxConfig["cluster.dns.app"] = "emqx-test"
assert.Error(t, new.ValidateUpdate(old))
newIns.Spec.Template.Spec.EmqxContainer.EmqxConfig["name"] = "emqx"
newIns.Spec.Template.Spec.EmqxContainer.EmqxConfig["cluster.dns.app"] = "emqx-test"
assert.Error(t, newIns.ValidateUpdate(old))

new.Spec.Template.Spec.EmqxContainer.EmqxConfig["name"] = "emqx"
new.Spec.Template.Spec.EmqxContainer.EmqxConfig["cluster.dns.app"] = "emqx"
new.Spec.Template.Spec.EmqxContainer.EmqxConfig["listener.tcp.internal"] = "0.0.0.0:1884"
assert.Nil(t, new.ValidateUpdate(old))
newIns.Spec.Template.Spec.EmqxContainer.EmqxConfig["name"] = "emqx"
newIns.Spec.Template.Spec.EmqxContainer.EmqxConfig["cluster.dns.app"] = "emqx"
newIns.Spec.Template.Spec.EmqxContainer.EmqxConfig["listener.tcp.internal"] = "0.0.0.0:1884"
assert.Nil(t, newIns.ValidateUpdate(old))

delete(new.Spec.Template.Spec.EmqxContainer.EmqxConfig, "name")
delete(new.Spec.Template.Spec.EmqxContainer.EmqxConfig, "cluster.dns.app")
new.Spec.Template.Spec.EmqxContainer.EmqxConfig["listener.tcp.internal"] = "0.0.0.0:1885"
assert.Nil(t, new.ValidateUpdate(old))
delete(newIns.Spec.Template.Spec.EmqxContainer.EmqxConfig, "name")
delete(newIns.Spec.Template.Spec.EmqxContainer.EmqxConfig, "cluster.dns.app")
newIns.Spec.Template.Spec.EmqxContainer.EmqxConfig["listener.tcp.internal"] = "0.0.0.0:1885"
assert.Nil(t, newIns.ValidateUpdate(old))
})
}
Loading

0 comments on commit 9837d84

Please sign in to comment.