Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore(jmx): remove configuration for JMX server, service, and auth secret #823

Merged
merged 10 commits into from
May 28, 2024
13 changes: 5 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,14 +31,11 @@ at the URL provided by:
```
kubectl get cryostat -o jsonpath='{$.items[0].status.applicationUrl}'
```
The JMX authentication credentials for Cryostat itself can be obtained with:
```shell
CRYOSTAT_NAME=$(kubectl get cryostat -o jsonpath='{$.items[0].metadata.name}')
# Username
kubectl get secret ${CRYOSTAT_NAME}-jmx-auth -o jsonpath='{$.data.CRYOSTAT_RJMX_USER}' | base64 -d
# Password
kubectl get secret ${CRYOSTAT_NAME}-jmx-auth -o jsonpath='{$.data.CRYOSTAT_RJMX_PASS}' | base64 -d
```

To use Cryostat to monitor or profile Cryostat itself - since it is also an available JVM target -
you may use the Cryostat web UI to define a Custom Target with the connection URL `localhost:0`.
This is a special value which tells Cryostat's JVM that it should connect to itself directly, without
the need to expose a JMX port over the network.

# Building
## Requirements
Expand Down
2 changes: 0 additions & 2 deletions api/v1beta1/cryostat_conversion.go
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,6 @@ func convertServiceOptionsTo(srcOpts *ServiceConfigList) *operatorv1beta2.Servic
if srcOpts.CoreConfig != nil {
dstOpts.CoreConfig = &operatorv1beta2.CoreServiceConfig{
HTTPPort: srcOpts.CoreConfig.HTTPPort,
JMXPort: srcOpts.CoreConfig.JMXPort,
ServiceConfig: convertServiceConfigTo(srcOpts.CoreConfig.ServiceConfig),
}
}
Expand Down Expand Up @@ -382,7 +381,6 @@ func convertServiceOptionsFrom(srcOpts *operatorv1beta2.ServiceConfigList) *Serv
if srcOpts.CoreConfig != nil {
dstOpts.CoreConfig = &CoreServiceConfig{
HTTPPort: srcOpts.CoreConfig.HTTPPort,
JMXPort: srcOpts.CoreConfig.JMXPort,
ServiceConfig: convertServiceConfigFrom(srcOpts.CoreConfig.ServiceConfig),
}
}
Expand Down
2 changes: 2 additions & 0 deletions api/v1beta1/cryostat_conversion_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,8 @@ func tableEntriesTo() []TableEntry {
(*test.TestResources).NewCryostatWithIngress),
Entry("minimal mode", (*test.TestResources).NewCryostatWithMinimalModeV1Beta1,
(*test.TestResources).NewCryostat),
Entry("core JMX port", (*test.TestResources).NewCryostatWithCoreSvcJMXPortV1Beta1,
(*test.TestResources).NewCryostatWithCoreSvc),
)
}

Expand Down
6 changes: 1 addition & 5 deletions api/v1beta2/cryostat_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -292,11 +292,7 @@ type CoreServiceConfig struct {
// HTTP port number for the Cryostat application service.
// Defaults to 8181.
// +optional
HTTPPort *int32 `json:"httpPort,omitempty"`
// Remote JMX port number for the Cryostat application service.
// Defaults to 9091.
// +optional
JMXPort *int32 `json:"jmxPort,omitempty"`
HTTPPort *int32 `json:"httpPort,omitempty"`
ServiceConfig `json:",inline"`
}

Expand Down
5 changes: 0 additions & 5 deletions api/v1beta2/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 0 additions & 5 deletions bundle/manifests/operator.cryostat.io_cryostats.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9385,11 +9385,6 @@ spec:
service. Defaults to 8181.
format: int32
type: integer
jmxPort:
description: Remote JMX port number for the Cryostat application
service. Defaults to 9091.
format: int32
type: integer
labels:
additionalProperties:
type: string
Expand Down
5 changes: 0 additions & 5 deletions config/crd/bases/operator.cryostat.io_cryostats.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9375,11 +9375,6 @@ spec:
service. Defaults to 8181.
format: int32
type: integer
jmxPort:
description: Remote JMX port number for the Cryostat application
service. Defaults to 9091.
format: int32
type: integer
labels:
additionalProperties:
type: string
Expand Down
6 changes: 4 additions & 2 deletions config/samples/sample-app-agent.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,10 @@ spec:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
- name: CRYOSTAT_AGENT_API_WRITES_ENABLED
value: "true"
- name: CRYOSTAT_AGENT_BASEURI
value: https://cryostat-sample.$(NAMESPACE).svc:8181
value: https://cryostat-sample.$(NAMESPACE).svc:4180
- name: POD_IP
valueFrom:
fieldRef:
Expand Down Expand Up @@ -64,7 +66,7 @@ spec:
memory: 96Mi
limits:
cpu: 500m
memory: 128Mi
memory: 192Mi
securityContext:
allowPrivilegeEscalation: false
capabilities:
Expand Down
3 changes: 1 addition & 2 deletions docs/config.md
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ spec:
```

### Service Options
The Cryostat operator creates three services: one for the core Cryostat application, one for Grafana, and one for the cryostat-reports sidecars. These services are created by default as Cluster IP services. The core service exposes two ports: `8181` for HTTP and `9091` for JMX. The Grafana service exposes port `3000` for HTTP traffic. The Reports service exposts port `10000` for HTTP traffic. The service type, port numbers, labels and annotations can all be customized using the `spec.serviceOptions` property.
The Cryostat operator creates two services: one for the core Cryostat application and (optionally) one for the cryostat-reports sidecars. These services are created by default as Cluster IP services. The core service exposes one ports `4180` for HTTP(S). The Reports service exposts port `10000` for HTTP(S) traffic. The service type, port numbers, labels and annotations can all be customized using the `spec.serviceOptions` property.
```yaml
apiVersion: operator.cryostat.io/v1beta1
kind: Cryostat
Expand All @@ -114,7 +114,6 @@ spec:
my-custom-annotation: some-value
serviceType: NodePort
httpPort: 8080
jmxPort: 9095
grafanaConfig:
labels:
my-custom-label: some-value
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1081,15 +1081,6 @@ func NewCoreContainer(cr *model.CryostatInstance, specs *ServiceSpecs, imageTag
},
}
envs = append(envs, connectionCacheEnvs...)
envsFrom := []corev1.EnvFromSource{
{
SecretRef: &corev1.SecretEnvSource{
LocalObjectReference: corev1.LocalObjectReference{
Name: cr.Name + "-jmx-auth",
},
},
},
}

k8sDiscoveryEnabled := true
k8sDiscoveryPortNames := "jfr-jmx"
Expand Down Expand Up @@ -1190,12 +1181,8 @@ func NewCoreContainer(cr *model.CryostatInstance, specs *ServiceSpecs, imageTag
{
ContainerPort: constants.CryostatHTTPContainerPort,
},
{
ContainerPort: constants.CryostatJMXContainerPort,
},
},
Env: envs,
EnvFrom: envsFrom,
Resources: *NewCoreContainerResource(cr),
LivenessProbe: &corev1.Probe{
ProbeHandler: probeHandler,
Expand Down
1 change: 0 additions & 1 deletion internal/controllers/constants/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ import (
const (
AuthProxyHttpContainerPort int32 = 4180
CryostatHTTPContainerPort int32 = 8181
CryostatJMXContainerPort int32 = 9091
GrafanaContainerPort int32 = 3000
DatasourceContainerPort int32 = 8989
ReportsContainerPort int32 = 10000
Expand Down
38 changes: 1 addition & 37 deletions internal/controllers/reconciler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ type cryostatTestInput struct {
func (c *controllerTest) commonBeforeEach() *cryostatTestInput {
t := &cryostatTestInput{
TestReconcilerConfig: test.TestReconcilerConfig{
GeneratedPasswords: []string{"auth_cookie_secret", "connection_key", "encryption_key", "object_storage", "jmx", "keystore"},
GeneratedPasswords: []string{"auth_cookie_secret", "connection_key", "encryption_key", "object_storage", "keystore"},
},
TestResources: &test.TestResources{
Name: "cryostat",
Expand Down Expand Up @@ -147,7 +147,6 @@ func resourceChecks() []resourceCheck {
}, "persistent volume claim"},
{(*cryostatTestInput).expectDatabaseSecret, "database secret"},
{(*cryostatTestInput).expectStorageSecret, "object storage secret"},
{(*cryostatTestInput).expectJMXSecret, "JMX secret"},
{(*cryostatTestInput).expectCoreService, "core service"},
{(*cryostatTestInput).expectMainDeployment, "main deployment"},
{(*cryostatTestInput).expectLockConfigMap, "lock config map"},
Expand Down Expand Up @@ -478,30 +477,6 @@ func (c *controllerTest) commonTests() {
})
})
})
Context("with an existing JMX Secret", func() {
var cr *model.CryostatInstance
var oldSecret *corev1.Secret
BeforeEach(func() {
cr = t.NewCryostat()
oldSecret = t.OtherJMXSecret()
t.objs = append(t.objs, cr.Object, oldSecret)
})
JustBeforeEach(func() {
t.reconcileCryostatFully()
})
It("should update the username but not password", func() {
secret := &corev1.Secret{}
err := t.Client.Get(context.Background(), types.NamespacedName{Name: oldSecret.Name, Namespace: t.Namespace}, secret)
Expect(err).ToNot(HaveOccurred())

Expect(metav1.IsControlledBy(secret, cr.Object)).To(BeTrue())

// Username should be replaced, but not password
expected := t.NewJMXSecret()
Expect(secret.StringData["CRYOSTAT_RJMX_USER"]).To(Equal(expected.StringData["CRYOSTAT_RJMX_USER"]))
Expect(secret.StringData["CRYOSTAT_RJMX_PASS"]).To(Equal(oldSecret.StringData["CRYOSTAT_RJMX_PASS"]))
})
})
Context("with an existing Database Secret", func() {
var cr *model.CryostatInstance
var oldSecret *corev1.Secret
Expand Down Expand Up @@ -2390,17 +2365,6 @@ func (t *cryostatTestInput) expectStorageSecret() {
Expect(secret.StringData).To(Equal(expectedSecret.StringData))
}

func (t *cryostatTestInput) expectJMXSecret() {
secret := &corev1.Secret{}
err := t.Client.Get(context.Background(), types.NamespacedName{Name: t.Name + "-jmx-auth", Namespace: t.Namespace}, secret)
Expect(err).ToNot(HaveOccurred())

// Compare to desired spec
expectedSecret := t.NewJMXSecret()
t.checkMetadata(secret, expectedSecret)
Expect(secret.StringData).To(Equal(expectedSecret.StringData))
}

func (t *cryostatTestInput) expectCoreService() {
t.checkService(t.Name, t.NewCryostatService())
}
Expand Down
37 changes: 1 addition & 36 deletions internal/controllers/secrets.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,7 @@ func (r *Reconciler) reconcileSecrets(ctx context.Context, cr *model.CryostatIns
if err := r.reconcileDatabaseConnectionSecret(ctx, cr); err != nil {
return err
}
if err := r.reconcileStorageSecret(ctx, cr); err != nil {
return err
}
return r.reconcileJMXSecret(ctx, cr)
return r.reconcileStorageSecret(ctx, cr)
}

func (r *Reconciler) reconcileAuthProxyCookieSecret(ctx context.Context, cr *model.CryostatInstance) error {
Expand All @@ -60,38 +57,6 @@ func (r *Reconciler) reconcileAuthProxyCookieSecret(ctx context.Context, cr *mod
})
}

// jmxSecretNameSuffix is the suffix to be appended to the name of a
// Cryostat CR to name its JMX credentials secret
const jmxSecretNameSuffix = "-jmx-auth"

// jmxSecretUserKey indexes the username within the Cryostat JMX auth secret
const jmxSecretUserKey = "CRYOSTAT_RJMX_USER"

// jmxSecretPassKey indexes the password within the Cryostat JMX auth secret
const jmxSecretPassKey = "CRYOSTAT_RJMX_PASS"

func (r *Reconciler) reconcileJMXSecret(ctx context.Context, cr *model.CryostatInstance) error {
secret := &corev1.Secret{
ObjectMeta: metav1.ObjectMeta{
Name: cr.Name + jmxSecretNameSuffix,
Namespace: cr.InstallNamespace,
},
}

return r.createOrUpdateSecret(ctx, secret, cr.Object, func() error {
if secret.StringData == nil {
secret.StringData = map[string]string{}
}
secret.StringData[jmxSecretUserKey] = "cryostat"

// Password is generated, so don't regenerate it when updating
if secret.CreationTimestamp.IsZero() {
secret.StringData[jmxSecretPassKey] = r.GenPasswd(20)
}
return nil
})
}

// databaseSecretNameSuffix is the suffix to be appended to the name of a
// Cryostat CR to name its database secret
const databaseSecretNameSuffix = "-db"
Expand Down
9 changes: 0 additions & 9 deletions internal/controllers/services.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,11 +53,6 @@ func (r *Reconciler) reconcileCoreService(ctx context.Context, cr *model.Cryosta
Port: *config.HTTPPort,
TargetPort: intstr.IntOrString{IntVal: constants.AuthProxyHttpContainerPort},
},
{
Name: "jfr-jmx",
Port: *config.JMXPort,
TargetPort: intstr.IntOrString{IntVal: constants.CryostatJMXContainerPort},
},
}
return nil
})
Expand Down Expand Up @@ -133,10 +128,6 @@ func configureCoreService(cr *model.CryostatInstance) *operatorv1beta2.CoreServi
httpPort := constants.AuthProxyHttpContainerPort
config.HTTPPort = &httpPort
}
if config.JMXPort == nil {
jmxPort := constants.CryostatJMXContainerPort
config.JMXPort = &jmxPort
}

return config
}
Expand Down
9 changes: 7 additions & 2 deletions internal/test/conversion.go
Original file line number Diff line number Diff line change
Expand Up @@ -168,12 +168,10 @@ func (r *TestResources) NewCryostatWithEmptyDirSpecV1Beta1() *operatorv1beta1.Cr
func (r *TestResources) NewCryostatWithCoreSvcV1Beta1() *operatorv1beta1.Cryostat {
svcType := corev1.ServiceTypeNodePort
httpPort := int32(8080)
jmxPort := int32(9095)
cr := r.NewCryostatV1Beta1()
cr.Spec.ServiceOptions = &operatorv1beta1.ServiceConfigList{
CoreConfig: &operatorv1beta1.CoreServiceConfig{
HTTPPort: &httpPort,
JMXPort: &jmxPort,
Comment on lines -171 to -176
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These would be good to keep since this file is designed to be used by the conversion webhook tests. We could add a test that verifies that a v1beta1 Cryostat CR with a custom JMX port successfully becomes a v1beta2 CR without one.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is already a test that exercises that, I think, but currently fails:

Summarizing 1 Failure:
  [FAIL] Cryostat converting from v1beta2 to v1beta1 [It] core service
  /home/work/workspace/cryostat-operator/api/v1beta1/cryostat_conversion_test.go:72

Cryostat converting from v1beta2 to v1beta1 core service
/home/work/workspace/cryostat-operator/api/v1beta1/cryostat_conversion_test.go:116
  [FAILED] in [It] - /home/work/workspace/cryostat-operator/api/v1beta1/cryostat_conversion_test.go:72 @ 05/22/24 11:49:35.675
• [FAILED] [0.000 seconds]
Cryostat converting from v1beta2 to v1beta1 [It] core service
/home/work/workspace/cryostat-operator/api/v1beta1/cryostat_conversion_test.go:116

  [FAILED] Expected
      <*v1beta1.Cryostat | 0xc0004c6000>: {
          TypeMeta: {Kind: "", APIVersion: ""},
          ObjectMeta: {
              Name: "cryostat",
              GenerateName: "",
              Namespace: "test",
              SelfLink: "",
              UID: "",
              ResourceVersion: "",
              Generation: 0,
              CreationTimestamp: {
                  Time: 0001-01-01T00:00:00Z,
              },
              DeletionTimestamp: nil,
              DeletionGracePeriodSeconds: nil,
              Labels: nil,
              Annotations: nil,
              OwnerReferences: nil,
              Finalizers: nil,
              ManagedFields: nil,
          },
          Spec: {
              Minimal: false,
              TrustedCertSecrets: nil,
              EventTemplates: nil,
              EnableCertManager: true,
              StorageOptions: nil,
              ServiceOptions: {
                  CoreConfig: {
                      HTTPPort: 8080,
                      JMXPort: nil,
                      ServiceConfig: {
                          ServiceType: "NodePort",
                          Annotations: {
                              "my/custom": "annotation",
                          },
                          Labels: {
                              "my": "label",
                              "app": "somethingelse",
                          },
                      },
                  },
                  GrafanaConfig: nil,
                  ReportsConfig: nil,
                  StorageConfig: nil,
              },
              NetworkOptions: nil,
              ReportOptions: nil,
              MaxWsConnections: 0,
              JmxCacheOptions: nil,
              Resources: nil,
              AuthProperties: nil,
              SecurityOptions: nil,
              SchedulingOptions: nil,
              TargetDiscoveryOptions: nil,
              JmxCredentialsDatabaseOptions: nil,
              OperandMetadata: nil,
          },
          Status: {Conditions: nil, GrafanaSecret: "", ApplicationURL: ""},
      }
  to equal
      <*v1beta1.Cryostat | 0xc00046de00>: {
          TypeMeta: {Kind: "", APIVersion: ""},
          ObjectMeta: {
              Name: "cryostat",
              GenerateName: "",
              Namespace: "test",
              SelfLink: "",
              UID: "",
              ResourceVersion: "",
              Generation: 0,
              CreationTimestamp: {
                  Time: 0001-01-01T00:00:00Z,
              },
              DeletionTimestamp: nil,
              DeletionGracePeriodSeconds: nil,
              Labels: nil,
              Annotations: nil,
              OwnerReferences: nil,
              Finalizers: nil,
              ManagedFields: nil,
          },
          Spec: {
              Minimal: false,
              TrustedCertSecrets: nil,
              EventTemplates: nil,
              EnableCertManager: true,
              StorageOptions: nil,
              ServiceOptions: {
                  CoreConfig: {
                      HTTPPort: 8080,
                      JMXPort: 9095,
                      ServiceConfig: {
                          ServiceType: "NodePort",
                          Annotations: {
                              "my/custom": "annotation",
                          },
                          Labels: {
                              "my": "label",
                              "app": "somethingelse",
                          },
                      },
                  },
                  GrafanaConfig: nil,
                  ReportsConfig: nil,
                  StorageConfig: nil,
              },
              NetworkOptions: nil,
              ReportOptions: nil,
              MaxWsConnections: 0,
              JmxCacheOptions: nil,
              Resources: nil,
              AuthProperties: nil,
              SecurityOptions: nil,
              SchedulingOptions: nil,
              TargetDiscoveryOptions: nil,
              JmxCredentialsDatabaseOptions: nil,
              OperandMetadata: nil,
          },
          Status: {Conditions: nil, GrafanaSecret: "", ApplicationURL: ""},
      }
  In [It] at: /home/work/workspace/cryostat-operator/api/v1beta1/cryostat_conversion_test.go:72 @ 05/22/24 11:49:35.675

How should I adjust it to pass here? It seems like this test suite expects it to be possible to 1:1 convert beta1 to and from beta2, but that's not true in this case.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we follow this setup for CRD fields that got removed. We would test the path from beta1 with Svc configurations to default beta2.

func tableEntriesTo() []TableEntry {

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, would it make sense to split the test case "core service" to consider cases with and without JMXPort? That way, we can still test other service configurations both way (for JMXPort, only beta1->beta2).

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How about this? I think this does what Thuan suggested. There would be two v1beta1 core service CRs, one with a JMX port and one without. Both should resolve to the same v1beta2 CR. The conversion tests pass for me with this patch.

diff --git a/api/v1beta1/cryostat_conversion_test.go b/api/v1beta1/cryostat_conversion_test.go
index ccc9ad59..a0058def 100644
--- a/api/v1beta1/cryostat_conversion_test.go
+++ b/api/v1beta1/cryostat_conversion_test.go
@@ -84,6 +84,8 @@ func tableEntriesTo() []TableEntry {
                        (*test.TestResources).NewCryostatWithIngress),
                Entry("minimal mode", (*test.TestResources).NewCryostatWithMinimalModeV1Beta1,
                        (*test.TestResources).NewCryostat),
+               Entry("core JMX port", (*test.TestResources).NewCryostatWithCoreSvcJMXPortV1Beta1,
+                       (*test.TestResources).NewCryostatWithCoreSvc),
        )
 }
 
diff --git a/internal/test/conversion.go b/internal/test/conversion.go
index 86f61472..ee42357e 100644
--- a/internal/test/conversion.go
+++ b/internal/test/conversion.go
@@ -168,12 +168,10 @@ func (r *TestResources) NewCryostatWithEmptyDirSpecV1Beta1() *operatorv1beta1.Cr
 func (r *TestResources) NewCryostatWithCoreSvcV1Beta1() *operatorv1beta1.Cryostat {
        svcType := corev1.ServiceTypeNodePort
        httpPort := int32(8080)
-       jmxPort := int32(9095)
        cr := r.NewCryostatV1Beta1()
        cr.Spec.ServiceOptions = &operatorv1beta1.ServiceConfigList{
                CoreConfig: &operatorv1beta1.CoreServiceConfig{
                        HTTPPort: &httpPort,
-                       JMXPort:  &jmxPort,
                        ServiceConfig: operatorv1beta1.ServiceConfig{
                                ServiceType: &svcType,
                                Annotations: map[string]string{
@@ -189,6 +187,13 @@ func (r *TestResources) NewCryostatWithCoreSvcV1Beta1() *operatorv1beta1.Cryosta
        return cr
 }
 
+func (r *TestResources) NewCryostatWithCoreSvcJMXPortV1Beta1() *operatorv1beta1.Cryostat {
+       jmxPort := int32(9095)
+       cr := r.NewCryostatWithCoreSvcV1Beta1()
+       cr.Spec.ServiceOptions.CoreConfig.JMXPort = &jmxPort
+       return cr
+}
+
 func (r *TestResources) NewCryostatWithGrafanaSvcV1Beta1() *operatorv1beta1.Cryostat {
        svcType := corev1.ServiceTypeNodePort
        httpPort := int32(8080)

ServiceConfig: operatorv1beta1.ServiceConfig{
ServiceType: &svcType,
Annotations: map[string]string{
Expand All @@ -189,6 +187,13 @@ func (r *TestResources) NewCryostatWithCoreSvcV1Beta1() *operatorv1beta1.Cryosta
return cr
}

func (r *TestResources) NewCryostatWithCoreSvcJMXPortV1Beta1() *operatorv1beta1.Cryostat {
jmxPort := int32(9095)
cr := r.NewCryostatWithCoreSvcV1Beta1()
cr.Spec.ServiceOptions.CoreConfig.JMXPort = &jmxPort
return cr
}

func (r *TestResources) NewCryostatWithGrafanaSvcV1Beta1() *operatorv1beta1.Cryostat {
svcType := corev1.ServiceTypeNodePort
httpPort := int32(8080)
Expand Down
Loading
Loading