Skip to content

Commit

Permalink
chore(e2e): builder resources test
Browse files Browse the repository at this point in the history
  • Loading branch information
squakez committed May 10, 2023
1 parent ea2d927 commit 1a5efc6
Show file tree
Hide file tree
Showing 6 changed files with 85 additions and 17 deletions.
43 changes: 43 additions & 0 deletions e2e/common/traits/builder_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,18 +38,61 @@ func TestBuilderTrait(t *testing.T) {
RegisterTestingT(t)

name := "java"

t.Run("Run build strategy routine", func(t *testing.T) {
Expect(KamelRunWithID(operatorID, ns, "files/Java.java",
"--name", name,
"-t", "builder.strategy=routine").Execute()).To(Succeed())

Eventually(IntegrationPodPhase(ns, name), TestTimeoutLong).Should(Equal(corev1.PodRunning))
Eventually(IntegrationConditionStatus(ns, name, v1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue))
Eventually(IntegrationLogs(ns, name), TestTimeoutShort).Should(ContainSubstring("Magicstring!"))

integrationKitName := IntegrationKit(ns, name)()
builderKitName := fmt.Sprintf("camel-k-%s-builder", integrationKitName)
Eventually(BuildConfig(ns, integrationKitName)().Strategy, TestTimeoutShort).Should(Equal(v1.BuildStrategyRoutine))
// Default resource CPU Check
Eventually(BuildConfig(ns, integrationKitName)().RequestCPU, TestTimeoutShort).Should(Equal(""))
Eventually(BuildConfig(ns, integrationKitName)().LimitCPU, TestTimeoutShort).Should(Equal(""))
Eventually(BuildConfig(ns, integrationKitName)().RequestMemory, TestTimeoutShort).Should(Equal(""))
Eventually(BuildConfig(ns, integrationKitName)().LimitMemory, TestTimeoutShort).Should(Equal(""))

Eventually(BuilderPod(ns, builderKitName), TestTimeoutShort).Should(BeNil())

// We need to remove the kit as well
Expect(Kamel("reset", "-n", ns).Execute()).To(Succeed())
})

t.Run("Run build resources configuration", func(t *testing.T) {
Expect(KamelRunWithID(operatorID, ns, "files/Java.java",
"--name", name,
"-t", "builder.request-cpu=500m",
"-t", "builder.limit-cpu=1000m",
"-t", "builder.request-memory=2Gi",
"-t", "builder.limit-memory=3Gi",
).Execute()).To(Succeed())

Eventually(IntegrationPodPhase(ns, name), TestTimeoutLong).Should(Equal(corev1.PodRunning))
Eventually(IntegrationConditionStatus(ns, name, v1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue))
Eventually(IntegrationLogs(ns, name), TestTimeoutShort).Should(ContainSubstring("Magicstring!"))

integrationKitName := IntegrationKit(ns, name)()
builderKitName := fmt.Sprintf("camel-k-%s-builder", integrationKitName)

Eventually(BuildConfig(ns, integrationKitName)().Strategy, TestTimeoutShort).Should(Equal(v1.BuildStrategyPod))
Eventually(BuildConfig(ns, integrationKitName)().RequestCPU, TestTimeoutShort).Should(Equal("500m"))
Eventually(BuildConfig(ns, integrationKitName)().LimitCPU, TestTimeoutShort).Should(Equal("1000m"))
Eventually(BuildConfig(ns, integrationKitName)().RequestMemory, TestTimeoutShort).Should(Equal("2Gi"))
Eventually(BuildConfig(ns, integrationKitName)().LimitMemory, TestTimeoutShort).Should(Equal("3Gi"))

Eventually(BuilderPod(ns, builderKitName), TestTimeoutShort).ShouldNot(BeNil())
// Let's assert we set the resources on the builder container
Eventually(BuilderPod(ns, builderKitName)().Spec.InitContainers[0].Name, TestTimeoutShort).Should(Equal("builder"))
Eventually(BuilderPod(ns, builderKitName)().Spec.InitContainers[0].Resources.Requests.Cpu().String(), TestTimeoutShort).Should(Equal("500m"))
Eventually(BuilderPod(ns, builderKitName)().Spec.InitContainers[0].Resources.Limits.Cpu().String(), TestTimeoutShort).Should(Equal("1"))
Eventually(BuilderPod(ns, builderKitName)().Spec.InitContainers[0].Resources.Requests.Memory().String(), TestTimeoutShort).Should(Equal("2Gi"))
Eventually(BuilderPod(ns, builderKitName)().Spec.InitContainers[0].Resources.Limits.Memory().String(), TestTimeoutShort).Should(Equal("3Gi"))

Expect(Kamel("delete", "--all", "-n", ns).Execute()).To(Succeed())
})
}
10 changes: 10 additions & 0 deletions e2e/support/test_support.go
Original file line number Diff line number Diff line change
Expand Up @@ -1602,6 +1602,16 @@ func Build(ns, name string) func() *v1.Build {
}
}

func BuildConfig(ns, name string) func() v1.BuildConfiguration {
return func() v1.BuildConfiguration {
build := Build(ns, name)()
if build != nil {
return build.Spec.Configuration
}
return v1.BuildConfiguration{}
}
}

func BuildPhase(ns, name string) func() v1.BuildPhase {
return func() v1.BuildPhase {
build := Build(ns, name)()
Expand Down
9 changes: 9 additions & 0 deletions pkg/apis/camel/v1/common_types_support.go
Original file line number Diff line number Diff line change
Expand Up @@ -155,3 +155,12 @@ func SetAnnotation(obj *metav1.ObjectMeta, name string, value string) {

var _ json.Marshaler = (*RawMessage)(nil)
var _ json.Unmarshaler = (*RawMessage)(nil)

// IsEmpty -- .
func (bc *BuildConfiguration) IsEmpty() bool {
return bc.Strategy == "" &&
bc.RequestCPU == "" &&
bc.RequestMemory == "" &&
bc.LimitCPU == "" &&
bc.LimitMemory == ""
}
22 changes: 11 additions & 11 deletions pkg/controller/build/build_pod.go
Original file line number Diff line number Diff line change
Expand Up @@ -165,14 +165,11 @@ func newBuildPod(ctx context.Context, c ctrl.Reader, build *v1.Build) (*corev1.P
pod.Spec.Containers = pod.Spec.InitContainers[len(pod.Spec.InitContainers)-1 : len(pod.Spec.InitContainers)]
pod.Spec.InitContainers = pod.Spec.InitContainers[:len(pod.Spec.InitContainers)-1]

if err := configureResources(build.Spec.Configuration, &pod.Spec.Containers[0]); err != nil {
return pod, err
}

return pod, nil
}

func configureResources(conf v1.BuildConfiguration, container *corev1.Container) error {
func configureResources(build *v1.Build, container *corev1.Container) {
conf := build.Spec.Configuration
requestsList := container.Resources.Requests
limitsList := container.Resources.Limits
var err error
Expand All @@ -185,25 +182,27 @@ func configureResources(conf v1.BuildConfiguration, container *corev1.Container)

requestsList, err = kubernetes.ConfigureResource(conf.RequestCPU, requestsList, corev1.ResourceCPU)
if err != nil {
return err
Log.WithValues("request-namespace", build.Namespace, "request-name", build.Name).
Errorf(err, "Could not configure builder resource cpu, leaving default value")
}
requestsList, err = kubernetes.ConfigureResource(conf.RequestMemory, requestsList, corev1.ResourceMemory)
if err != nil {
return err
Log.WithValues("request-namespace", build.Namespace, "request-name", build.Name).
Errorf(err, "Could not configure builder resource memory, leaving default value")
}
limitsList, err = kubernetes.ConfigureResource(conf.LimitCPU, limitsList, corev1.ResourceCPU)
if err != nil {
return err
Log.WithValues("request-namespace", build.Namespace, "request-name", build.Name).
Errorf(err, "Could not configure builder limit cpu, leaving default value")
}
limitsList, err = kubernetes.ConfigureResource(conf.LimitMemory, limitsList, corev1.ResourceMemory)
if err != nil {
return err
Log.WithValues("request-namespace", build.Namespace, "request-name", build.Name).
Errorf(err, "Could not configure builder limit memory, leaving default value")
}

container.Resources.Requests = requestsList
container.Resources.Limits = limitsList

return nil
}

func deleteBuilderPod(ctx context.Context, c ctrl.Writer, build *v1.Build) error {
Expand Down Expand Up @@ -287,6 +286,7 @@ func addBuildTaskToPod(build *v1.Build, taskName string, pod *corev1.Pod) {
Env: proxyFromEnvironment(),
}

configureResources(build, &container)
addContainerToPod(build, container, pod)
}

Expand Down
9 changes: 8 additions & 1 deletion pkg/controller/integrationkit/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,14 @@ func (action *buildAction) handleBuildSubmitted(ctx context.Context, kit *v1.Int

// It has to be the same namespace as the operator as they must share a PVC
builderPodNamespace := platform.GetOperatorNamespace()
buildConfig := env.Platform.Status.Build.BuildConfiguration
buildConfig := env.BuildConfiguration
if buildConfig.IsEmpty() {
// default to IntegrationPlatform configuration
buildConfig = env.Platform.Status.Build.BuildConfiguration
} else if buildConfig.Strategy == "" {
// we always need to define a strategy, so we default to platform if none
buildConfig.Strategy = env.Platform.Status.Build.BuildConfiguration.Strategy
}

// nolint: contextcheck
if buildConfig.Strategy == v1.BuildStrategyPod {
Expand Down
9 changes: 4 additions & 5 deletions pkg/util/kubernetes/factory_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ import (
"testing"

"github.com/stretchr/testify/assert"
corev1 "k8s.io/api/core/v1"
v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource"
)
Expand Down Expand Up @@ -173,14 +172,14 @@ func TestMissingResourceRequirements(t *testing.T) {
}

func TestConfigureResources(t *testing.T) {
requestsList := make(corev1.ResourceList)
requestsList, err := ConfigureResource("500m", requestsList, corev1.ResourceCPU)
requestsList := make(v1.ResourceList)
requestsList, err := ConfigureResource("500m", requestsList, v1.ResourceCPU)
assert.Nil(t, err)
assert.Equal(t, "500m", requestsList.Cpu().String())
requestsList, err = ConfigureResource("5Gi", requestsList, corev1.ResourceMemory)
requestsList, err = ConfigureResource("5Gi", requestsList, v1.ResourceMemory)
assert.Nil(t, err)
assert.Equal(t, "5Gi", requestsList.Memory().String())
requestsList, err = ConfigureResource("5ss", requestsList, corev1.ResourceCPU)
requestsList, err = ConfigureResource("5ss", requestsList, v1.ResourceCPU)
assert.NotNil(t, err)
// Assert previous values haven't changed
assert.Equal(t, "500m", requestsList.Cpu().String())
Expand Down

0 comments on commit 1a5efc6

Please sign in to comment.