diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml index a08f50cc..55883a62 100644 --- a/.github/workflows/e2e.yaml +++ b/.github/workflows/e2e.yaml @@ -31,7 +31,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: "~1.24.13" + go-version: "~1.26.1" - name: Setup kind env: KIND_VERSION: "0.30.0" diff --git a/.github/workflows/integration_tests.yaml b/.github/workflows/integration_tests.yaml index 1d54c7b9..1046b841 100644 --- a/.github/workflows/integration_tests.yaml +++ b/.github/workflows/integration_tests.yaml @@ -29,7 +29,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: "~1.24.13" + go-version: "~1.26.1" - name: Configure Git run: | git config user.name "$GITHUB_ACTOR" diff --git a/.gitignore b/.gitignore index 52ab46e0..dda9c253 100644 --- a/.gitignore +++ b/.gitignore @@ -43,6 +43,7 @@ docker-secret.yaml tenant_info.json example/repositories/local-tests example/gateway/local-tests +example/state-store/local-tests example/base/resources/configmaps/cassandra .vscode diff --git a/Jenkinsfile b/Jenkinsfile index 6adf33b6..a0f8c45f 100755 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -4,7 +4,7 @@ pipeline { agent { label "default" } environment { ARTIFACTORY_DOCKER_IMS_IMAGE_REG = "ims-base-images-docker-release-local.usw1.packages.broadcom.com" - ARTIFACTORY_DOCKER_IMS_IMAGE = "ims-distro-debian13-static:202510" + ARTIFACTORY_DOCKER_IMS_IMAGE = "ims-distro-debian13-static:202603" ARTIFACTORY_DOCKER_GO_IMAGE_REG = "docker-hub.usw1.packages.broadcom.com" ARTIFACTORY_DOCKER_DEV_LOCAL_REG_HOST = "apim-docker-dev-local.usw1.packages.broadcom.com" ARTIFACT_HOST = "${ARTIFACTORY_DOCKER_DEV_LOCAL_REG_HOST}" @@ -63,7 +63,7 @@ pipeline { docker login ${ARTIFACTORY_DOCKER_IMS_IMAGE_REG} -u ${ARTIFACTORY_DEV_LOCAL_USERNAME} -p ${ARTIFACTORY_DEV_LOCAL_APIKEY} docker login ${ARTIFACTORY_DOCKER_GO_IMAGE_REG} -u ${ARTIFACTORY_DEV_LOCAL_USERNAME} -p ${ARTIFACTORY_DEV_LOCAL_APIKEY} DISTROLESS_IMG=${ARTIFACTORY_DOCKER_IMS_IMAGE_REG}/${ARTIFACTORY_DOCKER_IMS_IMAGE} - GO_BUILD_IMG=${ARTIFACTORY_DOCKER_GO_IMAGE_REG}/golang:1.24 + GO_BUILD_IMG=${ARTIFACTORY_DOCKER_GO_IMAGE_REG}/golang:1.26 cat Dockerfile | sed -e "s~DISTROLESS_IMG~${DISTROLESS_IMG}~g" | sed -e "s~GO_BUILD_IMG~${GO_BUILD_IMG}~g" > operator.Dockerfile docker buildx build -f operator.Dockerfile -t ${ARTIFACTORY_DOCKER_DEV_LOCAL_REG_HOST}/${IMAGE_TAG_BASE}:${RELEASE_VERSION} --builder "${DOCKER_BUILDER_NAME}" --platform="${TARGET_PLATFORMS}" --build-arg TITLE="${IMAGE_NAME}" --build-arg COPYRIGHT="${COPYRIGHT}" --build-arg VERSION="${RELEASE_VERSION}" --build-arg CREATED="${CREATED}" --build-arg GOPROXY="${GOPROXY}" . --push ''' diff --git a/Makefile b/Makefile index 856a813d..dd0246f4 100644 --- a/Makefile +++ b/Makefile @@ -68,8 +68,8 @@ START_KIND_CLUSTER ?= true KUBE_VERSION ?= 1.34 KIND_CONFIG ?= kind-$(KUBE_VERSION).yaml -GATEWAY_IMG ?= docker.io/caapim/gateway:11.1.3 -GO_BUILD_IMG ?= golang:1.24 +GATEWAY_IMG ?= docker.io/caapim/gateway:11.2.1 +GO_BUILD_IMG ?= golang:1.26 DISTROLESS_IMG ?= gcr.io/distroless/static:nonroot GO_PROXY ?= "" diff --git a/README.md b/README.md index 85865af6..29cc74a0 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Layer7 Gateway Operator The Layer7 Gateway Operator, built using the [Operator SDK](https://github.com/operator-framework/operator-sdk) covers all aspects of deploying, maintaining and upgrading API Gateways in Kubernetes. -##### Note: The Operator examples currently use ***Gateway 11.1.3*** as a base. +##### Note: The Operator examples currently use ***Gateway 11.2.1*** as a base. ## [Getting Started](https://github.com/CAAPIM/layer7-operator/wiki/Getting-Started) ## [Additional Documentation](https://github.com/CAAPIM/layer7-operator/wiki) diff --git a/api/v1/gateway_types.go b/api/v1/gateway_types.go index d3434fd6..11a31b7c 100644 --- a/api/v1/gateway_types.go +++ b/api/v1/gateway_types.go @@ -259,6 +259,7 @@ type App struct { ExternalSecrets []ExternalSecret `json:"externalSecrets,omitempty"` ExternalKeys []ExternalKey `json:"externalKeys,omitempty"` ExternalCerts []ExternalCert `json:"externalCerts,omitempty"` + StartupProbe corev1.Probe `json:"startupProbe,omitempty"` LivenessProbe corev1.Probe `json:"livenessProbe,omitempty"` ReadinessProbe corev1.Probe `json:"readinessProbe,omitempty"` CustomConfig CustomConfig `json:"customConfig,omitempty"` @@ -344,9 +345,6 @@ type PortalReference struct { type Otk struct { // Enable or disable the OTK initContainer Enabled bool `json:"enabled,omitempty"` - // ManageCrossNamespace allows a cluster-wide layer7 operator to manage internal/dmz gateways across namespaces - // this is limited to a single kubernetes cluster. - ManageCrossNamespace bool `json:"manageCrossNamespace,omitempty"` // InitContainerImage for the initContainer InitContainerImage string `json:"initContainerImage,omitempty"` // InitContainerImagePullPolicy @@ -392,16 +390,9 @@ type OtkMaintenanceTasks struct { } type GatewayReference struct { - // Name of the gateway - // if managing otk gateways across namespaces this must match the referenced gateway CR - Name string `json:"name,omitempty"` - // Namespace of the referenced gateway if managing gateways cross namespace (optional) - Namespace string `json:"namespace,omitempty"` // Url of the target gateway // used for post-installation gateway policy configuration Url string `json:"url,omitempty"` - // Port of the target gateway - Port int `json:"port,omitempty"` } type OtkOverrides struct { @@ -720,7 +711,7 @@ type Graphman struct { // Service type Service struct { // Enabled or disabled - Enabled bool ` json:"enabled,omitempty"` + Enabled bool `json:"enabled,omitempty"` // Annotations for the service Annotations map[string]string `json:"annotations,omitempty"` // Type ClusterIP, NodePort, LoadBalancer @@ -885,15 +876,17 @@ const ( RevocationCheckPolicyTypeSpecified RevocationCheckPolicyType = "SPECIFIED" ) -// ExternalCert is a reference to an existing TLS or Opaque Secret in Kubernetes -// The Layer7 Operator will attempt to convert this secret to a Graphman bundle that can be applied +// ExternalCert is a reference to an existing TLS or Opaque Secret or ConfigMap in Kubernetes +// The Layer7 Operator will attempt to convert this to a Graphman bundle that can be applied // dynamically keeping any referenced trusted certs up-to-date. -// You can bring in external secrets using tools like cert-manager +// You can bring in external certs using tools like cert-manager type ExternalCert struct { // Enabled or disabled Enabled bool `json:"enabled,omitempty"` - // Name of the Secret which already exists in Kubernetes - Name string `json:"name,omitempty"` + // Name of the Secret or ConfigMap which already exists in Kubernetes + Name string `json:"name,omitempty"` + // Type of the referenced resource: "secret" (default) or "configmap" + Type string `json:"type,omitempty"` VerifyHostname bool `json:"verifyHostname,omitempty"` TrustedFor []TrustedFor `json:"trustedFor,omitempty"` TrustAnchor bool `json:"trustAnchor,omitempty"` diff --git a/api/v1/gateway_webhook.go b/api/v1/gateway_webhook.go index 4d7e27c8..c8b09d18 100644 --- a/api/v1/gateway_webhook.go +++ b/api/v1/gateway_webhook.go @@ -24,7 +24,6 @@ import ( "strings" v1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/intstr" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" @@ -34,8 +33,7 @@ import ( //var gatewaylog = logf.Log.WithName("gateway-resource") func (r *Gateway) SetupWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr). - For(r). + return ctrl.NewWebhookManagedBy(mgr, r). WithDefaulter(r). WithValidator(r). Complete() @@ -43,43 +41,31 @@ func (r *Gateway) SetupWebhookWithManager(mgr ctrl.Manager) error { //+kubebuilder:webhook:path=/mutate-security-brcmlabs-com-v1-gateway,mutating=true,failurePolicy=fail,sideEffects=None,groups=security.brcmlabs.com,resources=gateways,verbs=create;update,versions=v1,name=mgateway.kb.io,admissionReviewVersions=v1 -var _ admission.CustomDefaulter = &Gateway{} +var _ admission.Defaulter[*Gateway] = &Gateway{} -// Default implements webhook.Defaulter so a webhook will be registered for the type -func (r *Gateway) Default(ctx context.Context, obj runtime.Object) error { +// Default implements admission.Defaulter for *Gateway. +func (r *Gateway) Default(ctx context.Context, obj *Gateway) error { return nil } //+kubebuilder:webhook:path=/validate-security-brcmlabs-com-v1-gateway,mutating=false,failurePolicy=fail,sideEffects=None,groups=security.brcmlabs.com,resources=gateways,verbs=create;update,versions=v1,name=vgateway.kb.io,admissionReviewVersions=v1 -var _ admission.CustomValidator = &Gateway{} +var _ admission.Validator[*Gateway] = &Gateway{} -// ValidateCreate implements webhook.Validator so a webhook will be registered for the type -func (r *Gateway) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { - gateway, ok := obj.(*Gateway) - if !ok { - return nil, fmt.Errorf("expected a Gateway, received %T", obj) - } - return validateGateway(gateway) +// ValidateCreate implements admission.Validator for *Gateway. +func (r *Gateway) ValidateCreate(ctx context.Context, obj *Gateway) (admission.Warnings, error) { + return validateGateway(obj) } -// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type -func (r *Gateway) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) { - _, ok := oldObj.(*Gateway) - if !ok { - return nil, fmt.Errorf("expected a Gateway for oldObj, received %T", oldObj) - } - gateway, ok := newObj.(*Gateway) - if !ok { - return nil, fmt.Errorf("expected a Gateway for newObj, received %T", newObj) - } - return validateGateway(gateway) +// ValidateUpdate implements admission.Validator for *Gateway. +func (r *Gateway) ValidateUpdate(ctx context.Context, oldObj, newObj *Gateway) (admission.Warnings, error) { + return validateGateway(newObj) } -// ValidateDelete implements webhook.Validator so a webhook will be registered for the type -func (r *Gateway) ValidateDelete(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { +// ValidateDelete implements admission.Validator for *Gateway. +func (r *Gateway) ValidateDelete(ctx context.Context, obj *Gateway) (admission.Warnings, error) { //gatewaylog.Info("validate delete", "name", r.Name) - return []string{}, nil + return nil, nil } func validateGateway(r *Gateway) (admission.Warnings, error) { diff --git a/api/v1/repository_webhook.go b/api/v1/repository_webhook.go index d0dfef9a..64ee9d20 100644 --- a/api/v1/repository_webhook.go +++ b/api/v1/repository_webhook.go @@ -23,14 +23,12 @@ import ( "fmt" "strings" - "k8s.io/apimachinery/pkg/runtime" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" ) func (r *Repository) SetupWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr). - For(r). + return ctrl.NewWebhookManagedBy(mgr, r). WithDefaulter(r). WithValidator(r). Complete() @@ -38,43 +36,31 @@ func (r *Repository) SetupWebhookWithManager(mgr ctrl.Manager) error { //+kubebuilder:webhook:path=/mutate-security-brcmlabs-com-v1-repository,mutating=true,failurePolicy=fail,sideEffects=None,groups=security.brcmlabs.com,resources=repositories,verbs=create;update,versions=v1,name=mrepository.kb.io,admissionReviewVersions=v1 -var _ admission.CustomDefaulter = &Repository{} +var _ admission.Defaulter[*Repository] = &Repository{} -// Default implements webhook.Defaulter so a webhook will be registered for the type -func (r *Repository) Default(ctx context.Context, obj runtime.Object) error { +// Default implements admission.Defaulter for *Repository. +func (r *Repository) Default(ctx context.Context, obj *Repository) error { return nil } //+kubebuilder:webhook:path=/validate-security-brcmlabs-com-v1-repository,mutating=false,failurePolicy=fail,sideEffects=None,groups=security.brcmlabs.com,resources=repositories,verbs=create;update,versions=v1,name=vrepository.kb.io,admissionReviewVersions=v1 -var _ admission.CustomValidator = &Repository{} +var _ admission.Validator[*Repository] = &Repository{} -// ValidateCreate implements webhook.Validator so a webhook will be registered for the type -func (r *Repository) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { - repository, ok := obj.(*Repository) - if !ok { - return nil, fmt.Errorf("expected a Repository, received %T", obj) - } - return validateRepository(repository) +// ValidateCreate implements admission.Validator for *Repository. +func (r *Repository) ValidateCreate(ctx context.Context, obj *Repository) (admission.Warnings, error) { + return validateRepository(obj) } -// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type -func (r *Repository) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) { - _, ok := oldObj.(*Repository) - if !ok { - return nil, fmt.Errorf("expected a Repository for oldObj, received %T", oldObj) - } - repository, ok := newObj.(*Repository) - if !ok { - return nil, fmt.Errorf("expected a Repository for newObj, received %T", newObj) - } - return validateRepository(repository) +// ValidateUpdate implements admission.Validator for *Repository. +func (r *Repository) ValidateUpdate(ctx context.Context, oldObj, newObj *Repository) (admission.Warnings, error) { + return validateRepository(newObj) } -// ValidateDelete implements webhook.Validator so a webhook will be registered for the type -func (r *Repository) ValidateDelete(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { +// ValidateDelete implements admission.Validator for *Repository. +func (r *Repository) ValidateDelete(ctx context.Context, obj *Repository) (admission.Warnings, error) { // Could extend to checking which gateways reference this before deletion. - return []string{}, nil + return nil, nil } func validateRepository(r *Repository) (admission.Warnings, error) { diff --git a/api/v1/zz_generated.deepcopy.go b/api/v1/zz_generated.deepcopy.go index 372d0911..c079c733 100644 --- a/api/v1/zz_generated.deepcopy.go +++ b/api/v1/zz_generated.deepcopy.go @@ -26,7 +26,7 @@ import ( "k8s.io/api/autoscaling/v2" corev1 "k8s.io/api/core/v1" networkingv1 "k8s.io/api/networking/v1" - "k8s.io/apimachinery/pkg/runtime" + runtime "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/intstr" ) @@ -153,6 +153,7 @@ func (in *App) DeepCopyInto(out *App) { (*in)[i].DeepCopyInto(&(*out)[i]) } } + in.StartupProbe.DeepCopyInto(&out.StartupProbe) in.LivenessProbe.DeepCopyInto(&out.LivenessProbe) in.ReadinessProbe.DeepCopyInto(&out.ReadinessProbe) in.CustomConfig.DeepCopyInto(&out.CustomConfig) diff --git a/bundle/manifests/layer7-operator.clusterserviceversion.yaml b/bundle/manifests/layer7-operator.clusterserviceversion.yaml index ddb9b35f..f8955192 100644 --- a/bundle/manifests/layer7-operator.clusterserviceversion.yaml +++ b/bundle/manifests/layer7-operator.clusterserviceversion.yaml @@ -12,7 +12,7 @@ metadata: }, "spec": { "app": { - "image": "docker.io/caapim/gateway:11.1.3", + "image": "docker.io/caapim/gateway:11.2.1", "management": { "cluster": { "hostname": "gateway.brcmlabs.com", diff --git a/config/crd/bases/security.brcmlabs.com_gateways.yaml b/config/crd/bases/security.brcmlabs.com_gateways.yaml index 10347579..5c85dff8 100644 --- a/config/crd/bases/security.brcmlabs.com_gateways.yaml +++ b/config/crd/bases/security.brcmlabs.com_gateways.yaml @@ -1543,14 +1543,14 @@ spec: externalCerts: items: description: ExternalCert is a reference to an existing TLS - or Opaque Secret in... + or Opaque Secret or... properties: enabled: description: Enabled or disabled type: boolean name: - description: Name of the Secret which already exists in - Kubernetes + description: Name of the Secret or ConfigMap which already + exists in Kubernetes type: string revocationCheckPolicyName: type: string @@ -1562,6 +1562,10 @@ spec: items: type: string type: array + type: + description: 'Type of the referenced resource: "secret" + (default) or "configmap"' + type: string verifyHostname: type: boolean type: object @@ -1934,8 +1938,7 @@ spec: present in a Container. properties: name: - description: Name of the environment variable. Must - be a C_IDENTIFIER. + description: Name of the environment variable. type: string value: description: |- @@ -1980,6 +1983,32 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + description: FileKeyRef selects a key of the env + file. + properties: + key: + description: The key within the env file. + type: string + optional: + default: false + description: Specify whether the file or its + key must be defined. + type: boolean + path: + description: The path within the volume from + which to select the file. + type: string + volumeName: + description: The name of the volume mount + containing the env file. + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: description: 'Selects a resource of the container: only resources limits and requests...' @@ -2638,6 +2667,43 @@ spec: description: RestartPolicy defines the restart behavior of individual containers in a... type: string + restartPolicyRules: + description: |- + Represents a list of rules to be checked to determine if the + container... + items: + description: ContainerRestartRule describes how a container + exit is handled. + properties: + action: + description: |- + Specifies the action taken on a container exit if the requirements + are... + type: string + exitCodes: + description: Represents the exit codes to check on + container exits. + properties: + operator: + description: Represents the relationship between + the container exit code(s) and the... + type: string + values: + description: Specifies the set of values to check + for container exit codes. + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: description: SecurityContext defines the security options the container should be run... @@ -4006,18 +4072,6 @@ spec: dmzGateway: description: DmzOTKGateway reference if type is internal properties: - name: - description: |- - Name of the gateway - if managing otk gateways across namespaces this must... - type: string - namespace: - description: Namespace of the referenced gateway if managing - gateways cross namespace... - type: string - port: - description: Port of the target gateway - type: integer url: description: |- Url of the target gateway @@ -4180,18 +4234,6 @@ spec: internalGateway: description: InternalOTKGateway reference if type is dmz properties: - name: - description: |- - Name of the gateway - if managing otk gateways across namespaces this must... - type: string - namespace: - description: Namespace of the referenced gateway if managing - gateways cross namespace... - type: string - port: - description: Port of the target gateway - type: integer url: description: |- Url of the target gateway @@ -4206,10 +4248,6 @@ spec: description: Enable or disable database maintenance tasks type: boolean type: object - manageCrossNamespace: - description: ManageCrossNamespace allows a cluster-wide layer7 - operator to manage... - type: boolean overrides: description: Overrides default OTK install functionality properties: @@ -5191,8 +5229,7 @@ spec: present in a Container. properties: name: - description: Name of the environment variable. Must - be a C_IDENTIFIER. + description: Name of the environment variable. type: string value: description: |- @@ -5237,6 +5274,32 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + description: FileKeyRef selects a key of the env + file. + properties: + key: + description: The key within the env file. + type: string + optional: + default: false + description: Specify whether the file or its + key must be defined. + type: boolean + path: + description: The path within the volume from + which to select the file. + type: string + volumeName: + description: The name of the volume mount + containing the env file. + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: description: 'Selects a resource of the container: only resources limits and requests...' @@ -5895,6 +5958,43 @@ spec: description: RestartPolicy defines the restart behavior of individual containers in a... type: string + restartPolicyRules: + description: |- + Represents a list of rules to be checked to determine if the + container... + items: + description: ContainerRestartRule describes how a container + exit is handled. + properties: + action: + description: |- + Specifies the action taken on a container exit if the requirements + are... + type: string + exitCodes: + description: Represents the exit codes to check on + container exits. + properties: + operator: + description: Represents the relationship between + the container exit code(s) and the... + type: string + values: + description: Specifies the set of values to check + for container exit codes. + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: description: SecurityContext defines the security options the container should be run... @@ -6249,6 +6349,131 @@ spec: description: SingletonExtraction works with the Gateway in Ephemeral mode. type: boolean + startupProbe: + description: Probe describes a health check to be performed against + a container to... + properties: + exec: + description: Exec specifies a command to execute in the container. + properties: + command: + description: Command is the command line to execute inside + the container, the working... + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + failureThreshold: + description: Minimum consecutive failures for the probe to + be considered failed after... + format: int32 + type: integer + grpc: + description: GRPC specifies a GRPC HealthCheckRequest. + properties: + port: + description: Port number of the gRPC service. Number must + be in the range 1 to 65535. + format: int32 + type: integer + service: + default: "" + description: Service is the name of the service to place + in the gRPC HealthCheckRequest... + type: string + required: + - port + type: object + httpGet: + description: HTTPGet specifies an HTTP GET request to perform. + properties: + host: + description: Host name to connect to, defaults to the + pod IP. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP + allows repeated headers. + items: + description: HTTPHeader describes a custom header to + be used in HTTP probes + properties: + name: + description: The header field name. + type: string + value: + description: The header field value + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + description: Path to access on the HTTP server. + type: string + port: + anyOf: + - type: integer + - type: string + description: Name or number of the port to access on the + container. + x-kubernetes-int-or-string: true + scheme: + description: |- + Scheme to use for connecting to the host. + Defaults to HTTP. + type: string + required: + - port + type: object + initialDelaySeconds: + description: Number of seconds after the container has started + before liveness probes... + format: int32 + type: integer + periodSeconds: + description: |- + How often (in seconds) to perform the probe. + Default to 10 seconds. + format: int32 + type: integer + successThreshold: + description: Minimum consecutive successes for the probe to + be considered successful... + format: int32 + type: integer + tcpSocket: + description: TCPSocket specifies a connection to a TCP port. + properties: + host: + description: 'Optional: Host name to connect to, defaults + to the pod IP.' + type: string + port: + anyOf: + - type: integer + - type: string + description: Number or name of the port to access on the + container. + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + description: Optional duration in seconds the pod needs to + terminate gracefully upon... + format: int64 + type: integer + timeoutSeconds: + description: |- + Number of seconds after which the probe times out. + Defaults to 1 second. + format: int32 + type: integer + type: object system: description: System properties: diff --git a/config/samples/security_v1_gateway.yaml b/config/samples/security_v1_gateway.yaml index f27ee66e..c8fe8208 100644 --- a/config/samples/security_v1_gateway.yaml +++ b/config/samples/security_v1_gateway.yaml @@ -5,7 +5,7 @@ metadata: # spec Gateway Spec spec: # version is the gateway version this operator has been validated against - version: "11.1.3" + version: "11.2.1" # license is reference to a Gateway v11.x license. license.accept must be set to true for the gateway to start. license: accept: false @@ -13,7 +13,7 @@ spec: # app contains gateway application and deployment level specifications app: replicas: 1 - image: docker.io/caapim/gateway:11.1.3 + image: docker.io/caapim/gateway:11.2.1 management: username: admin password: 7layer diff --git a/deploy/bundle.yaml b/deploy/bundle.yaml index 3b94dc9a..0ec4b964 100644 --- a/deploy/bundle.yaml +++ b/deploy/bundle.yaml @@ -1542,14 +1542,14 @@ spec: externalCerts: items: description: ExternalCert is a reference to an existing TLS - or Opaque Secret in... + or Opaque Secret or... properties: enabled: description: Enabled or disabled type: boolean name: - description: Name of the Secret which already exists in - Kubernetes + description: Name of the Secret or ConfigMap which already + exists in Kubernetes type: string revocationCheckPolicyName: type: string @@ -1561,6 +1561,10 @@ spec: items: type: string type: array + type: + description: 'Type of the referenced resource: "secret" + (default) or "configmap"' + type: string verifyHostname: type: boolean type: object @@ -1933,8 +1937,7 @@ spec: present in a Container. properties: name: - description: Name of the environment variable. Must - be a C_IDENTIFIER. + description: Name of the environment variable. type: string value: description: |- @@ -1979,6 +1982,32 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + description: FileKeyRef selects a key of the env + file. + properties: + key: + description: The key within the env file. + type: string + optional: + default: false + description: Specify whether the file or its + key must be defined. + type: boolean + path: + description: The path within the volume from + which to select the file. + type: string + volumeName: + description: The name of the volume mount + containing the env file. + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: description: 'Selects a resource of the container: only resources limits and requests...' @@ -2637,6 +2666,43 @@ spec: description: RestartPolicy defines the restart behavior of individual containers in a... type: string + restartPolicyRules: + description: |- + Represents a list of rules to be checked to determine if the + container... + items: + description: ContainerRestartRule describes how a container + exit is handled. + properties: + action: + description: |- + Specifies the action taken on a container exit if the requirements + are... + type: string + exitCodes: + description: Represents the exit codes to check on + container exits. + properties: + operator: + description: Represents the relationship between + the container exit code(s) and the... + type: string + values: + description: Specifies the set of values to check + for container exit codes. + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: description: SecurityContext defines the security options the container should be run... @@ -4005,18 +4071,6 @@ spec: dmzGateway: description: DmzOTKGateway reference if type is internal properties: - name: - description: |- - Name of the gateway - if managing otk gateways across namespaces this must... - type: string - namespace: - description: Namespace of the referenced gateway if managing - gateways cross namespace... - type: string - port: - description: Port of the target gateway - type: integer url: description: |- Url of the target gateway @@ -4179,18 +4233,6 @@ spec: internalGateway: description: InternalOTKGateway reference if type is dmz properties: - name: - description: |- - Name of the gateway - if managing otk gateways across namespaces this must... - type: string - namespace: - description: Namespace of the referenced gateway if managing - gateways cross namespace... - type: string - port: - description: Port of the target gateway - type: integer url: description: |- Url of the target gateway @@ -4205,10 +4247,6 @@ spec: description: Enable or disable database maintenance tasks type: boolean type: object - manageCrossNamespace: - description: ManageCrossNamespace allows a cluster-wide layer7 - operator to manage... - type: boolean overrides: description: Overrides default OTK install functionality properties: @@ -5190,8 +5228,7 @@ spec: present in a Container. properties: name: - description: Name of the environment variable. Must - be a C_IDENTIFIER. + description: Name of the environment variable. type: string value: description: |- @@ -5236,6 +5273,32 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + description: FileKeyRef selects a key of the env + file. + properties: + key: + description: The key within the env file. + type: string + optional: + default: false + description: Specify whether the file or its + key must be defined. + type: boolean + path: + description: The path within the volume from + which to select the file. + type: string + volumeName: + description: The name of the volume mount + containing the env file. + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: description: 'Selects a resource of the container: only resources limits and requests...' @@ -5894,6 +5957,43 @@ spec: description: RestartPolicy defines the restart behavior of individual containers in a... type: string + restartPolicyRules: + description: |- + Represents a list of rules to be checked to determine if the + container... + items: + description: ContainerRestartRule describes how a container + exit is handled. + properties: + action: + description: |- + Specifies the action taken on a container exit if the requirements + are... + type: string + exitCodes: + description: Represents the exit codes to check on + container exits. + properties: + operator: + description: Represents the relationship between + the container exit code(s) and the... + type: string + values: + description: Specifies the set of values to check + for container exit codes. + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: description: SecurityContext defines the security options the container should be run... @@ -6248,6 +6348,131 @@ spec: description: SingletonExtraction works with the Gateway in Ephemeral mode. type: boolean + startupProbe: + description: Probe describes a health check to be performed against + a container to... + properties: + exec: + description: Exec specifies a command to execute in the container. + properties: + command: + description: Command is the command line to execute inside + the container, the working... + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + failureThreshold: + description: Minimum consecutive failures for the probe to + be considered failed after... + format: int32 + type: integer + grpc: + description: GRPC specifies a GRPC HealthCheckRequest. + properties: + port: + description: Port number of the gRPC service. Number must + be in the range 1 to 65535. + format: int32 + type: integer + service: + default: "" + description: Service is the name of the service to place + in the gRPC HealthCheckRequest... + type: string + required: + - port + type: object + httpGet: + description: HTTPGet specifies an HTTP GET request to perform. + properties: + host: + description: Host name to connect to, defaults to the + pod IP. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP + allows repeated headers. + items: + description: HTTPHeader describes a custom header to + be used in HTTP probes + properties: + name: + description: The header field name. + type: string + value: + description: The header field value + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + description: Path to access on the HTTP server. + type: string + port: + anyOf: + - type: integer + - type: string + description: Name or number of the port to access on the + container. + x-kubernetes-int-or-string: true + scheme: + description: |- + Scheme to use for connecting to the host. + Defaults to HTTP. + type: string + required: + - port + type: object + initialDelaySeconds: + description: Number of seconds after the container has started + before liveness probes... + format: int32 + type: integer + periodSeconds: + description: |- + How often (in seconds) to perform the probe. + Default to 10 seconds. + format: int32 + type: integer + successThreshold: + description: Minimum consecutive successes for the probe to + be considered successful... + format: int32 + type: integer + tcpSocket: + description: TCPSocket specifies a connection to a TCP port. + properties: + host: + description: 'Optional: Host name to connect to, defaults + to the pod IP.' + type: string + port: + anyOf: + - type: integer + - type: string + description: Number or name of the port to access on the + container. + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + description: Optional duration in seconds the pod needs to + terminate gracefully upon... + format: int64 + type: integer + timeoutSeconds: + description: |- + Number of seconds after which the probe times out. + Defaults to 1 second. + format: int32 + type: integer + type: object system: description: System properties: diff --git a/deploy/crd.yaml b/deploy/crd.yaml index 179219a0..0e8c0698 100644 --- a/deploy/crd.yaml +++ b/deploy/crd.yaml @@ -1542,14 +1542,14 @@ spec: externalCerts: items: description: ExternalCert is a reference to an existing TLS - or Opaque Secret in... + or Opaque Secret or... properties: enabled: description: Enabled or disabled type: boolean name: - description: Name of the Secret which already exists in - Kubernetes + description: Name of the Secret or ConfigMap which already + exists in Kubernetes type: string revocationCheckPolicyName: type: string @@ -1561,6 +1561,10 @@ spec: items: type: string type: array + type: + description: 'Type of the referenced resource: "secret" + (default) or "configmap"' + type: string verifyHostname: type: boolean type: object @@ -1933,8 +1937,7 @@ spec: present in a Container. properties: name: - description: Name of the environment variable. Must - be a C_IDENTIFIER. + description: Name of the environment variable. type: string value: description: |- @@ -1979,6 +1982,32 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + description: FileKeyRef selects a key of the env + file. + properties: + key: + description: The key within the env file. + type: string + optional: + default: false + description: Specify whether the file or its + key must be defined. + type: boolean + path: + description: The path within the volume from + which to select the file. + type: string + volumeName: + description: The name of the volume mount + containing the env file. + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: description: 'Selects a resource of the container: only resources limits and requests...' @@ -2637,6 +2666,43 @@ spec: description: RestartPolicy defines the restart behavior of individual containers in a... type: string + restartPolicyRules: + description: |- + Represents a list of rules to be checked to determine if the + container... + items: + description: ContainerRestartRule describes how a container + exit is handled. + properties: + action: + description: |- + Specifies the action taken on a container exit if the requirements + are... + type: string + exitCodes: + description: Represents the exit codes to check on + container exits. + properties: + operator: + description: Represents the relationship between + the container exit code(s) and the... + type: string + values: + description: Specifies the set of values to check + for container exit codes. + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: description: SecurityContext defines the security options the container should be run... @@ -4005,18 +4071,6 @@ spec: dmzGateway: description: DmzOTKGateway reference if type is internal properties: - name: - description: |- - Name of the gateway - if managing otk gateways across namespaces this must... - type: string - namespace: - description: Namespace of the referenced gateway if managing - gateways cross namespace... - type: string - port: - description: Port of the target gateway - type: integer url: description: |- Url of the target gateway @@ -4179,18 +4233,6 @@ spec: internalGateway: description: InternalOTKGateway reference if type is dmz properties: - name: - description: |- - Name of the gateway - if managing otk gateways across namespaces this must... - type: string - namespace: - description: Namespace of the referenced gateway if managing - gateways cross namespace... - type: string - port: - description: Port of the target gateway - type: integer url: description: |- Url of the target gateway @@ -4205,10 +4247,6 @@ spec: description: Enable or disable database maintenance tasks type: boolean type: object - manageCrossNamespace: - description: ManageCrossNamespace allows a cluster-wide layer7 - operator to manage... - type: boolean overrides: description: Overrides default OTK install functionality properties: @@ -5190,8 +5228,7 @@ spec: present in a Container. properties: name: - description: Name of the environment variable. Must - be a C_IDENTIFIER. + description: Name of the environment variable. type: string value: description: |- @@ -5236,6 +5273,32 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + description: FileKeyRef selects a key of the env + file. + properties: + key: + description: The key within the env file. + type: string + optional: + default: false + description: Specify whether the file or its + key must be defined. + type: boolean + path: + description: The path within the volume from + which to select the file. + type: string + volumeName: + description: The name of the volume mount + containing the env file. + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: description: 'Selects a resource of the container: only resources limits and requests...' @@ -5894,6 +5957,43 @@ spec: description: RestartPolicy defines the restart behavior of individual containers in a... type: string + restartPolicyRules: + description: |- + Represents a list of rules to be checked to determine if the + container... + items: + description: ContainerRestartRule describes how a container + exit is handled. + properties: + action: + description: |- + Specifies the action taken on a container exit if the requirements + are... + type: string + exitCodes: + description: Represents the exit codes to check on + container exits. + properties: + operator: + description: Represents the relationship between + the container exit code(s) and the... + type: string + values: + description: Specifies the set of values to check + for container exit codes. + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: description: SecurityContext defines the security options the container should be run... @@ -6248,6 +6348,131 @@ spec: description: SingletonExtraction works with the Gateway in Ephemeral mode. type: boolean + startupProbe: + description: Probe describes a health check to be performed against + a container to... + properties: + exec: + description: Exec specifies a command to execute in the container. + properties: + command: + description: Command is the command line to execute inside + the container, the working... + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + failureThreshold: + description: Minimum consecutive failures for the probe to + be considered failed after... + format: int32 + type: integer + grpc: + description: GRPC specifies a GRPC HealthCheckRequest. + properties: + port: + description: Port number of the gRPC service. Number must + be in the range 1 to 65535. + format: int32 + type: integer + service: + default: "" + description: Service is the name of the service to place + in the gRPC HealthCheckRequest... + type: string + required: + - port + type: object + httpGet: + description: HTTPGet specifies an HTTP GET request to perform. + properties: + host: + description: Host name to connect to, defaults to the + pod IP. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP + allows repeated headers. + items: + description: HTTPHeader describes a custom header to + be used in HTTP probes + properties: + name: + description: The header field name. + type: string + value: + description: The header field value + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + description: Path to access on the HTTP server. + type: string + port: + anyOf: + - type: integer + - type: string + description: Name or number of the port to access on the + container. + x-kubernetes-int-or-string: true + scheme: + description: |- + Scheme to use for connecting to the host. + Defaults to HTTP. + type: string + required: + - port + type: object + initialDelaySeconds: + description: Number of seconds after the container has started + before liveness probes... + format: int32 + type: integer + periodSeconds: + description: |- + How often (in seconds) to perform the probe. + Default to 10 seconds. + format: int32 + type: integer + successThreshold: + description: Minimum consecutive successes for the probe to + be considered successful... + format: int32 + type: integer + tcpSocket: + description: TCPSocket specifies a connection to a TCP port. + properties: + host: + description: 'Optional: Host name to connect to, defaults + to the pod IP.' + type: string + port: + anyOf: + - type: integer + - type: string + description: Number or name of the port to access on the + container. + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + description: Optional duration in seconds the pod needs to + terminate gracefully upon... + format: int64 + type: integer + timeoutSeconds: + description: |- + Number of seconds after which the probe times out. + Defaults to 1 second. + format: int32 + type: integer + type: object system: description: System properties: diff --git a/deploy/cw-bundle.yaml b/deploy/cw-bundle.yaml index fd2d446d..8a645c8b 100644 --- a/deploy/cw-bundle.yaml +++ b/deploy/cw-bundle.yaml @@ -1551,14 +1551,14 @@ spec: externalCerts: items: description: ExternalCert is a reference to an existing TLS - or Opaque Secret in... + or Opaque Secret or... properties: enabled: description: Enabled or disabled type: boolean name: - description: Name of the Secret which already exists in - Kubernetes + description: Name of the Secret or ConfigMap which already + exists in Kubernetes type: string revocationCheckPolicyName: type: string @@ -1570,6 +1570,10 @@ spec: items: type: string type: array + type: + description: 'Type of the referenced resource: "secret" + (default) or "configmap"' + type: string verifyHostname: type: boolean type: object @@ -1942,8 +1946,7 @@ spec: present in a Container. properties: name: - description: Name of the environment variable. Must - be a C_IDENTIFIER. + description: Name of the environment variable. type: string value: description: |- @@ -1988,6 +1991,32 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + description: FileKeyRef selects a key of the env + file. + properties: + key: + description: The key within the env file. + type: string + optional: + default: false + description: Specify whether the file or its + key must be defined. + type: boolean + path: + description: The path within the volume from + which to select the file. + type: string + volumeName: + description: The name of the volume mount + containing the env file. + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: description: 'Selects a resource of the container: only resources limits and requests...' @@ -2646,6 +2675,43 @@ spec: description: RestartPolicy defines the restart behavior of individual containers in a... type: string + restartPolicyRules: + description: |- + Represents a list of rules to be checked to determine if the + container... + items: + description: ContainerRestartRule describes how a container + exit is handled. + properties: + action: + description: |- + Specifies the action taken on a container exit if the requirements + are... + type: string + exitCodes: + description: Represents the exit codes to check on + container exits. + properties: + operator: + description: Represents the relationship between + the container exit code(s) and the... + type: string + values: + description: Specifies the set of values to check + for container exit codes. + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: description: SecurityContext defines the security options the container should be run... @@ -4014,18 +4080,6 @@ spec: dmzGateway: description: DmzOTKGateway reference if type is internal properties: - name: - description: |- - Name of the gateway - if managing otk gateways across namespaces this must... - type: string - namespace: - description: Namespace of the referenced gateway if managing - gateways cross namespace... - type: string - port: - description: Port of the target gateway - type: integer url: description: |- Url of the target gateway @@ -4188,18 +4242,6 @@ spec: internalGateway: description: InternalOTKGateway reference if type is dmz properties: - name: - description: |- - Name of the gateway - if managing otk gateways across namespaces this must... - type: string - namespace: - description: Namespace of the referenced gateway if managing - gateways cross namespace... - type: string - port: - description: Port of the target gateway - type: integer url: description: |- Url of the target gateway @@ -4214,10 +4256,6 @@ spec: description: Enable or disable database maintenance tasks type: boolean type: object - manageCrossNamespace: - description: ManageCrossNamespace allows a cluster-wide layer7 - operator to manage... - type: boolean overrides: description: Overrides default OTK install functionality properties: @@ -5199,8 +5237,7 @@ spec: present in a Container. properties: name: - description: Name of the environment variable. Must - be a C_IDENTIFIER. + description: Name of the environment variable. type: string value: description: |- @@ -5245,6 +5282,32 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + description: FileKeyRef selects a key of the env + file. + properties: + key: + description: The key within the env file. + type: string + optional: + default: false + description: Specify whether the file or its + key must be defined. + type: boolean + path: + description: The path within the volume from + which to select the file. + type: string + volumeName: + description: The name of the volume mount + containing the env file. + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: description: 'Selects a resource of the container: only resources limits and requests...' @@ -5903,6 +5966,43 @@ spec: description: RestartPolicy defines the restart behavior of individual containers in a... type: string + restartPolicyRules: + description: |- + Represents a list of rules to be checked to determine if the + container... + items: + description: ContainerRestartRule describes how a container + exit is handled. + properties: + action: + description: |- + Specifies the action taken on a container exit if the requirements + are... + type: string + exitCodes: + description: Represents the exit codes to check on + container exits. + properties: + operator: + description: Represents the relationship between + the container exit code(s) and the... + type: string + values: + description: Specifies the set of values to check + for container exit codes. + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: description: SecurityContext defines the security options the container should be run... @@ -6257,6 +6357,131 @@ spec: description: SingletonExtraction works with the Gateway in Ephemeral mode. type: boolean + startupProbe: + description: Probe describes a health check to be performed against + a container to... + properties: + exec: + description: Exec specifies a command to execute in the container. + properties: + command: + description: Command is the command line to execute inside + the container, the working... + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + failureThreshold: + description: Minimum consecutive failures for the probe to + be considered failed after... + format: int32 + type: integer + grpc: + description: GRPC specifies a GRPC HealthCheckRequest. + properties: + port: + description: Port number of the gRPC service. Number must + be in the range 1 to 65535. + format: int32 + type: integer + service: + default: "" + description: Service is the name of the service to place + in the gRPC HealthCheckRequest... + type: string + required: + - port + type: object + httpGet: + description: HTTPGet specifies an HTTP GET request to perform. + properties: + host: + description: Host name to connect to, defaults to the + pod IP. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP + allows repeated headers. + items: + description: HTTPHeader describes a custom header to + be used in HTTP probes + properties: + name: + description: The header field name. + type: string + value: + description: The header field value + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + description: Path to access on the HTTP server. + type: string + port: + anyOf: + - type: integer + - type: string + description: Name or number of the port to access on the + container. + x-kubernetes-int-or-string: true + scheme: + description: |- + Scheme to use for connecting to the host. + Defaults to HTTP. + type: string + required: + - port + type: object + initialDelaySeconds: + description: Number of seconds after the container has started + before liveness probes... + format: int32 + type: integer + periodSeconds: + description: |- + How often (in seconds) to perform the probe. + Default to 10 seconds. + format: int32 + type: integer + successThreshold: + description: Minimum consecutive successes for the probe to + be considered successful... + format: int32 + type: integer + tcpSocket: + description: TCPSocket specifies a connection to a TCP port. + properties: + host: + description: 'Optional: Host name to connect to, defaults + to the pod IP.' + type: string + port: + anyOf: + - type: integer + - type: string + description: Number or name of the port to access on the + container. + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + description: Optional duration in seconds the pod needs to + terminate gracefully upon... + format: int64 + type: integer + timeoutSeconds: + description: |- + Number of seconds after which the probe times out. + Defaults to 1 second. + format: int32 + type: integer + type: object system: description: System properties: diff --git a/deploy/gateway.yaml b/deploy/gateway.yaml index 59d1d327..c3dcdec6 100644 --- a/deploy/gateway.yaml +++ b/deploy/gateway.yaml @@ -4,7 +4,7 @@ metadata: name: ssg spec: app: - image: docker.io/caapim/gateway:11.1.3 + image: docker.io/caapim/gateway:11.2.1 management: cluster: hostname: gateway.brcmlabs.com @@ -26,7 +26,7 @@ spec: license: accept: false secretName: gateway-license - version: 11.1.3 + version: 11.2.1 status: {} --- apiVersion: security.brcmlabs.com/v1 diff --git a/docs/gateway.md b/docs/gateway.md index 9c7f619c..6843e38b 100644 --- a/docs/gateway.md +++ b/docs/gateway.md @@ -494,6 +494,14 @@ to be applied to one ephemeral gateway only. This works inconjunction with repository references and only supports dynamic repository references.
false + + startupProbe + object + + Probe describes a health check to be performed against a container to determine whether it is +alive or ready to receive traffic.
+ + false system object @@ -1578,8 +1586,8 @@ a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), -compute a sum by iterating through the elements of this field and adding -"weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the +compute a sum by iterating through the elements of this field and subtracting +"weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.
false @@ -2349,8 +2357,8 @@ For example, if autoscaling is configured with a memory consumption target of 10 and scale-down and scale-up tolerances of 5% and 1% respectively, scaling will be triggered when the actual consumption falls below 95Mi or exceeds 101Mi. -This is an alpha field and requires enabling the HPAConfigurableTolerance -feature gate.
+This is an beta field and requires the HPAConfigurableTolerance feature +gate to be enabled.
false @@ -2469,8 +2477,8 @@ For example, if autoscaling is configured with a memory consumption target of 10 and scale-down and scale-up tolerances of 5% and 1% respectively, scaling will be triggered when the actual consumption falls below 95Mi or exceeds 101Mi. -This is an alpha field and requires enabling the HPAConfigurableTolerance -feature gate.
+This is an beta field and requires the HPAConfigurableTolerance feature +gate to be enabled.
false @@ -4302,10 +4310,10 @@ Property is a simple k/v pair -ExternalCert is a reference to an existing TLS or Opaque Secret in Kubernetes -The Layer7 Operator will attempt to convert this secret to a Graphman bundle that can be applied +ExternalCert is a reference to an existing TLS or Opaque Secret or ConfigMap in Kubernetes +The Layer7 Operator will attempt to convert this to a Graphman bundle that can be applied dynamically keeping any referenced trusted certs up-to-date. -You can bring in external secrets using tools like cert-manager +You can bring in external certs using tools like cert-manager @@ -4327,7 +4335,7 @@ You can bring in external secrets using tools like cert-manager @@ -4358,6 +4366,13 @@ You can bring in external secrets using tools like cert-manager
+ + + + + @@ -5355,8 +5370,8 @@ Cannot be updated.
@@ -5445,10 +5461,10 @@ More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-co + + + + + @@ -5588,7 +5621,8 @@ EnvVar represents an environment variable present in a Container. @@ -5648,6 +5682,14 @@ Source for the environment variable's value. Cannot be used if value is not empt spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.
+ + + + + @@ -5749,6 +5791,66 @@ spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podI
name string - Name of the Secret which already exists in Kubernetes
+ Name of the Secret or ConfigMap which already exists in Kubernetes
false
false
typestring + Type of the referenced resource: "secret" (default) or "configmap"
+
false
verifyHostname boolean []object List of sources to populate environment variables in the container. -The keys defined within a source must be a C_IDENTIFIER. All invalid keys -will be reported as an event when the container is starting. When a key exists in multiple +The keys defined within a source may consist of any printable ASCII characters except '='. +When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.
@@ -5428,7 +5443,8 @@ More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#cont
resizePolicy []object - Resources resize policy for the container.
+ Resources resize policy for the container. +This field cannot be set on ephemeral containers.
false
string RestartPolicy defines the restart behavior of individual containers in a pod. -This field may only be set for init containers, and the only allowed value is "Always". -For non-init containers or when this field is not specified, +This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. -Setting the RestartPolicy as "Always" for the init container will have the following effect: +Additionally, setting the RestartPolicy as "Always" for the init container will +have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy "Always" @@ -5461,6 +5477,23 @@ init container is started, or after any startupProbe has successfully completed.
false
restartPolicyRules[]object + Represents a list of rules to be checked to determine if the +container should be restarted on exit. The rules are evaluated in +order. Once a rule matches a container exit condition, the remaining +rules are ignored. If no rule matches the container exit condition, +the Container-level restart policy determines the whether the container +is restarted or not. Constraints on the rules: +- At most 20 rules are allowed. +- Rules can have the same action. +- Identical rules are not forbidden in validations. +When rules are specified, container MUST set RestartPolicy explicitly +even it if matches the Pod's RestartPolicy.
+
false
securityContext objectname string - Name of the environment variable. Must be a C_IDENTIFIER.
+ Name of the environment variable. +May consist of any printable ASCII characters except '='.
true
false
fileKeyRefobject + FileKeyRef selects a key of the env file. +Requires the EnvFiles feature gate to be enabled.
+
false
resourceFieldRef object
+### Gateway.spec.app.initContainers[index].env[index].valueFrom.fileKeyRef +[↩ Parent](#gatewayspecappinitcontainersindexenvindexvaluefrom) + + + +FileKeyRef selects a key of the env file. +Requires the EnvFiles feature gate to be enabled. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionRequired
keystring + The key within the env file. An invalid key will prevent the pod from starting. +The keys defined within a source may consist of any printable ASCII characters except '='. +During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters.
+
true
pathstring + The path within the volume from which to select the file. +Must be relative and may not contain the '..' path or start with '..'.
+
true
volumeNamestring + The name of the volume mount containing the env file.
+
true
optionalboolean + Specify whether the file or its key must be defined. If the file or key +does not exist, then the env var is not published. +If optional is set to true and the specified key does not exist, +the environment variable will not be set in the Pod's containers. + +If optional is set to false and the specified key does not exist, +an error will be returned during Pod creation.
+
+ Default: false
+
false
+ + ### Gateway.spec.app.initContainers[index].env[index].valueFrom.resourceFieldRef [↩ Parent](#gatewayspecappinitcontainersindexenvindexvaluefrom) @@ -5865,7 +5967,8 @@ EnvFromSource represents the source of a set of ConfigMaps or Secrets prefix string - Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER.
+ Optional text to prepend to the name of each environment variable. +May consist of any printable ASCII characters except '='.
false @@ -7282,7 +7385,7 @@ More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-co Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. -This is an alpha field and requires enabling the +This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers.
@@ -7348,6 +7451,82 @@ only the result of this request.
+### Gateway.spec.app.initContainers[index].restartPolicyRules[index] +[↩ Parent](#gatewayspecappinitcontainersindex) + + + +ContainerRestartRule describes how a container exit is handled. + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionRequired
actionstring + Specifies the action taken on a container exit if the requirements +are satisfied. The only possible value is "Restart" to restart the +container.
+
true
exitCodesobject + Represents the exit codes to check on container exits.
+
false
+ + +### Gateway.spec.app.initContainers[index].restartPolicyRules[index].exitCodes +[↩ Parent](#gatewayspecappinitcontainersindexrestartpolicyrulesindex) + + + +Represents the exit codes to check on container exits. + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionRequired
operatorstring + Represents the relationship between the container exit code(s) and the +specified values. Possible values are: +- In: the requirement is satisfied if the container exit code is in the + set of specified values. +- NotIn: the requirement is satisfied if the container exit code is + not in the set of specified values.
+
true
values[]integer + Specifies the set of values to check for container exit codes. +At most 255 elements are allowed.
+
false
+ + ### Gateway.spec.app.initContainers[index].securityContext [↩ Parent](#gatewayspecappinitcontainersindex) @@ -10691,14 +10870,6 @@ leaf certificates for DMZ gateway mTLS client authentication.
MaintenanceTasks for the OTK database are disabled by default
false - - manageCrossNamespace - boolean - - ManageCrossNamespace allows a cluster-wide layer7 operator to manage internal/dmz gateways across namespaces -this is limited to a single kubernetes cluster.
- - false overrides object @@ -11331,28 +11502,6 @@ DmzOTKGateway reference if type is internal - name - string - - Name of the gateway -if managing otk gateways across namespaces this must match the referenced gateway CR
- - false - - namespace - string - - Namespace of the referenced gateway if managing gateways cross namespace (optional)
- - false - - port - integer - - Port of the target gateway
- - false - url string @@ -11807,28 +11956,6 @@ InternalOTKGateway reference if type is dmz - name - string - - Name of the gateway -if managing otk gateways across namespaces this must match the referenced gateway CR
- - false - - namespace - string - - Namespace of the referenced gateway if managing gateways cross namespace (optional)
- - false - - port - integer - - Port of the target gateway
- - false - url string @@ -14711,8 +14838,8 @@ Cannot be updated.
[]object List of sources to populate environment variables in the container. -The keys defined within a source must be a C_IDENTIFIER. All invalid keys -will be reported as an event when the container is starting. When a key exists in multiple +The keys defined within a source may consist of any printable ASCII characters except '='. +When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.
@@ -14784,7 +14911,8 @@ More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#cont resizePolicy []object - Resources resize policy for the container.
+ Resources resize policy for the container. +This field cannot be set on ephemeral containers.
false @@ -14801,10 +14929,10 @@ More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-co string RestartPolicy defines the restart behavior of individual containers in a pod. -This field may only be set for init containers, and the only allowed value is "Always". -For non-init containers or when this field is not specified, +This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. -Setting the RestartPolicy as "Always" for the init container will have the following effect: +Additionally, setting the RestartPolicy as "Always" for the init container will +have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy "Always" @@ -14817,6 +14945,23 @@ init container is started, or after any startupProbe has successfully completed.
false + + restartPolicyRules + []object + + Represents a list of rules to be checked to determine if the +container should be restarted on exit. The rules are evaluated in +order. Once a rule matches a container exit condition, the remaining +rules are ignored. If no rule matches the container exit condition, +the Container-level restart policy determines the whether the container +is restarted or not. Constraints on the rules: +- At most 20 rules are allowed. +- Rules can have the same action. +- Identical rules are not forbidden in validations. +When rules are specified, container MUST set RestartPolicy explicitly +even it if matches the Pod's RestartPolicy.
+ + false securityContext object @@ -14944,7 +15089,8 @@ EnvVar represents an environment variable present in a Container. name string - Name of the environment variable. Must be a C_IDENTIFIER.
+ Name of the environment variable. +May consist of any printable ASCII characters except '='.
true @@ -15004,6 +15150,14 @@ Source for the environment variable's value. Cannot be used if value is not empt spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.
false + + fileKeyRef + object + + FileKeyRef selects a key of the env file. +Requires the EnvFiles feature gate to be enabled.
+ + false resourceFieldRef object @@ -15105,6 +15259,66 @@ spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podI +### Gateway.spec.app.sidecars[index].env[index].valueFrom.fileKeyRef +[↩ Parent](#gatewayspecappsidecarsindexenvindexvaluefrom) + + + +FileKeyRef selects a key of the env file. +Requires the EnvFiles feature gate to be enabled. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionRequired
keystring + The key within the env file. An invalid key will prevent the pod from starting. +The keys defined within a source may consist of any printable ASCII characters except '='. +During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters.
+
true
pathstring + The path within the volume from which to select the file. +Must be relative and may not contain the '..' path or start with '..'.
+
true
volumeNamestring + The name of the volume mount containing the env file.
+
true
optionalboolean + Specify whether the file or its key must be defined. If the file or key +does not exist, then the env var is not published. +If optional is set to true and the specified key does not exist, +the environment variable will not be set in the Pod's containers. + +If optional is set to false and the specified key does not exist, +an error will be returned during Pod creation.
+
+ Default: false
+
false
+ + ### Gateway.spec.app.sidecars[index].env[index].valueFrom.resourceFieldRef [↩ Parent](#gatewayspecappsidecarsindexenvindexvaluefrom) @@ -15221,7 +15435,8 @@ EnvFromSource represents the source of a set of ConfigMaps or Secrets prefix string - Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER.
+ Optional text to prepend to the name of each environment variable. +May consist of any printable ASCII characters except '='.
false @@ -16638,7 +16853,7 @@ More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-co Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. -This is an alpha field and requires enabling the +This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers.
@@ -16704,14 +16919,12 @@ only the result of this request.
-### Gateway.spec.app.sidecars[index].securityContext +### Gateway.spec.app.sidecars[index].restartPolicyRules[index] [↩ Parent](#gatewayspecappsidecarsindex) -SecurityContext defines the security options the container should be run with. -If set, the fields of SecurityContext override the equivalent fields of PodSecurityContext. -More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/ +ContainerRestartRule describes how a container exit is handled. @@ -16723,44 +16936,122 @@ More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-con - - - - - - - + + - + - + - - - - +
allowPrivilegeEscalationboolean - AllowPrivilegeEscalation controls whether a process can gain more -privileges than its parent process. This bool directly controls if -the no_new_privs flag will be set on the container process. -AllowPrivilegeEscalation is true always when the container is: -1) run as Privileged -2) has CAP_SYS_ADMIN -Note that this field cannot be set when spec.os.name is windows.
-
false
appArmorProfileobjectactionstring - appArmorProfile is the AppArmor options to use by this container. If set, this profile -overrides the pod's appArmorProfile. -Note that this field cannot be set when spec.os.name is windows.
+ Specifies the action taken on a container exit if the requirements +are satisfied. The only possible value is "Restart" to restart the +container.
falsetrue
capabilitiesexitCodes object - The capabilities to add/drop when running containers. -Defaults to the default set of capabilities granted by the container runtime. -Note that this field cannot be set when spec.os.name is windows.
+ Represents the exit codes to check on container exits.
false
privilegedboolean - Run container in privileged mode. -Processes in privileged containers are essentially equivalent to root on the host. -Defaults to false. -Note that this field cannot be set when spec.os.name is windows.
+
+ + +### Gateway.spec.app.sidecars[index].restartPolicyRules[index].exitCodes +[↩ Parent](#gatewayspecappsidecarsindexrestartpolicyrulesindex) + + + +Represents the exit codes to check on container exits. + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionRequired
operatorstring + Represents the relationship between the container exit code(s) and the +specified values. Possible values are: +- In: the requirement is satisfied if the container exit code is in the + set of specified values. +- NotIn: the requirement is satisfied if the container exit code is + not in the set of specified values.
+
true
values[]integer + Specifies the set of values to check for container exit codes. +At most 255 elements are allowed.
+
false
+ + +### Gateway.spec.app.sidecars[index].securityContext +[↩ Parent](#gatewayspecappsidecarsindex) + + + +SecurityContext defines the security options the container should be run with. +If set, the fields of SecurityContext override the equivalent fields of PodSecurityContext. +More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -17545,6 +17836,326 @@ SubPathExpr and SubPath are mutually exclusive.
NameTypeDescriptionRequired
allowPrivilegeEscalationboolean + AllowPrivilegeEscalation controls whether a process can gain more +privileges than its parent process. This bool directly controls if +the no_new_privs flag will be set on the container process. +AllowPrivilegeEscalation is true always when the container is: +1) run as Privileged +2) has CAP_SYS_ADMIN +Note that this field cannot be set when spec.os.name is windows.
+
false
appArmorProfileobject + appArmorProfile is the AppArmor options to use by this container. If set, this profile +overrides the pod's appArmorProfile. +Note that this field cannot be set when spec.os.name is windows.
+
false
capabilitiesobject + The capabilities to add/drop when running containers. +Defaults to the default set of capabilities granted by the container runtime. +Note that this field cannot be set when spec.os.name is windows.
+
false
privilegedboolean + Run container in privileged mode. +Processes in privileged containers are essentially equivalent to root on the host. +Defaults to false. +Note that this field cannot be set when spec.os.name is windows.
false
+### Gateway.spec.app.startupProbe +[↩ Parent](#gatewayspecapp) + + + +Probe describes a health check to be performed against a container to determine whether it is +alive or ready to receive traffic. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionRequired
execobject + Exec specifies a command to execute in the container.
+
false
failureThresholdinteger + Minimum consecutive failures for the probe to be considered failed after having succeeded. +Defaults to 3. Minimum value is 1.
+
+ Format: int32
+
false
grpcobject + GRPC specifies a GRPC HealthCheckRequest.
+
false
httpGetobject + HTTPGet specifies an HTTP GET request to perform.
+
false
initialDelaySecondsinteger + Number of seconds after the container has started before liveness probes are initiated. +More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
+
+ Format: int32
+
false
periodSecondsinteger + How often (in seconds) to perform the probe. +Default to 10 seconds. Minimum value is 1.
+
+ Format: int32
+
false
successThresholdinteger + Minimum consecutive successes for the probe to be considered successful after having failed. +Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.
+
+ Format: int32
+
false
tcpSocketobject + TCPSocket specifies a connection to a TCP port.
+
false
terminationGracePeriodSecondsinteger + Optional duration in seconds the pod needs to terminate gracefully upon probe failure. +The grace period is the duration in seconds after the processes running in the pod are sent +a termination signal and the time when the processes are forcibly halted with a kill signal. +Set this value longer than the expected cleanup time for your process. +If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this +value overrides the value provided by the pod spec. +Value must be non-negative integer. The value zero indicates stop immediately via +the kill signal (no opportunity to shut down). +This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate. +Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.
+
+ Format: int64
+
false
timeoutSecondsinteger + Number of seconds after which the probe times out. +Defaults to 1 second. Minimum value is 1. +More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
+
+ Format: int32
+
false
+ + +### Gateway.spec.app.startupProbe.exec +[↩ Parent](#gatewayspecappstartupprobe) + + + +Exec specifies a command to execute in the container. + + + + + + + + + + + + + + + + +
NameTypeDescriptionRequired
command[]string + Command is the command line to execute inside the container, the working directory for the +command is root ('/') in the container's filesystem. The command is simply exec'd, it is +not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use +a shell, you need to explicitly call out to that shell. +Exit status of 0 is treated as live/healthy and non-zero is unhealthy.
+
false
+ + +### Gateway.spec.app.startupProbe.grpc +[↩ Parent](#gatewayspecappstartupprobe) + + + +GRPC specifies a GRPC HealthCheckRequest. + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionRequired
portinteger + Port number of the gRPC service. Number must be in the range 1 to 65535.
+
+ Format: int32
+
true
servicestring + Service is the name of the service to place in the gRPC HealthCheckRequest +(see https://github.com/grpc/grpc/blob/master/doc/health-checking.md). + +If this is not specified, the default behavior is defined by gRPC.
+
+ Default:
+
false
+ + +### Gateway.spec.app.startupProbe.httpGet +[↩ Parent](#gatewayspecappstartupprobe) + + + +HTTPGet specifies an HTTP GET request to perform. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionRequired
portint or string + Name or number of the port to access on the container. +Number must be in the range 1 to 65535. +Name must be an IANA_SVC_NAME.
+
true
hoststring + Host name to connect to, defaults to the pod IP. You probably want to set +"Host" in httpHeaders instead.
+
false
httpHeaders[]object + Custom headers to set in the request. HTTP allows repeated headers.
+
false
pathstring + Path to access on the HTTP server.
+
false
schemestring + Scheme to use for connecting to the host. +Defaults to HTTP.
+
false
+ + +### Gateway.spec.app.startupProbe.httpGet.httpHeaders[index] +[↩ Parent](#gatewayspecappstartupprobehttpget) + + + +HTTPHeader describes a custom header to be used in HTTP probes + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionRequired
namestring + The header field name. +This will be canonicalized upon output, so case-variant names will be understood as the same header.
+
true
valuestring + The header field value
+
true
+ + +### Gateway.spec.app.startupProbe.tcpSocket +[↩ Parent](#gatewayspecappstartupprobe) + + + +TCPSocket specifies a connection to a TCP port. + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionRequired
portint or string + Number or name of the port to access on the container. +Number must be in the range 1 to 65535. +Name must be an IANA_SVC_NAME.
+
true
hoststring + Optional: Host name to connect to, defaults to the pod IP.
+
false
+ + ### Gateway.spec.app.system [↩ Parent](#gatewayspecapp) @@ -17610,9 +18221,10 @@ If the key is empty, operator must be Exists; this combination means to match al string Operator represents a key's relationship to the value. -Valid operators are Exists and Equal. Defaults to Equal. +Valid operators are Exists, Equal, Lt, and Gt. Defaults to Equal. Exists is equivalent to wildcard for value, so that a pod can -tolerate all taints of a particular category.
+tolerate all taints of a particular category. +Lt and Gt perform numeric comparisons (requires feature gate TaintTolerationComparisonOperators).
false diff --git a/example/Makefile b/example/Makefile index f29739fa..2e1919bf 100644 --- a/example/Makefile +++ b/example/Makefile @@ -23,7 +23,7 @@ create-collector: rm -rf $(tmp) install: - kubectl apply -f https://github.com/CAAPIM/layer7-operator/releases/download/v1.2.2/bundle.yaml + kubectl apply -f https://github.com/CAAPIM/layer7-operator/releases/download/v1.3.0/bundle.yaml @$(MAKE) --silent t=10 wait kubectl wait --for=condition=ready --timeout=600s pod -l app.kubernetes.io/name=layer7-operator @@ -43,7 +43,7 @@ otk-single: kubectl apply -f ./gateway/otk/otk-single.yaml portal-example: redis - kubectl apply -f https://github.com/CAAPIM/layer7-operator/releases/download/v1.2.2/bundle.yaml -n ${NAMESPACE} + kubectl apply -f https://github.com/CAAPIM/layer7-operator/releases/download/v1.3.0/bundle.yaml -n ${NAMESPACE} @$(MAKE) --silent t=15 wait kubectl -n ${NAMESPACE} wait --for=condition=ready --timeout=600s pod -l app.kubernetes.io/name=layer7-operator kubectl apply -k ./base -n ${NAMESPACE} @@ -250,7 +250,7 @@ pki-otk-dmz: pki-otk -kubectl create secret tls otk-dmz-mtls-secret \ --cert=/tmp/otk-dmz-mtls.crt --key=/tmp/otk-dmz-mtls.key \ -n $(NAMESPACE) --dry-run=client -o yaml | kubectl apply -f - - -kubectl create secret generic otk-internal-ca-cert \ + -kubectl create configmap otk-internal-ca-cert \ --from-file=ca.crt=/tmp/otk-internal-tls.crt \ -n $(NAMESPACE) --dry-run=client -o yaml | kubectl apply -f - @@ -258,9 +258,12 @@ pki-otk-internal: pki-otk -kubectl create secret tls otk-internal-secret \ --cert=/tmp/otk-internal-tls.crt --key=/tmp/otk-internal-tls.key \ -n $(NAMESPACE) --dry-run=client -o yaml | kubectl apply -f - - -kubectl create secret generic otk-dmz-mtls-public-cert \ + -kubectl create configmap otk-dmz-mtls-public-cert \ --from-file=dmz-gateway.crt=/tmp/otk-dmz-mtls.crt \ -n $(NAMESPACE) --dry-run=client -o yaml | kubectl apply -f - + -kubectl create configmap otk-dmz-mtls-ca-cert \ + --from-file=dmz-gateway-mtls-ca.crt=/tmp/otk-dmz-mtls-ca.crt \ + -n $(NAMESPACE) --dry-run=client -o yaml | kubectl apply -f - cassandra: helm upgrade --install cassandra -f ./otk/database/cassandra/cassandra-values.yaml oci://registry-1.docker.io/bitnamicharts/cassandra @@ -288,7 +291,7 @@ uninstall: -kubectl delete -f https://github.com/jaegertracing/jaeger-operator/releases/download/v1.65.0/jaeger-operator.yaml -n observability -kubectl delete ns observability -kubectl delete ns monitoring - -kubectl delete -f https://github.com/CAAPIM/layer7-operator/releases/download/v1.2.2/bundle.yaml + -kubectl delete -f https://github.com/CAAPIM/layer7-operator/releases/download/v1.3.0/bundle.yaml -helm uninstall mysql -helm uninstall cassandra -helm uninstall contour -n projectcontour diff --git a/example/advanced/README.md b/example/advanced/README.md index 7cd05ccc..83d78c0e 100644 --- a/example/advanced/README.md +++ b/example/advanced/README.md @@ -76,7 +76,7 @@ ssg-7b7694d995-qptbj 1/1 Running 0 This step will deploy the Layer7 Operator and all of its resources in namespaced mode. This means that it will only manage Gateway and Repository Custom Resources in the Kubernetes Namespace that it's deployed in. ``` -kubectl apply -f https://github.com/CAAPIM/layer7-operator/releases/download/v1.2.2/bundle.yaml +kubectl apply -f https://github.com/CAAPIM/layer7-operator/releases/download/v1.3.0/bundle.yaml ``` ##### Verify the Operator is up and running @@ -317,7 +317,7 @@ status: ready: true startTime: 2023-04-03 18:57:24 +0000 UTC host: gateway.brcmlabs.com - image: caapim/gateway:11.1.3 + image: caapim/gateway:11.2.1 ready: 1 replicas: 1 repositoryStatus: @@ -346,7 +346,7 @@ repositoryStatus: storageSecretName: l7-gw-mysubscriptions-repository type: dynamic state: Ready -version: 11.1.3 +version: 11.2.1 ``` ### Test your Gateway Deployment @@ -533,5 +533,5 @@ kubectl delete -k ./example/repositories/ ### Uninstall the Operator ``` -kubectl delete -f https://github.com/CAAPIM/layer7-operator/releases/download/v1.2.2/bundle.yaml +kubectl delete -f https://github.com/CAAPIM/layer7-operator/releases/download/v1.3.0/bundle.yaml ``` \ No newline at end of file diff --git a/example/basic/README.md b/example/basic/README.md index 15a758a3..b364fc3d 100644 --- a/example/basic/README.md +++ b/example/basic/README.md @@ -59,7 +59,7 @@ ssg-64ccd9dd48-bqstf 1/1 Running 0 This step will deploy the Layer7 Operator and all of its resources in namespaced mode. This means that it will only manage Gateway and Repository Custom Resources in the Kubernetes Namespace that it's deployed in. ``` -kubectl apply -f https://github.com/CAAPIM/layer7-operator/releases/download/v1.2.2/bundle.yaml +kubectl apply -f https://github.com/CAAPIM/layer7-operator/releases/download/v1.3.0/bundle.yaml ``` ##### Verify the Operator is up and running @@ -170,7 +170,7 @@ You will see an init container starting with graphman-static-init. Init Containers: graphman-static-init-c1b58adb6d: Container ID: containerd://21924ae85d25437d3634ea5da1415c9bb58d678600f9fd67d4f0b0360857d7c5 - Image: docker.io/caapim/graphman-static-init:1.0.4 + Image: docker.io/caapim/graphman-static-init:1.0.5 Image ID: docker.io/caapim/graphman-static-init@sha256:8cb1035035b18fa9dc2c95e2b584c758e78909b3f615ee5f49dce166e8aae213 Port: Host Port: @@ -205,7 +205,7 @@ status: ready: true startTime: 2023-04-03 18:57:24 +0000 UTC host: gateway.brcmlabs.com - image: caapim/gateway:11.1.3 + image: caapim/gateway:11.2.1 ready: 1 replicas: 1 repositoryStatus: @@ -234,7 +234,7 @@ repositoryStatus: storageSecretName: l7-gw-mysubscriptions-repository type: dynamic state: Ready -version: 11.1.3 +version: 11.2.1 ``` ### Test your Gateway Deployment @@ -322,5 +322,5 @@ kubectl delete -k ./example/repositories/ ### Uninstall the Operator ``` -kubectl delete -f https://github.com/CAAPIM/layer7-operator/releases/download/v1.2.2/bundle.yaml +kubectl delete -f https://github.com/CAAPIM/layer7-operator/releases/download/v1.3.0/bundle.yaml ``` \ No newline at end of file diff --git a/example/gateway/advanced-gateway.yaml b/example/gateway/advanced-gateway.yaml index 1a110910..e4a160a6 100644 --- a/example/gateway/advanced-gateway.yaml +++ b/example/gateway/advanced-gateway.yaml @@ -3,7 +3,7 @@ kind: Gateway metadata: name: ssg spec: - version: "11.1.3" + version: "11.2.1" license: accept: false secretName: gateway-license @@ -17,7 +17,7 @@ spec: reconcileReferences: true restartOnConfigChange: true singletonExtraction: true - image: docker.io/caapim/gateway:11.1.3 + image: docker.io/caapim/gateway:11.2.1 imagePullPolicy: IfNotPresent serviceAccount: create: true @@ -151,7 +151,7 @@ spec: enabled: false graphman: enabled: true - initContainerImage: docker.io/caapim/graphman-static-init:1.0.4 + initContainerImage: docker.io/caapim/graphman-static-init:1.0.5 cluster: hostname: gateway.brcmlabs.com database: diff --git a/example/gateway/basic-gateway.yaml b/example/gateway/basic-gateway.yaml index 4544ba55..5cb61e6e 100644 --- a/example/gateway/basic-gateway.yaml +++ b/example/gateway/basic-gateway.yaml @@ -3,13 +3,13 @@ kind: Gateway metadata: name: ssg spec: - version: "11.1.3" + version: "11.2.1" license: accept: false secretName: gateway-license app: replicas: 1 - image: docker.io/caapim/gateway:11.1.3 + image: docker.io/caapim/gateway:11.2.1 imagePullPolicy: IfNotPresent updateStrategy: type: rollingUpdate @@ -76,7 +76,7 @@ spec: enabled: false graphman: enabled: true - initContainerImage: docker.io/caapim/graphman-static-init:1.0.4 + initContainerImage: docker.io/caapim/graphman-static-init:1.0.5 cluster: #password: 7layer hostname: gateway.brcmlabs.com diff --git a/example/gateway/openshift-gateway.yaml b/example/gateway/openshift-gateway.yaml index faa449f6..8a2d8f5c 100644 --- a/example/gateway/openshift-gateway.yaml +++ b/example/gateway/openshift-gateway.yaml @@ -3,7 +3,7 @@ kind: Gateway metadata: name: ssg spec: - version: "11.1.3" + version: "11.2.1" license: accept: false secretName: gateway-license @@ -11,7 +11,7 @@ spec: replicas: 1 restartOnConfigChange: true singletonExtraction: true - image: docker.io/caapim/gateway:11.1.3 + image: docker.io/caapim/gateway:11.2.1 imagePullPolicy: IfNotPresent serviceAccount: create: true @@ -115,7 +115,7 @@ spec: enabled: false graphman: enabled: true - initContainerImage: docker.io/caapim/graphman-static-init:1.0.4 + initContainerImage: docker.io/caapim/graphman-static-init:1.0.5 # initContainerSecurityContext: # runAsNonRoot: true # runAsUser: 1000670001 diff --git a/example/gateway/otel-elastic-gateway.yaml b/example/gateway/otel-elastic-gateway.yaml index ce8aef44..48591886 100644 --- a/example/gateway/otel-elastic-gateway.yaml +++ b/example/gateway/otel-elastic-gateway.yaml @@ -3,7 +3,7 @@ kind: Gateway metadata: name: ssg spec: - version: "11.1.3" + version: "11.2.1" license: accept: false secretName: gateway-license @@ -15,7 +15,7 @@ spec: instrumentation.opentelemetry.io/inject-java: "true" instrumentation.opentelemetry.io/container-names: "gateway" replicas: 1 - image: docker.io/caapim/gateway:11.1.3 + image: docker.io/caapim/gateway:11.2.1 imagePullPolicy: IfNotPresent updateStrategy: type: rollingUpdate @@ -105,7 +105,7 @@ spec: enabled: true graphman: enabled: true - initContainerImage: docker.io/caapim/graphman-static-init:1.0.4 + initContainerImage: docker.io/caapim/graphman-static-init:1.0.5 cluster: hostname: gateway.brcmlabs.com database: diff --git a/example/gateway/otel-lgtm-gateway.yaml b/example/gateway/otel-lgtm-gateway.yaml index 116786c5..8658a6ce 100644 --- a/example/gateway/otel-lgtm-gateway.yaml +++ b/example/gateway/otel-lgtm-gateway.yaml @@ -3,7 +3,7 @@ kind: Gateway metadata: name: ssg spec: - version: "11.1.3" + version: "11.2.1" license: accept: false secretName: gateway-license @@ -15,7 +15,7 @@ spec: instrumentation.opentelemetry.io/inject-java: "true" instrumentation.opentelemetry.io/container-names: "gateway" replicas: 1 - image: docker.io/caapim/gateway:11.1.3 + image: docker.io/caapim/gateway:11.2.1 imagePullPolicy: IfNotPresent updateStrategy: type: rollingUpdate @@ -103,7 +103,7 @@ spec: enabled: true graphman: enabled: true - initContainerImage: docker.io/caapim/graphman-static-init:1.0.4 + initContainerImage: docker.io/caapim/graphman-static-init:1.0.5 cluster: hostname: gateway.brcmlabs.com database: diff --git a/example/gateway/otel-lgtm-sdk-only-gateway.yaml b/example/gateway/otel-lgtm-sdk-only-gateway.yaml index 1acb9a87..da788bd1 100644 --- a/example/gateway/otel-lgtm-sdk-only-gateway.yaml +++ b/example/gateway/otel-lgtm-sdk-only-gateway.yaml @@ -3,7 +3,7 @@ kind: Gateway metadata: name: ssg spec: - version: "11.1.3" + version: "11.2.1" license: accept: false secretName: gateway-license @@ -13,7 +13,7 @@ spec: podAnnotations: sidecar.opentelemetry.io/inject: "ssg-lgtm" replicas: 1 - image: docker.io/caapim/gateway:11.1.3 + image: docker.io/caapim/gateway:11.2.1 imagePullPolicy: IfNotPresent updateStrategy: type: rollingUpdate @@ -101,7 +101,7 @@ spec: enabled: true graphman: enabled: true - initContainerImage: docker.io/caapim/graphman-static-init:1.0.4 + initContainerImage: docker.io/caapim/graphman-static-init:1.0.5 cluster: hostname: gateway.brcmlabs.com database: diff --git a/example/gateway/otk/otk-dmz.yaml b/example/gateway/otk/otk-dmz.yaml index c4abe46d..8f1b95e6 100644 --- a/example/gateway/otk/otk-dmz.yaml +++ b/example/gateway/otk/otk-dmz.yaml @@ -3,73 +3,109 @@ kind: Gateway metadata: name: otk-ssg-dmz spec: - version: "11.1.3" + version: "11.2.1" license: - accept: false + accept: true secretName: gateway-license app: replicas: 2 - image: docker.io/caapim/gateway:11.1.3 + image: docker.io/caapim/gateway:11.2.1 imagePullPolicy: IfNotPresent updateStrategy: type: rollingUpdate rollingUpdate: maxUnavailable: 0 maxSurge: 2 - resources: - requests: - memory: 8Gi - cpu: 3 - limits: - memory: 8Gi - cpu: 3 + resources: {} + #requests: + # memory: 8Gi + # cpu: 3 + #limits: + # memory: 8Gi + # cpu: 3 externalSecrets: - name: gateway-secret enabled: true variableReferencable: true description: Gateway Secret + # ExternalKey for the OTK + externalKeys: + - name: otk-dmz-secret + enabled: true + alias: otk-dmz-key + keyUsageType: "SSL" + - name: otk-dmz-mtls-secret + enabled: true + alias: otk-dmz-mtls-key + #keyUsageType: [""] + externalCerts: + - name: otk-dmz-mtls-public-cert + enabled: true + type: configMap + revocationCheckPolicyType: USE_DEFAULT + trustedFor: [SSL,SIGNING_SERVER_CERTS] + trustAnchor: true + - name: otk-internal-ca-cert + enabled: true + type: configMap + revocationCheckPolicyType: USE_DEFAULT + trustedFor: [SSL,SIGNING_SERVER_CERTS] + trustAnchor: true otk: enabled: true - initContainerImage: docker.io/caapim/otk-install:4.6.2_202402 + initContainerImage: docker.io/caapim/otk-install:4.7.0 type: dmz - internalGatewayReference: otk-ssg-internal + internalGateway: + #url: https://gateway-internal-otk.brcmlabs.com:8443 + url: https://otk-ssg-internal.default.svc.cluster.local:8443 + port: 443 database: type: mysql - create: true - connectionName: OAuth - auth: - # A single secret containing all of the values defined here will be created - # if existingSecret is set the corresponding gateway, readOnly or admin will be omitted from the secret - # if no values are set, a secret will not be created or referenced and the deployment will be invalidated. - # existingSecret: otk-db-secret - gateway: - username: otk_user - password: otkUserPass - readOnly: - # username: readonly_user - username: readonly_user - password: readonly_userPass - admin: - # username: admin - username: admin - password: adminPass - properties: - minimumPoolSize: 3 - maximumPoolSize: 15 - sql: - databaseName: otk_db - #jdbcUrl: jdbc:mysql://:/ - jdbcUrl: jdbc:mysql://mysql.brcmlabs.com:3306/otk_db_init - jdbcDriverClass: com.mysql.cj.jdbc.Driver - connectionProperties: - c3p0.maxConnectionAge: "100" - c3p0.maxIdleTime: "1000" - manageSchema: true - databaseWaitTimeout: 60 + create: false + auth: {} + sql: {} + customHosts: + enabled: false + hostAliases: + - ip: 10.96.137.129 + hostnames: + - gateway-internal-otk.brcmlabs.com autoscaling: enabled: false - bundle: [] - repositoryReferences: [] + bundle: + - type: restman + source: secret + name: restman-bootstrap-bundle + - type: graphman + source: secret + name: graphman-bootstrap-bundle + repositoryReferences: + - name: l7-gw-myframework + enabled: true + type: static + encryption: + existingSecret: graphman-encryption-secret + key: FRAMEWORK_ENCRYPTION_PASSPHRASE + - name: l7-gw-myapis + enabled: true + type: dynamic + encryption: + existingSecret: graphman-encryption-secret + key: APIS_ENCRYPTION_PASSPHRASE + - name: l7-gw-mysubscriptions + enabled: true + type: dynamic + encryption: + existingSecret: graphman-encryption-secret + key: SUBSCRIPTIONS_ENCRYPTION_PASSPHRASE + - name: local-reference-repository + enabled: true + type: dynamic + encryption: {} +# - name: otk-customizations-dmz +# enabled: false +# type: dynamic +# encryption: {} bootstrap: script: enabled: true @@ -100,7 +136,7 @@ spec: dynamicSyncPort: 9443 cluster: #password: 7layer - hostname: gateway.brcmlabs.com + hostname: gateway-dmz-otk.brcmlabs.com database: enabled: false # this runs the gateway in dbbacked/ephemeral mode # jdbcUrl: "jdbc:mysql://cluster1-haproxy.pxc.svc.cluster.local:3306/ssg" @@ -122,12 +158,17 @@ spec: #- -Dcom.l7tech.bootstrap.autoTrustSslKey=trustAnchor,TrustedFor.SSL,TrustedFor.SAML_ISSUER listenPorts: harden: true + refreshOnKeyChanges: true custom: enabled: false ports: [] cwp: enabled: true properties: + - name: otk.port + value: "443" + - name: otk.dmz.private_key.name + value: otk-dmz-mtls-key - name: io.httpsHostAllowWildcard value: "true" - name: log.levels @@ -154,6 +195,7 @@ spec: javax.net.ssl.trustStoreType=jks com.l7tech.server.clusterStaleNodeCleanupTimeoutSeconds=86400 # Additional properties go here + com.l7tech.server.policy.assertion.ServerHttpRoutingAssertion.refreshOnKeyChanges=true service: annotations: projectcontour.io/upstream-protocol.tls: "8443" @@ -169,17 +211,21 @@ spec: annotations: {} tls: - hosts: - - gateway-dmz.brcmlabs.com + - gateway-dmz-otk.brcmlabs.com + - gateway-dmz-otk-pm.brcmlabs.com secretName: brcmlabs rules: - - host: gateway-dmz.brcmlabs.com - # containerSecurityContext: - # runAsNonRoot: true - # runAsUser: 1000669998 - # capabilities: - # drop: - # - ALL - # allowPrivilegeEscalation: false - # podSecurityContext: - # runAsUser: 1000669998 - # runAsGroup: 1000669998 \ No newline at end of file + - host: gateway-dmz-otk.brcmlabs.com + - host: gateway-dmz-otk-pm.brcmlabs.com + http: + paths: + - backend: + service: + name: management + port: + name: management + path: / + pathType: Prefix + + + diff --git a/example/gateway/otk/otk-internal.yaml b/example/gateway/otk/otk-internal.yaml index 698e5350..cbc7bb9f 100644 --- a/example/gateway/otk/otk-internal.yaml +++ b/example/gateway/otk/otk-internal.yaml @@ -3,34 +3,57 @@ kind: Gateway metadata: name: otk-ssg-internal spec: - version: "11.1.3" + version: "11.2.1" license: - accept: false + accept: true secretName: gateway-license app: replicas: 2 - image: docker.io/caapim/gateway:11.1.3 + image: docker.io/caapim/gateway:11.2.1 imagePullPolicy: IfNotPresent updateStrategy: type: rollingUpdate rollingUpdate: maxUnavailable: 0 maxSurge: 2 - resources: - requests: - memory: 8Gi - cpu: 3 - limits: - memory: 8Gi - cpu: 3 + resources: {} + #requests: + # memory: 8Gi + # cpu: 3 + #limits: + # memory: 8Gi + # cpu: 3 + # ExternalKeys with otk flag set to true for OTK-specific key usage + externalKeys: + - name: otk-internal-secret + enabled: true + alias: otk-internal-tls-key + keyUsageType: SSL + externalCerts: + - name: otk-internal-ca-cert + enabled: true + type: configmap + revocationCheckPolicyType: USE_DEFAULT + trustedFor: [SSL,SIGNING_SERVER_CERTS] + trustAnchor: true + - name: otk-dmz-mtls-ca-cert + enabled: true + type: configmap + revocationCheckPolicyType: USE_DEFAULT + trustedFor: [SSL,SIGNING_SERVER_CERTS,SIGNING_CLIENT_CERTS] + trustAnchor: true otk: enabled: true - initContainerImage: docker.io/caapim/otk-install:4.6.2_202402 + initContainerImage: docker.io/caapim/otk-install:4.7.0 type: internal - dmzGatewayReference: otk-ssg-dmz + fipsCertificates: + - name: otk-dmz-mtls-public-cert + enabled: true + type: configMap database: type: mysql create: true + dbUpgrade: true connectionName: OAuth auth: # A single secret containing all of the values defined here will be created @@ -39,32 +62,68 @@ spec: # existingSecret: otk-db-secret gateway: username: otk_user - password: otkUserPass + password: 7layer readOnly: # username: readonly_user username: readonly_user password: readonly_userPass admin: - # username: admin - username: admin - password: adminPass + username: otk_user + password: 7layer + #username: admin + #password: adminPass properties: minimumPoolSize: 3 maximumPoolSize: 15 sql: databaseName: otk_db #jdbcUrl: jdbc:mysql://:/ - jdbcUrl: jdbc:mysql://mysql.brcmlabs.com:3306/otk_db_init + jdbcUrl: jdbc:mysql://192.168.1.35:3306/otk_db jdbcDriverClass: com.mysql.cj.jdbc.Driver connectionProperties: c3p0.maxConnectionAge: "100" c3p0.maxIdleTime: "1000" manageSchema: true databaseWaitTimeout: 60 + overrides: + enabled: true + createTestClients: true autoscaling: enabled: false - bundle: [] - repositoryReferences: [] + bundle: + - type: restman + source: secret + name: restman-bootstrap-bundle + - type: graphman + source: secret + name: graphman-bootstrap-bundle + repositoryReferences: + - name: l7-gw-myframework + enabled: true + type: static + encryption: + existingSecret: graphman-encryption-secret + key: FRAMEWORK_ENCRYPTION_PASSPHRASE + - name: l7-gw-myapis + enabled: true + type: dynamic + encryption: + existingSecret: graphman-encryption-secret + key: APIS_ENCRYPTION_PASSPHRASE + - name: l7-gw-mysubscriptions + enabled: true + type: dynamic + encryption: + existingSecret: graphman-encryption-secret + key: SUBSCRIPTIONS_ENCRYPTION_PASSPHRASE + - name: local-reference-repository + enabled: true + type: dynamic + encryption: {} + #- name: otk-customizations-internal + # enabled: true + # type: dynamic + # encryption: { } bootstrap: script: enabled: true @@ -78,10 +137,10 @@ spec: #password: 7layer # Management port requires a separate service... service: - enabled: false - #annotations: - # cloud.google.com/load-balancer-type: "Internal" - type: LoadBalancer + enabled: true + annotations: + projectcontour.io/upstream-protocol.tls: "9443" + type: ClusterIP ports: - name: management port: 9443 @@ -94,7 +153,7 @@ spec: initContainerImage: docker.io/caapim/graphman-static-init:1.0.4 cluster: #password: 7layer - hostname: gateway.brcmlabs.com + hostname: gateway-internal-otk.brcmlabs.com database: enabled: false # this runs the gateway in dbbacked/ephemeral mode # jdbcUrl: "jdbc:mysql://cluster1-haproxy.pxc.svc.cluster.local:3306/ssg" @@ -116,12 +175,15 @@ spec: #- -Dcom.l7tech.bootstrap.autoTrustSslKey=trustAnchor,TrustedFor.SSL,TrustedFor.SAML_ISSUER listenPorts: harden: true + refreshOnKeyChanges: true custom: enabled: false ports: [] cwp: enabled: true properties: + - name: otk.port + value: "443" - name: io.httpsHostAllowWildcard value: "true" - name: log.levels @@ -148,29 +210,37 @@ spec: javax.net.ssl.trustStoreType=jks com.l7tech.server.clusterStaleNodeCleanupTimeoutSeconds=86400 # Additional properties go here + com.l7tech.server.policy.assertion.ServerHttpRoutingAssertion.refreshOnKeyChanges=true service: annotations: - projectcontour.io/upstream-protocol.tls: "8443,9443" + projectcontour.io/upstream-protocol.tls: "8443" type: ClusterIP ports: - name: https port: 8443 targetPort: 8443 - protocol: TCP - - name: management - port: 9443 - targetPort: 9443 - protocol: TCP + protocol: TCP ingress: enabled: true ingressClassName: contour annotations: {} tls: - hosts: - - gateway.brcmlabs.com + - gateway-internal-otk.brcmlabs.com + - gateway-internal-otk-pm.brcmlabs.com secretName: brcmlabs rules: - - host: gateway.brcmlabs.com + - host: gateway-internal-otk.brcmlabs.com + - host: gateway-internal-otk-pm.brcmlabs.com + http: + paths: + - backend: + service: + name: management + port: + name: management + path: / + pathType: Prefix # containerSecurityContext: # runAsNonRoot: true # runAsUser: 1000669998 @@ -180,4 +250,6 @@ spec: # allowPrivilegeEscalation: false # podSecurityContext: # runAsUser: 1000669998 - # runAsGroup: 1000669998 \ No newline at end of file + # runAsGroup: 1000669998 + + diff --git a/example/gateway/otk/otk-single.yaml b/example/gateway/otk/otk-single.yaml index 62dfcb04..0bcd6622 100644 --- a/example/gateway/otk/otk-single.yaml +++ b/example/gateway/otk/otk-single.yaml @@ -3,14 +3,14 @@ kind: Gateway metadata: name: ssg spec: - version: "11.1.3" + version: "11.2.1" license: accept: false secretName: gateway-license app: replicas: 2 restartOnConfigChange: true - image: docker.io/caapim/gateway:11.1.3 + image: docker.io/caapim/gateway:11.2.1 imagePullPolicy: IfNotPresent serviceAccount: create: true @@ -33,7 +33,7 @@ spec: cpu: 2 otk: enabled: true - initContainerImage: docker.io/caapim/otk-install:4.6.4 + initContainerImage: docker.io/caapim/otk-install:4.7.0 initContainerImagePullPolicy: Always type: single port: 443 @@ -140,7 +140,7 @@ spec: enabled: false graphman: enabled: true - initContainerImage: docker.io/caapim/graphman-static-init:1.0.4 + initContainerImage: docker.io/caapim/graphman-static-init:1.0.5 initContainerImagePullPolicy: Always cluster: hostname: gateway.brcmlabs.com diff --git a/example/gateway/otk/otk-ssg-dmz.yaml b/example/gateway/otk/otk-ssg-dmz.yaml deleted file mode 100644 index 3015705d..00000000 --- a/example/gateway/otk/otk-ssg-dmz.yaml +++ /dev/null @@ -1,235 +0,0 @@ -apiVersion: security.brcmlabs.com/v1 -kind: Gateway -metadata: - name: otk-ssg-dmz -spec: - version: "11.1.3" - license: - accept: true - secretName: gateway-license - app: - replicas: 1 - image: docker.io/caapim/gateway:11.1.3 - imagePullPolicy: IfNotPresent - updateStrategy: - type: rollingUpdate - rollingUpdate: - maxUnavailable: 0 - maxSurge: 2 - resources: - requests: - memory: 8Gi - cpu: 3 - limits: - memory: 8Gi - cpu: 3 - externalSecrets: - - name: gateway-secret - enabled: true - variableReferencable: true - description: Gateway Secret - # ExternalKeys with otk flag set to true for OTK-specific key usage - externalKeys: - - name: otk-dmz-tls-secret - enabled: true - alias: otk-dmz-key - keyUsageType: SSL - otk: true - otk: - enabled: true - initContainerImage: docker.io/caapim/otk-install:4.6.4 - type: dmz - internalAuthSecret: otk-internal-auth-secret - internalGatewayReference: as673366-gw-upgrade-0.apim.labs.broadcom.net - # InternalGatewayPort is used when the Internal gateway is external (not managed by operator) - # If not specified, defaults to 9443 or the gateway's graphmanDynamicSync port - internalGatewayPort: 8443 - # SyncIntervalSeconds determines how often DMZ and Internal gateways should update certificates - # Defaults to RuntimeSyncIntervalSeconds if not specified, or 10 seconds if neither is set - syncIntervalSeconds: 30 - # Reference to the TLS secret for DMZ key (used by OTK reconciliation) - dmzKeySecret: otk-dmz-tls-secret - database: - type: mysql - create: true - connectionName: OAuth - auth: - # A single secret containing all of the values defined here will be created - # if existingSecret is set the corresponding gateway, readOnly or admin will be omitted from the secret - # if no values are set, a secret will not be created or referenced and the deployment will be invalidated. - # existingSecret: otk-db-secret - gateway: - username: otk_user - password: otkUserPass - readOnly: - # username: readonly_user - username: readonly_user - password: readonly_userPass - admin: - # username: admin - username: admin - password: adminPass - properties: - minimumPoolSize: 3 - maximumPoolSize: 15 - sql: - databaseName: otk_db - #jdbcUrl: jdbc:mysql://:/ - jdbcUrl: jdbc:mysql://mysql.brcmlabs.com:3306/otk_db_init - jdbcDriverClass: com.mysql.cj.jdbc.Driver - connectionProperties: - c3p0.maxConnectionAge: "100" - c3p0.maxIdleTime: "1000" - manageSchema: true - databaseWaitTimeout: 60 - autoscaling: - enabled: false - bundle: - - type: restman - source: secret - name: restman-bootstrap-bundle - - type: graphman - source: secret - name: graphman-bootstrap-bundle - repositoryReferences: - - name: l7-gw-myframework - enabled: true - type: static - encryption: - existingSecret: graphman-encryption-secret - key: FRAMEWORK_ENCRYPTION_PASSPHRASE - - name: l7-gw-myapis - enabled: true - type: dynamic - encryption: - existingSecret: graphman-encryption-secret - key: APIS_ENCRYPTION_PASSPHRASE - - name: l7-gw-mysubscriptions - enabled: true - type: dynamic - encryption: - existingSecret: graphman-encryption-secret - key: SUBSCRIPTIONS_ENCRYPTION_PASSPHRASE - - name: local-reference-repository - enabled: true - type: dynamic - encryption: { } - - name: otk-customizations-dmz - enabled: true - type: dynamic - encryption: { } - bootstrap: - script: - enabled: true - initContainers: [] - hazelcast: - external: false - endpoint: hazelcast.example.com:5701 - management: - secretName: gateway-secret - #username: admin - #password: 7layer - # Management port requires a separate service... - service: - enabled: true - annotations: - projectcontour.io/upstream-protocol.tls: "8443" - type: LoadBalancer - ports: - - name: management - port: 9443 - targetPort: 9443 - protocol: TCP - restman: - enabled: false - graphman: - enabled: true - initContainerImage: docker.io/caapim/graphman-static-init:1.0.4 - dynamicSyncPort: 9443 - cluster: - #password: 7layer - hostname: gateway.brcmlabs.com - database: - enabled: false # this runs the gateway in dbbacked/ephemeral mode - # jdbcUrl: "jdbc:mysql://cluster1-haproxy.pxc.svc.cluster.local:3306/ssg" - # username: "gateway" - # password: "ACm8BDr3Rfk2Flx9V" - java: - jvmHeap: - calculate: true - percentage: 50 - default: 4g - extraArgs: - - -Dcom.l7tech.server.audit.message.saveToInternal=false - - -Dcom.l7tech.server.audit.admin.saveToInternal=false - - -Dcom.l7tech.server.audit.system.saveToInternal=false - - -Dcom.l7tech.server.audit.log.format=json - - -Djava.util.logging.config.file=/opt/SecureSpan/Gateway/node/default/etc/conf/log-override.properties - - -Dcom.l7tech.security.ssl.hostAllowWildcard=true - - -Dcom.l7tech.server.pkix.useDefaultTrustAnchors=true - #- -Dcom.l7tech.bootstrap.autoTrustSslKey=trustAnchor,TrustedFor.SSL,TrustedFor.SAML_ISSUER - listenPorts: - harden: true - custom: - enabled: false - ports: [] - cwp: - enabled: true - properties: - - name: io.httpsHostAllowWildcard - value: "true" - - name: log.levels - value: | - com.l7tech.level = CONFIG - com.l7tech.server.policy.variable.ServerVariables.level = SEVERE - com.l7tech.external.assertions.odata.server.producer.jdbc.GenerateSqlQuery.level = SEVERE - com.l7tech.server.policy.assertion.ServerSetVariableAssertion.level = SEVERE - com.l7tech.external.assertions.comparison.server.ServerComparisonAssertion.level = SEVERE - - name: audit.setDetailLevel.FINE - value: 152 7101 7103 9648 9645 7026 7027 4155 150 4716 4114 6306 4100 9655 150 151 11000 4104 - system: - properties: |- - # Default Gateway system properties - # Configuration properties for shared state extensions. - com.l7tech.server.extension.sharedKeyValueStoreProvider=embeddedhazelcast - com.l7tech.server.extension.sharedCounterProvider=ssgdb - com.l7tech.server.extension.sharedClusterInfoProvider=ssgdb - # By default, FIPS module will block an RSA modulus from being used for encryption if it has been used for - # signing, or visa-versa. Set true to disable this default behaviour and remain backwards compatible. - com.l7tech.org.bouncycastle.rsa.allow_multi_use=true - # Specifies the type of Trust Store (JKS/PKCS12) provided by AdoptOpenJDK that is used by Gateway. - # Must be set correctly when Gateway is running in FIPS mode. If not specified it will default to PKCS12. - javax.net.ssl.trustStoreType=jks - com.l7tech.server.clusterStaleNodeCleanupTimeoutSeconds=86400 - # Additional properties go here - service: - annotations: - projectcontour.io/upstream-protocol.tls: "8443" - type: ClusterIP - ports: - - name: https - port: 8443 - targetPort: 8443 - protocol: TCP - ingress: - enabled: true - ingressClassName: contour - annotations: {} - tls: - - hosts: - - otk-ssg-dmz.brcmlabs.com - secretName: brcmlabs - rules: - - host: otk-ssg-dmz.brcmlabs.com - # containerSecurityContext: - # runAsNonRoot: true - # runAsUser: 1000669998 - # capabilities: - # drop: - # - ALL - # allowPrivilegeEscalation: false - # podSecurityContext: - # runAsUser: 1000669998 - # runAsGroup: 1000669998 - - diff --git a/example/gateway/otk/otk-ssg-internal.yaml b/example/gateway/otk/otk-ssg-internal.yaml deleted file mode 100644 index 6cce28b6..00000000 --- a/example/gateway/otk/otk-ssg-internal.yaml +++ /dev/null @@ -1,232 +0,0 @@ -apiVersion: security.brcmlabs.com/v1 -kind: Gateway -metadata: - name: otk-ssg-internal -spec: - version: "11.1.3" - license: - accept: true - secretName: gateway-license - app: - replicas: 1 - image: docker.io/caapim/gateway:11.1.3 - imagePullPolicy: IfNotPresent - updateStrategy: - type: rollingUpdate - rollingUpdate: - maxUnavailable: 0 - maxSurge: 2 - resources: - requests: - memory: 8Gi - cpu: 3 - limits: - memory: 8Gi - cpu: 3 - # ExternalKeys with otk flag set to true for OTK-specific key usage - externalKeys: - - name: otk-internal-tls-secret - enabled: true - alias: otk-internal-key - keyUsageType: SSL - otk: true - otk: - enabled: true - initContainerImage: docker.io/caapim/otk-install:4.6.4 - type: internal - dmzGatewayReference: otk-ssg-dmz - # DmzGatewayPort is used when the DMZ gateway is external (not managed by operator) - # If not specified, defaults to 9443 or the gateway's graphmanDynamicSync port - dmzGatewayPort: 9443 - # SyncIntervalSeconds determines how often DMZ and Internal gateways should update certificates - # Defaults to RuntimeSyncIntervalSeconds if not specified, or 10 seconds if neither is set - syncIntervalSeconds: 30 - # Reference to the TLS secret for Internal key (used by OTK reconciliation) - internalKeySecret: otk-internal-tls-secret - database: - type: mysql - create: true - connectionName: OAuth - auth: - # A single secret containing all of the values defined here will be created - # if existingSecret is set the corresponding gateway, readOnly or admin will be omitted from the secret - # if no values are set, a secret will not be created or referenced and the deployment will be invalidated. - # existingSecret: otk-db-secret - gateway: - username: otk_user - password: otkUserPass - readOnly: - # username: readonly_user - username: readonly_user - password: readonly_userPass - admin: - # username: admin - username: admin - password: adminPass - properties: - minimumPoolSize: 3 - maximumPoolSize: 15 - sql: - databaseName: otk_db - #jdbcUrl: jdbc:mysql://:/ - jdbcUrl: jdbc:mysql://mysql.brcmlabs.com:3306/otk_db_init - jdbcDriverClass: com.mysql.cj.jdbc.Driver - connectionProperties: - c3p0.maxConnectionAge: "100" - c3p0.maxIdleTime: "1000" - manageSchema: true - databaseWaitTimeout: 60 - autoscaling: - enabled: false - bundle: - - type: restman - source: secret - name: restman-bootstrap-bundle - - type: graphman - source: secret - name: graphman-bootstrap-bundle - repositoryReferences: - - name: l7-gw-myframework - enabled: true - type: static - encryption: - existingSecret: graphman-encryption-secret - key: FRAMEWORK_ENCRYPTION_PASSPHRASE - - name: l7-gw-myapis - enabled: true - type: dynamic - encryption: - existingSecret: graphman-encryption-secret - key: APIS_ENCRYPTION_PASSPHRASE - - name: l7-gw-mysubscriptions - enabled: true - type: dynamic - encryption: - existingSecret: graphman-encryption-secret - key: SUBSCRIPTIONS_ENCRYPTION_PASSPHRASE - - name: local-reference-repository - enabled: true - type: dynamic - encryption: { } - - name: otk-customizations-internal - enabled: true - type: dynamic - encryption: { } - bootstrap: - script: - enabled: true - initContainers: [] - hazelcast: - external: false - endpoint: hazelcast.example.com:5701 - management: - secretName: gateway-secret - #username: admin - #password: 7layer - # Management port requires a separate service... - service: - enabled: false - #annotations: - # cloud.google.com/load-balancer-type: "Internal" - type: LoadBalancer - ports: - - name: management - port: 9443 - targetPort: 9443 - protocol: TCP - restman: - enabled: false - graphman: - enabled: true - initContainerImage: docker.io/caapim/graphman-static-init:1.0.4 - cluster: - #password: 7layer - hostname: gateway.brcmlabs.com - database: - enabled: false # this runs the gateway in dbbacked/ephemeral mode - # jdbcUrl: "jdbc:mysql://cluster1-haproxy.pxc.svc.cluster.local:3306/ssg" - # username: "gateway" - # password: "ACm8BDr3Rfk2Flx9V" - java: - jvmHeap: - calculate: true - percentage: 50 - default: 4g - extraArgs: - - -Dcom.l7tech.server.audit.message.saveToInternal=false - - -Dcom.l7tech.server.audit.admin.saveToInternal=false - - -Dcom.l7tech.server.audit.system.saveToInternal=false - - -Dcom.l7tech.server.audit.log.format=json - - -Djava.util.logging.config.file=/opt/SecureSpan/Gateway/node/default/etc/conf/log-override.properties - - -Dcom.l7tech.security.ssl.hostAllowWildcard=true - - -Dcom.l7tech.server.pkix.useDefaultTrustAnchors=true - #- -Dcom.l7tech.bootstrap.autoTrustSslKey=trustAnchor,TrustedFor.SSL,TrustedFor.SAML_ISSUER - listenPorts: - harden: true - custom: - enabled: false - ports: [] - cwp: - enabled: true - properties: - - name: io.httpsHostAllowWildcard - value: "true" - - name: log.levels - value: | - com.l7tech.level = CONFIG - com.l7tech.server.policy.variable.ServerVariables.level = SEVERE - com.l7tech.external.assertions.odata.server.producer.jdbc.GenerateSqlQuery.level = SEVERE - com.l7tech.server.policy.assertion.ServerSetVariableAssertion.level = SEVERE - com.l7tech.external.assertions.comparison.server.ServerComparisonAssertion.level = SEVERE - - name: audit.setDetailLevel.FINE - value: 152 7101 7103 9648 9645 7026 7027 4155 150 4716 4114 6306 4100 9655 150 151 11000 4104 - system: - properties: |- - # Default Gateway system properties - # Configuration properties for shared state extensions. - com.l7tech.server.extension.sharedKeyValueStoreProvider=embeddedhazelcast - com.l7tech.server.extension.sharedCounterProvider=ssgdb - com.l7tech.server.extension.sharedClusterInfoProvider=ssgdb - # By default, FIPS module will block an RSA modulus from being used for encryption if it has been used for - # signing, or visa-versa. Set true to disable this default behaviour and remain backwards compatible. - com.l7tech.org.bouncycastle.rsa.allow_multi_use=true - # Specifies the type of Trust Store (JKS/PKCS12) provided by AdoptOpenJDK that is used by Gateway. - # Must be set correctly when Gateway is running in FIPS mode. If not specified it will default to PKCS12. - javax.net.ssl.trustStoreType=jks - com.l7tech.server.clusterStaleNodeCleanupTimeoutSeconds=86400 - # Additional properties go here - service: - annotations: - projectcontour.io/upstream-protocol.tls: "8443,9443" - type: ClusterIP - ports: - - name: https - port: 8443 - targetPort: 8443 - protocol: TCP - - name: management - port: 9443 - targetPort: 9443 - protocol: TCP - ingress: - enabled: true - ingressClassName: contour - annotations: {} - tls: - - hosts: - - otk-ssg-internal.brcmlabs.com - secretName: brcmlabs - rules: - - host: otk-ssg-internal.brcmlabs.com - # containerSecurityContext: - # runAsNonRoot: true - # runAsUser: 1000669998 - # capabilities: - # drop: - # - ALL - # allowPrivilegeEscalation: false - # podSecurityContext: - # runAsUser: 1000669998 - # runAsGroup: 1000669998 - - diff --git a/example/otel-elastic/README.md b/example/otel-elastic/README.md index 9fa27911..9be8163e 100644 --- a/example/otel-elastic/README.md +++ b/example/otel-elastic/README.md @@ -163,7 +163,7 @@ spec: - name: OTEL_TRACES_EXPORTER value: otlp - name: OTEL_RESOURCE_ATTRIBUTES - value: service.version=11.1.3,deployment.environment=development + value: service.version=11.2.1,deployment.environment=development exporter: endpoint: http://localhost:4317 propagators: @@ -594,7 +594,7 @@ curl -XPOST "https://kibana.brcmlabs.com/api/saved_objects/_import?createNewCopi This step will deploy the Layer7 Operator and all of its resources in namespaced mode. This means that it will only manage Gateway and Repository Custom Resources in the Kubernetes Namespace that it's deployed in. ``` -kubectl apply -f https://github.com/CAAPIM/layer7-operator/releases/download/v1.2.2/bundle.yaml +kubectl apply -f https://github.com/CAAPIM/layer7-operator/releases/download/v1.3.0/bundle.yaml ``` #### Verify the Operator is up and running @@ -693,7 +693,7 @@ kubectl describe pods ssg-57d96567cb-n24g9 Init Containers: graphman-static-init-c1b58adb6d: Container ID: containerd://21924ae85d25437d3634ea5da1415c9bb58d678600f9fd67d4f0b0360857d7c5 - Image: docker.io/caapim/graphman-static-init:1.0.4 + Image: docker.io/caapim/graphman-static-init:1.0.5 Image ID: docker.io/caapim/graphman-static-init@sha256:8cb1035035b18fa9dc2c95e2b584c758e78909b3f615ee5f49dce166e8aae213 Port: Host Port: @@ -732,7 +732,7 @@ status: ready: true startTime: 2023-04-03 18:57:24 +0000 UTC host: gateway.brcmlabs.com - image: caapim/gateway:11.1.3 + image: caapim/gateway:11.2.1 ready: 1 replicas: 1 repositoryStatus: @@ -761,7 +761,7 @@ repositoryStatus: storageSecretName: l7-gw-mysubscriptions-repository type: dynamic state: Ready -version: 11.1.3 +version: 11.2.1 ``` #### Repository CR @@ -888,5 +888,5 @@ helm uninstall contour -n projectcontour ### Uninstall the Operator ``` -kubectl delete -f https://github.com/CAAPIM/layer7-operator/releases/download/v1.2.2/bundle.yaml +kubectl delete -f https://github.com/CAAPIM/layer7-operator/releases/download/v1.3.0/bundle.yaml ``` \ No newline at end of file diff --git a/example/otel-lgtm/readme.md b/example/otel-lgtm/readme.md index 312a6886..f43e2015 100644 --- a/example/otel-lgtm/readme.md +++ b/example/otel-lgtm/readme.md @@ -302,7 +302,7 @@ kubectl apply -f ./otel-lgtm/ This step will deploy the Layer7 Operator and all of its resources in namespaced mode. This means that it will only manage Gateway and Repository Custom Resources in the Kubernetes Namespace that it's deployed in. ``` -kubectl apply -f https://github.com/CAAPIM/layer7-operator/releases/download/v1.2.2/bundle.yaml +kubectl apply -f https://github.com/CAAPIM/layer7-operator/releases/download/v1.3.0/bundle.yaml ``` #### Open Telemetry Support @@ -405,7 +405,7 @@ kubectl describe pods ssg-57d96567cb-n24g9 Init Containers: graphman-static-init-c1b58adb6d: Container ID: containerd://21924ae85d25437d3634ea5da1415c9bb58d678600f9fd67d4f0b0360857d7c5 - Image: docker.io/caapim/graphman-static-init:1.0.4 + Image: docker.io/caapim/graphman-static-init:1.0.5 Image ID: docker.io/caapim/graphman-static-init@sha256:8cb1035035b18fa9dc2c95e2b584c758e78909b3f615ee5f49dce166e8aae213 Port: Host Port: @@ -444,7 +444,7 @@ status: ready: true startTime: 2023-04-03 18:57:24 +0000 UTC host: gateway.brcmlabs.com - image: caapim/gateway:11.1.3 + image: caapim/gateway:11.2.1 ready: 1 replicas: 1 repositoryStatus: @@ -473,7 +473,7 @@ repositoryStatus: storageSecretName: l7-gw-mysubscriptions-repository type: dynamic state: Ready -version: 11.1.3 +version: 11.2.1 ``` #### Repository CR diff --git a/example/otk/dual/README.md b/example/otk/dual/README.md index 7e42ea61..544bebf4 100644 --- a/example/otk/dual/README.md +++ b/example/otk/dual/README.md @@ -134,13 +134,13 @@ kind: Gateway metadata: name: otk-ssg-dmz spec: - version: "11.1.3" + version: "11.2.1" license: accept: true secretName: gateway-license app: replicas: 1 - image: docker.io/caapim/gateway:11.1.3 + image: docker.io/caapim/gateway:11.2.1 imagePullPolicy: IfNotPresent resources: requests: @@ -158,13 +158,12 @@ spec: otk: true otk: enabled: true - initContainerImage: docker.io/caapim/otk-install:4.6.4 + initContainerImage: docker.io/caapim/otk-install:4.7.0 type: dmz # Reference to Internal gateway (can be Gateway name or external hostname) internalGatewayReference: otk-ssg-internal - # InternalGatewayPort is used when the Internal gateway is external - # If not specified, defaults to 9443 or the gateway's graphmanDynamicSync port - internalGatewayPort: 9443 + # OTK override-bundle port (defaults to 8443). Use otk.port, not a separate peer-gateway port field. + port: 8443 # SyncIntervalSeconds determines how often certificates are synchronized # Defaults to RuntimeSyncIntervalSeconds if not specified, or 10 seconds if neither is set syncIntervalSeconds: 30 @@ -202,7 +201,7 @@ spec: secretName: gateway-secret graphman: enabled: true - initContainerImage: docker.io/caapim/graphman-static-init:1.0.4 + initContainerImage: docker.io/caapim/graphman-static-init:1.0.5 dynamicSyncPort: 9443 cluster: hostname: gateway.brcmlabs.com @@ -233,13 +232,13 @@ kind: Gateway metadata: name: otk-ssg-internal spec: - version: "11.1.3" + version: "11.2.1" license: accept: true secretName: gateway-license app: replicas: 1 - image: docker.io/caapim/gateway:11.1.3 + image: docker.io/caapim/gateway:11.2.1 imagePullPolicy: IfNotPresent resources: requests: @@ -257,13 +256,12 @@ spec: otk: true otk: enabled: true - initContainerImage: docker.io/caapim/otk-install:4.6.4 + initContainerImage: docker.io/caapim/otk-install:4.7.0 type: internal # Reference to DMZ gateway (can be Gateway name or external hostname) dmzGatewayReference: otk-ssg-dmz - # DmzGatewayPort is used when the DMZ gateway is external - # If not specified, defaults to 9443 or the gateway's graphmanDynamicSync port - dmzGatewayPort: 9443 + # OTK override-bundle port (defaults to 8443). Use otk.port, not a separate peer-gateway port field. + port: 8443 # SyncIntervalSeconds determines how often certificates are synchronized # Defaults to RuntimeSyncIntervalSeconds if not specified, or 10 seconds if neither is set syncIntervalSeconds: 30 @@ -301,7 +299,7 @@ spec: secretName: gateway-secret graphman: enabled: true - initContainerImage: docker.io/caapim/graphman-static-init:1.0.4 + initContainerImage: docker.io/caapim/graphman-static-init:1.0.5 cluster: hostname: gateway.brcmlabs.com service: @@ -332,10 +330,8 @@ spec: | `otk.internalAuthSecret` | Reference to secret with Internal gateway credentials | Yes (DMZ) | - | | `otk.dmzGatewayReference` | Reference to DMZ gateway (name or hostname) | Yes (Internal) | - | | `otk.internalGatewayReference` | Reference to Internal gateway (name or hostname) | Yes (DMZ) | - | -| `otk.dmzGatewayPort` | Port for DMZ gateway (when external) | No | `9443` or `graphmanDynamicSync` port | -| `otk.internalGatewayPort` | Port for Internal gateway (when external) | No | `9443` or `graphmanDynamicSync` port | | `otk.syncIntervalSeconds` | Certificate sync interval in seconds | No | `RuntimeSyncIntervalSeconds` or `10` | -| `otk.port` | OTK port (defaults to 8443) | No | `8443` | +| `otk.port` | OTK port for the OTK override bundle and install (single, internal, and dmz); not taken from `dmzGateway` / `internalGateway` | No | `8443` | ### External Keys Configuration @@ -412,8 +408,9 @@ If the DMZ gateway is external, configure the Internal gateway with: ```yaml otk: type: internal - dmzGatewayReference: external-dmz-gateway.example.com - dmzGatewayPort: 9443 # Port for Graphman API + port: 8443 + dmzGateway: + url: https://external-dmz-gateway.example.com:8443 dmzAuthSecret: otk-dmz-auth-secret ``` @@ -424,8 +421,9 @@ If the Internal gateway is external, configure the DMZ gateway with: ```yaml otk: type: dmz - internalGatewayReference: external-internal-gateway.example.com - internalGatewayPort: 9443 # Port for Graphman API + port: 8443 + internalGateway: + url: https://external-internal-gateway.example.com:8443 internalAuthSecret: otk-internal-auth-secret ``` @@ -433,7 +431,7 @@ otk: - Graphman API must be enabled and accessible - Authentication credentials must be provided via auth secrets -- The correct port must be specified if different from default (9443) +- Put the HTTPS URL (including port) for the peer gateway on `dmzGateway.url` or `internalGateway.url`; set `otk.port` for the OTK override-bundle port (defaults to 8443) - The gateway must be reachable from the operator's network ## Troubleshooting diff --git a/example/otk/single/README.md b/example/otk/single/README.md index 1805ab9c..579cd0c7 100644 --- a/example/otk/single/README.md +++ b/example/otk/single/README.md @@ -80,7 +80,7 @@ ssg-7b7694d995-qptbj 1/1 Running 0 This step will deploy the Layer7 Operator and all of its resources in namespaced mode. This means that it will only manage Gateway and Repository Custom Resources in the Kubernetes Namespace that it's deployed in. ``` -kubectl apply -f https://github.com/CAAPIM/layer7-operator/releases/download/v1.2.2/bundle.yaml +kubectl apply -f https://github.com/CAAPIM/layer7-operator/releases/download/v1.3.0/bundle.yaml ``` ##### Verify the Operator is up and running @@ -327,7 +327,7 @@ status: ready: true startTime: 2023-04-03 18:57:24 +0000 UTC host: gateway.brcmlabs.com - image: caapim/gateway:11.1.3 + image: caapim/gateway:11.2.1 ready: 1 replicas: 1 repositoryStatus: @@ -356,7 +356,7 @@ repositoryStatus: storageSecretName: l7-gw-mysubscriptions-repository type: dynamic state: Ready -version: 11.1.3 +version: 11.2.1 ``` ### Create Access Token @@ -472,5 +472,5 @@ kubectl delete -k ./example/repositories/ ### Uninstall the Operator ``` -kubectl delete -f https://github.com/CAAPIM/layer7-operator/releases/download/v1.2.2/bundle.yaml +kubectl delete -f https://github.com/CAAPIM/layer7-operator/releases/download/v1.3.0/bundle.yaml ``` \ No newline at end of file diff --git a/example/portal-integration/readme.md b/example/portal-integration/readme.md index fcb03f43..d958a986 100644 --- a/example/portal-integration/readme.md +++ b/example/portal-integration/readme.md @@ -201,9 +201,9 @@ Enrollment key retrieved 1. You have not configured your local hosts file. Please see step 6 in [getting-started](#getting-started) ### Deploy the Layer7 Operator -This integration example uses v1.2.2 of the Layer7 Operator +This integration example uses v1.3.0 of the Layer7 Operator ``` -kubectl apply -f https://github.com/CAAPIM/layer7-operator/releases/download/v1.2.2/bundle.yaml -n ${NAMESPACE} +kubectl apply -f https://github.com/CAAPIM/layer7-operator/releases/download/v1.3.0/bundle.yaml -n ${NAMESPACE} kubectl wait --for=condition=ready --timeout=600s pod -l app.kubernetes.io/name=layer7-operator ``` @@ -223,7 +223,7 @@ kubectl get l7statestores ``` ### Create a Gateway -The [Gateway Custom Resource](../gateway/portal-gateway.yaml) is configured to use Redis and Gateway version 11.1.3 +The [Gateway Custom Resource](../gateway/portal-gateway.yaml) is configured to use Redis and Gateway version 11.2.1 Make sure that you've accepted the license in [portal-gateway.yaml](../gateway/portal-gateway.yaml) and placed a gateway v11 license in [example/base/resources/secrets/license/](../base/resources/secrets/license/) called license.xml. ``` @@ -640,7 +640,7 @@ Repository Status: State Store Reference: portal-state-store Storage Secret Name: _ Type: dynamic - Version: 11.1.3 + Version: 11.2.1 Events: ``` #### View the L7Api @@ -828,5 +828,5 @@ helm del portal kubectl delete statefulset portal-mysql kubectl delete pvc data-portal-mysql-0 data-rabbitmq-0 helm del redis -kubectl delete -f https://github.com/CAAPIM/layer7-operator/releases/download/v1.2.2/bundle.yaml -n ${NAMESPACE} +kubectl delete -f https://github.com/CAAPIM/layer7-operator/releases/download/v1.3.0/bundle.yaml -n ${NAMESPACE} ``` \ No newline at end of file diff --git a/go.mod b/go.mod index 2cf7da46..bc6c5215 100644 --- a/go.mod +++ b/go.mod @@ -1,53 +1,58 @@ module github.com/caapim/layer7-operator -go 1.24.13 +go 1.26.1 require ( github.com/Khan/genqlient v0.8.1 github.com/go-co-op/gocron v1.37.0 - github.com/go-git/go-git/v5 v5.16.3 + github.com/go-git/go-git/v5 v5.18.0 github.com/go-logr/logr v1.4.3 - github.com/onsi/ginkgo/v2 v2.25.1 - github.com/onsi/gomega v1.38.2 + github.com/onsi/ginkgo/v2 v2.28.1 + github.com/onsi/gomega v1.39.1 github.com/openshift/api v0.0.0-20241120064718-caf97963ed30 github.com/redis/go-redis/v9 v9.17.0 github.com/valyala/quicktemplate v1.8.0 - go.opentelemetry.io/otel v1.33.0 - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 - go.opentelemetry.io/otel/metric v1.33.0 - go.opentelemetry.io/otel/sdk v1.33.0 - go.opentelemetry.io/otel/sdk/metric v1.32.0 - google.golang.org/grpc v1.68.1 + go.opentelemetry.io/otel v1.43.0 + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.43.0 + go.opentelemetry.io/otel/metric v1.43.0 + go.opentelemetry.io/otel/sdk v1.43.0 + go.opentelemetry.io/otel/sdk/metric v1.43.0 + google.golang.org/grpc v1.80.0 gopkg.in/yaml.v3 v3.0.1 - k8s.io/api v0.33.5 - k8s.io/apimachinery v0.33.5 - k8s.io/client-go v0.33.5 - sigs.k8s.io/controller-runtime v0.21.0 + k8s.io/api v0.35.0 + k8s.io/apimachinery v0.35.0 + k8s.io/client-go v0.35.0 + sigs.k8s.io/controller-runtime v0.23.3 ) require ( - cel.dev/expr v0.19.1 // indirect + cel.dev/expr v0.25.1 // indirect dario.cat/mergo v1.0.2 // indirect github.com/Masterminds/semver/v3 v3.4.0 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect github.com/ProtonMail/go-crypto v1.3.0 // indirect + github.com/agnivade/levenshtein v1.2.1 // indirect + github.com/alexflint/go-arg v1.5.1 // indirect + github.com/alexflint/go-scalar v1.2.0 // indirect github.com/antlr4-go/antlr/v4 v4.13.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect + github.com/bmatcuk/doublestar/v4 v4.6.1 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/cloudflare/circl v1.6.1 // indirect + github.com/cloudflare/circl v1.6.3 // indirect github.com/cyphar/filepath-securejoin v0.6.1 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/emicklei/go-restful/v3 v3.12.1 // indirect + github.com/emicklei/go-restful/v3 v3.12.2 // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/evanphx/json-patch/v5 v5.9.11 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.8.0 // indirect - github.com/fxamacker/cbor/v2 v2.7.0 // indirect + github.com/fsnotify/fsnotify v1.9.0 // indirect + github.com/fxamacker/cbor/v2 v2.9.0 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect - github.com/go-git/go-billy/v5 v5.6.2 // indirect + github.com/go-git/go-billy/v5 v5.8.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-logr/zapr v1.3.0 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect @@ -57,12 +62,12 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect github.com/google/btree v1.1.3 // indirect - github.com/google/cel-go v0.23.2 // indirect - github.com/google/gnostic-models v0.6.9 // indirect + github.com/google/cel-go v0.26.0 // indirect + github.com/google/gnostic-models v0.7.0 // indirect github.com/google/go-cmp v0.7.0 // indirect - github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 // indirect + github.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/josharian/intern v1.0.0 // indirect @@ -71,61 +76,65 @@ require ( github.com/klauspost/cpuid/v2 v2.3.0 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/pjbgf/sha1cd v0.5.0 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_golang v1.22.0 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.62.0 // indirect - github.com/prometheus/procfs v0.15.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/prometheus/client_golang v1.23.2 // indirect + github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/common v0.66.1 // indirect + github.com/prometheus/procfs v0.16.1 // indirect github.com/robfig/cron/v3 v3.0.1 // indirect github.com/sergi/go-diff v1.4.0 // indirect github.com/skeema/knownhosts v1.3.2 // indirect - github.com/spf13/cobra v1.8.1 // indirect - github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/cobra v1.10.0 // indirect + github.com/spf13/pflag v1.0.9 // indirect github.com/stoewer/go-strcase v1.3.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/vektah/gqlparser/v2 v2.5.31 // indirect github.com/x448/float16 v0.8.4 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect - go.opentelemetry.io/auto/sdk v1.1.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.33.0 // indirect - go.opentelemetry.io/otel/trace v1.33.0 // indirect - go.opentelemetry.io/proto/otlp v1.4.0 // indirect + go.opentelemetry.io/auto/sdk v1.2.1 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 // indirect + go.opentelemetry.io/otel/trace v1.43.0 // indirect + go.opentelemetry.io/proto/otlp v1.10.0 // indirect go.uber.org/atomic v1.11.0 // indirect - go.uber.org/automaxprocs v1.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v2 v2.4.3 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/crypto v0.45.0 // indirect + golang.org/x/crypto v0.49.0 // indirect golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f // indirect - golang.org/x/net v0.47.0 // indirect - golang.org/x/oauth2 v0.27.0 // indirect - golang.org/x/sync v0.18.0 // indirect - golang.org/x/sys v0.38.0 // indirect - golang.org/x/term v0.37.0 // indirect - golang.org/x/text v0.31.0 // indirect + golang.org/x/mod v0.33.0 // indirect + golang.org/x/net v0.52.0 // indirect + golang.org/x/oauth2 v0.35.0 // indirect + golang.org/x/sync v0.20.0 // indirect + golang.org/x/sys v0.42.0 // indirect + golang.org/x/term v0.41.0 // indirect + golang.org/x/text v0.35.0 // indirect golang.org/x/time v0.9.0 // indirect - golang.org/x/tools v0.38.0 // indirect + golang.org/x/tools v0.42.0 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20241209162323-e6fa225c2576 // indirect - google.golang.org/protobuf v1.36.7 // indirect - gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9 // indirect + google.golang.org/protobuf v1.36.11 // indirect + gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect - k8s.io/apiextensions-apiserver v0.33.0 // indirect - k8s.io/apiserver v0.33.0 // indirect - k8s.io/component-base v0.33.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + k8s.io/apiextensions-apiserver v0.35.0 // indirect + k8s.io/apiserver v0.35.0 // indirect + k8s.io/component-base v0.35.0 // indirect k8s.io/klog/v2 v2.130.1 // indirect - k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff // indirect - k8s.io/utils v0.0.0-20241104163129-6fe5fd82f078 // indirect + k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912 // indirect + k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 // indirect sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2 // indirect - sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect + sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect sigs.k8s.io/randfill v1.0.0 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.6.0 // indirect - sigs.k8s.io/yaml v1.4.0 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.3.2-0.20260122202528-d9cc6641c482 // indirect + sigs.k8s.io/yaml v1.6.0 // indirect ) + +tool github.com/Khan/genqlient diff --git a/go.sum b/go.sum index 6fadaed4..35e67d56 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -cel.dev/expr v0.19.1 h1:NciYrtDRIR0lNCnH1LFJegdjspNx9fI59O7TWcua/W4= -cel.dev/expr v0.19.1/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= +cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= +cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8= dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA= github.com/Khan/genqlient v0.8.1 h1:wtOCc8N9rNynRLXN3k3CnfzheCUNKBcvXmVv5zt6WCs= @@ -11,29 +11,43 @@ github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERo github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/ProtonMail/go-crypto v1.3.0 h1:ILq8+Sf5If5DCpHQp4PbZdS1J7HDFRXz/+xKBiRGFrw= github.com/ProtonMail/go-crypto v1.3.0/go.mod h1:9whxjD8Rbs29b4XWbB8irEcE8KHMqaR2e7GWU1R+/PE= +github.com/agnivade/levenshtein v1.2.1 h1:EHBY3UOn1gwdy/VbFwgo4cxecRznFk7fKWN1KOX7eoM= +github.com/agnivade/levenshtein v1.2.1/go.mod h1:QVVI16kDrtSuwcpd0p1+xMC6Z/VfhtCyDIjcwga4/DU= +github.com/alexflint/go-arg v1.5.1 h1:nBuWUCpuRy0snAG+uIJ6N0UvYxpxA0/ghA/AaHxlT8Y= +github.com/alexflint/go-arg v1.5.1/go.mod h1:A7vTJzvjoaSTypg4biM5uYNTkJ27SkNTArtYXnlqVO8= +github.com/alexflint/go-scalar v1.2.0 h1:WR7JPKkeNpnYIOfHRa7ivM21aWAdHD0gEWHCx+WQBRw= +github.com/alexflint/go-scalar v1.2.0/go.mod h1:LoFvNMqS1CPrMVltza4LvnGKhaSpc3oyLEBUZVhhS2o= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI= github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g= +github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig+0+Ap1h4unLjW6YQJpKZVmUzxsD4E/Q= +github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= +github.com/bmatcuk/doublestar/v4 v4.6.1 h1:FH9SifrbvJhnlQpztAx++wlkk70QBf0iBWDwNy7PA4I= +github.com/bmatcuk/doublestar/v4 v4.6.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= +github.com/bradleyjkemp/cupaloy/v2 v2.6.0 h1:knToPYa2xtfg42U3I6punFEjaGFKWQRXJwj0JTv4mTs= +github.com/bradleyjkemp/cupaloy/v2 v2.6.0/go.mod h1:bm7JXdkRd4BHJk9HpwqAI8BoAY1lps46Enkdqw6aRX0= github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0= -github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= -github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cloudflare/circl v1.6.3 h1:9GPOhQGF9MCYUeXyMYlqTR6a5gTrgR/fBLXvUgtVcg8= +github.com/cloudflare/circl v1.6.3/go.mod h1:2eXP6Qfat4O/Yhh8BznvKnJ+uzEoTQ6jVKJRn81BiS4= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyphar/filepath-securejoin v0.6.1 h1:5CeZ1jPXEiYt3+Z6zqprSAgSWiggmpVyciv8syjIpVE= github.com/cyphar/filepath-securejoin v0.6.1/go.mod h1:A8hd4EnAeyujCJRrICiOWqjS1AX0a9kM5XL+NwKoYSc= @@ -43,10 +57,12 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/dgryski/trifles v0.0.0-20230903005119-f50d829f2e54 h1:SG7nF6SRlWhcT7cNTs5R6Hk4V2lcmLz2NsG2VnInyNo= +github.com/dgryski/trifles v0.0.0-20230903005119-f50d829f2e54/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA= github.com/elazarl/goproxy v1.7.2 h1:Y2o6urb7Eule09PjlhQRGNsqRfPmYI3KKQLFpCAV3+o= github.com/elazarl/goproxy v1.7.2/go.mod h1:82vkLNir0ALaW14Rc399OTTjyNREgmdL2cVoIbS6XaE= -github.com/emicklei/go-restful/v3 v3.12.1 h1:PJMDIM/ak7btuL8Ex0iYET9hxM3CI2sjZtzpL63nKAU= -github.com/emicklei/go-restful/v3 v3.12.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.12.2 h1:DhwDP0vY3k8ZzE0RunuJy8GhNpPL6zqLkDf9B/a0/xU= +github.com/emicklei/go-restful/v3 v3.12.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/evanphx/json-patch v0.5.2 h1:xVCHIVMUu1wtM/VkR9jVZ45N3FhZfYMMYGorLCR8P3k= @@ -55,22 +71,28 @@ github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjT github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= -github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= -github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= -github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= +github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= +github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= +github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= +github.com/gkampitakis/ciinfo v0.3.2 h1:JcuOPk8ZU7nZQjdUhctuhQofk7BGHuIy0c9Ez8BNhXs= +github.com/gkampitakis/ciinfo v0.3.2/go.mod h1:1NIwaOcFChN4fa/B0hEBdAb6npDlFL8Bwx4dfRLRqAo= +github.com/gkampitakis/go-diff v1.3.2 h1:Qyn0J9XJSDTgnsgHRdz9Zp24RaJeKMUHg2+PDZZdC4M= +github.com/gkampitakis/go-diff v1.3.2/go.mod h1:LLgOrpqleQe26cte8s36HTWcTmMEur6OPYerdAAS9tk= +github.com/gkampitakis/go-snaps v0.5.15 h1:amyJrvM1D33cPHwVrjo9jQxX8g/7E2wYdZ+01KS3zGE= +github.com/gkampitakis/go-snaps v0.5.15/go.mod h1:HNpx/9GoKisdhw9AFOBT1N7DBs9DiHo/hGheFGBZ+mc= github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU= github.com/go-co-op/gocron v1.37.0 h1:ZYDJGtQ4OMhTLKOKMIch+/CY70Brbb1dGdooLEhh7b0= github.com/go-co-op/gocron v1.37.0/go.mod h1:3L/n6BkO7ABj+TrfSVXLRzsP26zmikL4ISkLQ0O8iNY= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= -github.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UNbRM= -github.com/go-git/go-billy/v5 v5.6.2/go.mod h1:rcFC2rAsp/erv7CMz9GczHcuD0D32fWzH+MJAU+jaUU= +github.com/go-git/go-billy/v5 v5.8.0 h1:I8hjc3LbBlXTtVuFNJuwYuMiHvQJDq1AT6u4DwDzZG0= +github.com/go-git/go-billy/v5 v5.8.0/go.mod h1:RpvI/rw4Vr5QA+Z60c6d6LXH0rYJo0uD5SqfmrrheCY= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= -github.com/go-git/go-git/v5 v5.16.3 h1:Z8BtvxZ09bYm/yYNgPKCzgWtaRqDTgIKRgIRHBfU6Z8= -github.com/go-git/go-git/v5 v5.16.3/go.mod h1:4Ge4alE/5gPs30F2H1esi2gPd69R0C39lolkucHBOp8= +github.com/go-git/go-git/v5 v5.18.0 h1:O831KI+0PR51hM2kep6T8k+w0/LIAD490gvqMCvL5hM= +github.com/go-git/go-git/v5 v5.18.0/go.mod h1:pW/VmeqkanRFqR6AljLcs7EA7FbZaN5MQqO7oZADXpo= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= @@ -86,6 +108,8 @@ github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+Gr github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= +github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= +github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= @@ -94,29 +118,32 @@ github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= -github.com/google/cel-go v0.23.2 h1:UdEe3CvQh3Nv+E/j9r1Y//WO0K0cSyD7/y0bzyLIMI4= -github.com/google/cel-go v0.23.2/go.mod h1:52Pb6QsDbC5kvgxvZhiL9QX1oZEkcUF/ZqaPx1J5Wwo= -github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw= -github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/cel-go v0.26.0 h1:DPGjXackMpJWH680oGY4lZhYjIameYmR+/6RBdDGmaI= +github.com/google/cel-go v0.26.0/go.mod h1:A9O8OU9rdvrK5MQyrqfIxo1a0u4g3sF8KB6PUIaryMM= +github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo= +github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J0b1vyeLSOYI8bm5wbJM/8yDe8= -github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= +github.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83 h1:z2ogiKUYzX5Is6zr/vP9vJGqPwcdqsWjOt+V8J7+bTc= +github.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83/go.mod h1:MxpfABSjhmINe3F1It9d+8exIHFvUqtLIRCdOGNXqiI= github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0 h1:TmHmbvxPmaegwhDubVz0lICL0J5Ka2vwTzhoePEXsGE= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0/go.mod h1:qztMSjm835F2bXf+5HKAPIS5qsmQDqZna/PgVt4rWtI= +github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5THxAzdVpqr6/geYxZytqFMBCOtn/ujyeo= +github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0/go.mod h1:JfhWUomR1baixubs02l85lZYYOm7LV6om4ceouMv45c= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/joshdk/go-junit v1.0.0 h1:S86cUKIdwBHWwA6xCmFlf3RTLfVXYQfvanM5Uh+K6GE= +github.com/joshdk/go-junit v1.0.0/go.mod h1:TiiV0PqkaNfFXjEiyjWM3XXrhVyCa1K4Zfga6W52ung= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kevinburke/ssh_config v1.4.0 h1:6xxtP5bZ2E4NF5tuQulISpTO2z8XbtH8cg1PWkxoFkQ= @@ -140,17 +167,22 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0 github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/maruel/natural v1.1.1 h1:Hja7XhhmvEFhcByqDoHz9QZbkWey+COd9xWfCfn1ioo= +github.com/maruel/natural v1.1.1/go.mod h1:v+Rfd79xlw1AgVBjbO0BEQmptqb5HvL/k9GRHB7ZKEg= +github.com/mfridman/tparse v0.18.0 h1:wh6dzOKaIwkUGyKgOntDW4liXSo37qg5AXbIhkMV3vE= +github.com/mfridman/tparse v0.18.0/go.mod h1:gEvqZTuCgEhPbYk/2lS3Kcxg1GmTxxU7kTC8DvP0i/A= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/onsi/ginkgo/v2 v2.25.1 h1:Fwp6crTREKM+oA6Cz4MsO8RhKQzs2/gOIVOUscMAfZY= -github.com/onsi/ginkgo/v2 v2.25.1/go.mod h1:ppTWQ1dh9KM/F1XgpeRqelR+zHVwV81DGRSDnFxK7Sk= -github.com/onsi/gomega v1.38.2 h1:eZCjf2xjZAqe+LeWvKb5weQ+NcPwX84kqJ0cZNxok2A= -github.com/onsi/gomega v1.38.2/go.mod h1:W2MJcYxRGV63b418Ai34Ud0hEdTVXq9NW9+Sx6uXf3k= +github.com/onsi/ginkgo/v2 v2.28.1 h1:S4hj+HbZp40fNKuLUQOYLDgZLwNUVn19N3Atb98NCyI= +github.com/onsi/ginkgo/v2 v2.28.1/go.mod h1:CLtbVInNckU3/+gC8LzkGUb9oF+e8W8TdUsxPwvdOgE= +github.com/onsi/gomega v1.39.1 h1:1IJLAad4zjPn2PsnhH70V4DKRFlrCzGBNrNaru+Vf28= +github.com/onsi/gomega v1.39.1/go.mod h1:hL6yVALoTOxeWudERyfppUcZXjMwIMLnuSfruD2lcfg= github.com/openshift/api v0.0.0-20241120064718-caf97963ed30 h1:LrNXjO675I1FvPYE4P3UOFNlC0X37iKUUhgwk+huYnc= github.com/openshift/api v0.0.0-20241120064718-caf97963ed30/go.mod h1:Shkl4HanLwDiiBzakv+con/aMGnVE2MAGvoKp5oyYUo= github.com/pjbgf/sha1cd v0.5.0 h1:a+UkboSi1znleCDUNT3M5YxjOnN1fz2FhN48FlwCxs0= @@ -160,16 +192,14 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= -github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= -github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= -github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= -github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= -github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= -github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= +github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= +github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9ZoGs= +github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA= +github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= +github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= github.com/redis/go-redis/v9 v9.17.0 h1:K6E+ZlYN95KSMmZeEQPbU/c++wfmEvfFB17yEAq/VhM= github.com/redis/go-redis/v9 v9.17.0/go.mod h1:u410H11HMLoB+TP67dz8rL9s6QW2j76l0//kSOd3370= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= @@ -184,10 +214,11 @@ github.com/sergi/go-diff v1.4.0/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepq github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/skeema/knownhosts v1.3.2 h1:EDL9mgf4NzwMXCTfaxSD/o/a5fxDw/xL9nkU28JjdBg= github.com/skeema/knownhosts v1.3.2/go.mod h1:bEg3iQAuw+jyiw+484wwFJoKSLwcfd7fqRy+N0QTiow= -github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= -github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/cobra v1.10.0 h1:a5/WeUlSDCvV5a45ljW2ZFtV0bTDpkfSAj3uqB6Sc+0= +github.com/spf13/cobra v1.10.0/go.mod h1:9dhySC7dnTtEiqzmqfkLj47BslqLCUPMXjG2lj/NgoE= +github.com/spf13/pflag v1.0.8/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY= +github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs= github.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -204,6 +235,14 @@ github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= +github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= +github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/quicktemplate v1.8.0 h1:zU0tjbIqTRgKQzFY1L42zq0qR3eh4WoQQdIdqCysW5k= @@ -216,65 +255,67 @@ github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= -go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 h1:yd02MEjBdJkG3uabWP9apV+OuWRIXGDuJEUJbOHmCFU= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0/go.mod h1:umTcuxiv1n/s/S6/c2AT/g2CQ7u5C59sHDNmfSwgz7Q= -go.opentelemetry.io/otel v1.33.0 h1:/FerN9bax5LoK51X/sI0SVYrjSE0/yUL7DpxW4K3FWw= -go.opentelemetry.io/otel v1.33.0/go.mod h1:SUUkR6csvUQl+yjReHu5uM3EtVV7MBm5FHKRlNx4I8I= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 h1:j7ZSD+5yn+lo3sGV69nW04rRR0jhYnBwjuX3r0HvnK0= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0/go.mod h1:WXbYJTUaZXAbYd8lbgGuvih0yuCfOFC5RJoYnoLcGz8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0 h1:Vh5HayB/0HHfOQA7Ctx69E/Y/DcQSMPpKANYVMQ7fBA= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0/go.mod h1:cpgtDBaqD/6ok/UG0jT15/uKjAY8mRA53diogHBg3UI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.33.0 h1:5pojmb1U1AogINhN3SurB+zm/nIcusopeBNp42f45QM= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.33.0/go.mod h1:57gTHJSE5S1tqg+EKsLPlTWhpHMsWlVmer+LA926XiA= -go.opentelemetry.io/otel/metric v1.33.0 h1:r+JOocAyeRVXD8lZpjdQjzMadVZp2M4WmQ+5WtEnklQ= -go.opentelemetry.io/otel/metric v1.33.0/go.mod h1:L9+Fyctbp6HFTddIxClbQkjtubW6O9QS3Ann/M82u6M= -go.opentelemetry.io/otel/sdk v1.33.0 h1:iax7M131HuAm9QkZotNHEfstof92xM+N8sr3uHXc2IM= -go.opentelemetry.io/otel/sdk v1.33.0/go.mod h1:A1Q5oi7/9XaMlIWzPSxLRWOI8nG3FnzHJNbiENQuihM= -go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= -go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= -go.opentelemetry.io/otel/trace v1.33.0 h1:cCJuF7LRjUFso9LPnEAHJDB2pqzp+hbO8eu1qqW2d/s= -go.opentelemetry.io/otel/trace v1.33.0/go.mod h1:uIcdVUZMpTAmz0tI1z04GoVSezK37CbGV4fr1f2nBck= -go.opentelemetry.io/proto/otlp v1.4.0 h1:TA9WRvW6zMwP+Ssb6fLoUIuirti1gGbP28GcKG1jgeg= -go.opentelemetry.io/proto/otlp v1.4.0/go.mod h1:PPBWZIP98o2ElSqI35IHfu7hIhSwvc5N38Jw8pXuGFY= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= +go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= +go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.43.0 h1:8UQVDcZxOJLtX6gxtDt3vY2WTgvZqMQRzjsqiIHQdkc= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.43.0/go.mod h1:2lmweYCiHYpEjQ/lSJBYhj9jP1zvCvQW4BqL9dnT7FQ= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 h1:tgJ0uaNS4c98WRNUEx5U3aDlrDOI5Rs+1Vifcw4DJ8U= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0/go.mod h1:U7HYyW0zt/a9x5J1Kjs+r1f/d4ZHnYFclhYY2+YbeoE= +go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= +go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= +go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= +go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= +go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= +go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= +go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= +go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= +go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g= +go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= -go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= +go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= -golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= +golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4= +golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f h1:XdNn9LlyWAhLVp6P/i8QYBW+hlyhrhei9uErw2B5GJo= golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f/go.mod h1:D5SMRVC3C2/4+F/DB1wZsLRnSNimn2Sp/NPsCrsv8ak= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.33.0 h1:tHFzIWbBifEmbwtGz65eaWyGiGZatSrT9prnU8DbVL8= +golang.org/x/mod v0.33.0/go.mod h1:swjeQEj+6r7fODbD2cqrnje9PnziFuw4bmLbBZFrQ5w= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= -golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= -golang.org/x/oauth2 v0.27.0 h1:da9Vo7/tDv5RH/7nZDz1eMGS/q1Vv1N/7FCrBhI9I3M= -golang.org/x/oauth2 v0.27.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= +golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= +golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= +golang.org/x/oauth2 v0.35.0 h1:Mv2mzuHuZuY2+bkyWXIHMfhNdJAdwW3FuWeCPYN5GVQ= +golang.org/x/oauth2 v0.35.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= -golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -284,83 +325,85 @@ golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= -golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= +golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= -golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= +golang.org/x/term v0.41.0 h1:QCgPso/Q3RTJx2Th4bDLqML4W6iJiaXFq2/ftQF13YU= +golang.org/x/term v0.41.0/go.mod h1:3pfBgksrReYfZ5lvYM0kSO0LIkAl4Yl2bXOkKP7Ec2A= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= -golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= +golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= +golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY= golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= -golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= +golang.org/x/tools v0.42.0 h1:uNgphsn75Tdz5Ji2q36v/nsFSfR/9BRFvqhGBaJGd5k= +golang.org/x/tools v0.42.0/go.mod h1:Ma6lCIwGZvHK6XtgbswSoWroEkhugApmsXyrUmBhfr0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= -google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576 h1:CkkIfIt50+lT6NHAVoRYEyAvQGFM7xEwXUUywFvEb3Q= -google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576/go.mod h1:1R3kvZ1dtP3+4p4d3G8uJ8rFk/fWlScl38vanWACI08= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241209162323-e6fa225c2576 h1:8ZmaLZE4XWrtU3MyClkYqqtl6Oegr3235h7jxsDyqCY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241209162323-e6fa225c2576/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU= -google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= -google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= -google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= -google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= +gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= +google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9 h1:VPWxll4HlMw1Vs/qXtN7BvhZqsS9cdAittCNvVENElA= +google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9/go.mod h1:7QBABkRtR8z+TEnmXTqIqwJLlzrZKVfAUm7tY3yGv0M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9 h1:m8qni9SQFH0tJc1X0vmnpw/0t+AImlSvp30sEupozUg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.80.0 h1:Xr6m2WmWZLETvUNvIUmeD5OAagMw3FiKmMlTdViWsHM= +google.golang.org/grpc v1.80.0/go.mod h1:ho/dLnxwi3EDJA4Zghp7k2Ec1+c2jqup0bFkw07bwF4= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= -gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= +gopkg.in/evanphx/json-patch.v4 v4.13.0 h1:czT3CmqEaQ1aanPc5SdlgQrrEIb8w/wwCvWWnfEbYzo= +gopkg.in/evanphx/json-patch.v4 v4.13.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/api v0.33.5 h1:YR+uhYj05jdRpcksv8kjSliW+v9hwXxn6Cv10aR8Juw= -k8s.io/api v0.33.5/go.mod h1:2gzShdwXKT5yPGiqrTrn/U/nLZ7ZyT4WuAj3XGDVgVs= -k8s.io/apiextensions-apiserver v0.33.0 h1:d2qpYL7Mngbsc1taA4IjJPRJ9ilnsXIrndH+r9IimOs= -k8s.io/apiextensions-apiserver v0.33.0/go.mod h1:VeJ8u9dEEN+tbETo+lFkwaaZPg6uFKLGj5vyNEwwSzc= -k8s.io/apimachinery v0.33.5 h1:NiT64hln4TQXeYR18/ES39OrNsjGz8NguxsBgp+6QIo= -k8s.io/apimachinery v0.33.5/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM= -k8s.io/apiserver v0.33.0 h1:QqcM6c+qEEjkOODHppFXRiw/cE2zP85704YrQ9YaBbc= -k8s.io/apiserver v0.33.0/go.mod h1:EixYOit0YTxt8zrO2kBU7ixAtxFce9gKGq367nFmqI8= -k8s.io/client-go v0.33.5 h1:I8BdmQGxInpkMEnJvV6iG7dqzP3JRlpZZlib3OMFc3o= -k8s.io/client-go v0.33.5/go.mod h1:W8PQP4MxbM4ypgagVE65mUUqK1/ByQkSALF9tzuQ6u0= -k8s.io/component-base v0.33.0 h1:Ot4PyJI+0JAD9covDhwLp9UNkUja209OzsJ4FzScBNk= -k8s.io/component-base v0.33.0/go.mod h1:aXYZLbw3kihdkOPMDhWbjGCO6sg+luw554KP51t8qCU= +k8s.io/api v0.35.0 h1:iBAU5LTyBI9vw3L5glmat1njFK34srdLmktWwLTprlY= +k8s.io/api v0.35.0/go.mod h1:AQ0SNTzm4ZAczM03QH42c7l3bih1TbAXYo0DkF8ktnA= +k8s.io/apiextensions-apiserver v0.35.0 h1:3xHk2rTOdWXXJM+RDQZJvdx0yEOgC0FgQ1PlJatA5T4= +k8s.io/apiextensions-apiserver v0.35.0/go.mod h1:E1Ahk9SADaLQ4qtzYFkwUqusXTcaV2uw3l14aqpL2LU= +k8s.io/apimachinery v0.35.0 h1:Z2L3IHvPVv/MJ7xRxHEtk6GoJElaAqDCCU0S6ncYok8= +k8s.io/apimachinery v0.35.0/go.mod h1:jQCgFZFR1F4Ik7hvr2g84RTJSZegBc8yHgFWKn//hns= +k8s.io/apiserver v0.35.0 h1:CUGo5o+7hW9GcAEF3x3usT3fX4f9r8xmgQeCBDaOgX4= +k8s.io/apiserver v0.35.0/go.mod h1:QUy1U4+PrzbJaM3XGu2tQ7U9A4udRRo5cyxkFX0GEds= +k8s.io/client-go v0.35.0 h1:IAW0ifFbfQQwQmga0UdoH0yvdqrbwMdq9vIFEhRpxBE= +k8s.io/client-go v0.35.0/go.mod h1:q2E5AAyqcbeLGPdoRB+Nxe3KYTfPce1Dnu1myQdqz9o= +k8s.io/component-base v0.35.0 h1:+yBrOhzri2S1BVqyVSvcM3PtPyx5GUxCK2tinZz1G94= +k8s.io/component-base v0.35.0/go.mod h1:85SCX4UCa6SCFt6p3IKAPej7jSnF3L8EbfSyMZayJR0= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4= -k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8= -k8s.io/utils v0.0.0-20241104163129-6fe5fd82f078 h1:jGnCPejIetjiy2gqaJ5V0NLwTpF4wbQ6cZIItJCSHno= -k8s.io/utils v0.0.0-20241104163129-6fe5fd82f078/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912 h1:Y3gxNAuB0OBLImH611+UDZcmKS3g6CthxToOb37KgwE= +k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912/go.mod h1:kdmbQkyfwUagLfXIad1y2TdrjPFWp2Q89B3qkRwf/pQ= +k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 h1:SjGebBtkBqHFOli+05xYbK8YF1Dzkbzn+gDM4X9T4Ck= +k8s.io/utils v0.0.0-20251002143259-bc988d571ff4/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2 h1:jpcvIRr3GLoUoEKRkHKSmGjxb6lWwrBlJsXc+eUYQHM= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= -sigs.k8s.io/controller-runtime v0.21.0 h1:CYfjpEuicjUecRk+KAeyYh+ouUBn4llGyDYytIGcJS8= -sigs.k8s.io/controller-runtime v0.21.0/go.mod h1:OSg14+F65eWqIu4DceX7k/+QRAbTTvxeQSNSOQpukWM= -sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE= -sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= -sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= +sigs.k8s.io/controller-runtime v0.23.3 h1:VjB/vhoPoA9l1kEKZHBMnQF33tdCLQKJtydy4iqwZ80= +sigs.k8s.io/controller-runtime v0.23.3/go.mod h1:B6COOxKptp+YaUT5q4l6LqUJTRpizbgf9KSRNdQGns0= +sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg= +sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= -sigs.k8s.io/structured-merge-diff/v4 v4.6.0 h1:IUA9nvMmnKWcj5jl84xn+T5MnlZKThmUW1TdblaLVAc= -sigs.k8s.io/structured-merge-diff/v4 v4.6.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps= -sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= -sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +sigs.k8s.io/structured-merge-diff/v6 v6.3.2-0.20260122202528-d9cc6641c482 h1:2WOzJpHUBVrrkDjU4KBT8n5LDcj824eX0I5UKcgeRUs= +sigs.k8s.io/structured-merge-diff/v6 v6.3.2-0.20260122202528-d9cc6641c482/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= +sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= +sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= diff --git a/internal/controller/tests/dynamic_repo_test.go b/internal/controller/tests/dynamic_repo_test.go index f3ed6f92..f8553589 100644 --- a/internal/controller/tests/dynamic_repo_test.go +++ b/internal/controller/tests/dynamic_repo_test.go @@ -21,8 +21,8 @@ var _ = Describe("Gateway controller", func() { repoSecretName = "test-dynamic-repository-secret" namespace = "l7operator" gatewayName = "local-repo-ssg" - version = "11.1.3" - image = "docker.io/caapim/gateway:11.1.3" + version = "11.2.1" + image = "docker.io/caapim/gateway:11.2.1" repoName = "local-repo" repoType = securityv1.RepositoryTypeLocal dynamicChecksum = "" diff --git a/internal/controller/tests/gateway_podconfig_test.go b/internal/controller/tests/gateway_podconfig_test.go index 6dd4a154..4f673421 100644 --- a/internal/controller/tests/gateway_podconfig_test.go +++ b/internal/controller/tests/gateway_podconfig_test.go @@ -18,8 +18,8 @@ var _ = Describe("Gateway controller", func() { gwLicenseSecretName = "gateway-license" namespace = "l7operator" gatewayName = "podconfig-ssg" - version = "11.1.3" - image = "docker.io/caapim/gateway:11.1.3" + version = "11.2.1" + image = "docker.io/caapim/gateway:11.2.1" ) BeforeEach(func() { diff --git a/internal/controller/tests/http_repo_test.go b/internal/controller/tests/http_repo_test.go index 594c1d23..222b4628 100644 --- a/internal/controller/tests/http_repo_test.go +++ b/internal/controller/tests/http_repo_test.go @@ -17,8 +17,8 @@ var _ = Describe("Gateway controller", func() { gwLicenseSecretName = "gateway-license" namespace = "l7operator" gatewayName = "http-repo-ssg" - version = "11.1.3" - image = "docker.io/caapim/gateway:11.1.3" + version = "11.2.1" + image = "docker.io/caapim/gateway:11.2.1" repoName = "http-repo" ) diff --git a/internal/controller/tests/repo_test.go b/internal/controller/tests/repo_test.go index 3306d6ae..ca869159 100644 --- a/internal/controller/tests/repo_test.go +++ b/internal/controller/tests/repo_test.go @@ -21,8 +21,8 @@ var _ = Describe("Gateway controller", func() { gwLicenseSecretName = "gateway-license" namespace = "l7operator" gatewayName = "git-repo-ssg" - version = "11.1.3" - image = "docker.io/caapim/gateway:11.1.3" + version = "11.2.1" + image = "docker.io/caapim/gateway:11.2.1" repoType = securityv1.RepositoryTypeGit ) diff --git a/internal/controller/tests/static_repo_test.go b/internal/controller/tests/static_repo_test.go index 66021980..a5bc43bb 100644 --- a/internal/controller/tests/static_repo_test.go +++ b/internal/controller/tests/static_repo_test.go @@ -37,8 +37,8 @@ var _ = Describe("Gateway controller", func() { repoSecretName = "test-static-repository-secret" namespace = "l7operator" gatewayName = "static-repo-ssg" - version = "11.1.3" - image = "docker.io/caapim/gateway:11.1.3" + version = "11.2.1" + image = "docker.io/caapim/gateway:11.2.1" repoName = "local-repo" repoType = securityv1.RepositoryTypeLocal staticChecksum = "" diff --git a/internal/graphman/Readme.md b/internal/graphman/Readme.md index f74d8773..6a87f761 100644 --- a/internal/graphman/Readme.md +++ b/internal/graphman/Readme.md @@ -7,6 +7,6 @@ $ NODE_TLS_REJECT_UNAUTHORIZED=0 get-graphql-schema -h "Authorization=Basic YWRt ### Generate Schema ``` -$ go get github.com/Khan/genqlient@v0.7.0 -$ go run github.com/Khan/genqlient@v0.7.0 +go get -tool github.com/Khan/genqlient@v0.8.1 +go tool genqlient ``` \ No newline at end of file diff --git a/internal/graphman/bundle.go b/internal/graphman/bundle.go index 31410173..209ff07e 100644 --- a/internal/graphman/bundle.go +++ b/internal/graphman/bundle.go @@ -85,6 +85,7 @@ type Bundle struct { Keys []*KeyInput `json:"keys,omitempty"` CassandraConnections []*CassandraConnectionInput `json:"cassandraConnections,omitempty"` JmsDestinations []*JmsDestinationInput `json:"jmsDestinations,omitempty"` + KerberosConfigs []*KerberosConfigInput `json:"kerberosConfigs,omitempty"` GlobalPolicies []*GlobalPolicyInput `json:"globalPolicies,omitempty"` BackgroundTasks []*BackgroundTaskPolicyInput `json:"backgroundTaskPolicies,omitempty"` ScheduledTasks []*ScheduledTaskInput `json:"scheduledTasks,omitempty"` @@ -113,7 +114,10 @@ type Bundle struct { Roles []*RoleInput `json:"roles,omitempty"` GenericEntities []*GenericEntityInput `json:"genericEntities,omitempty"` AuditConfigurations []*AuditConfigurationInput `json:"auditConfigurations,omitempty"` - KerberosConfigs []*KerberosConfigInput `json:"kerberosConfigs,omitempty"` + PolicyBackedServices []*PolicyBackedServiceInput `json:"policyBackedServices,omitempty"` + PolicyAliases []*L7PolicyAliasInput `json:"policyAliases,omitempty"` + ServiceAliases []*L7ServiceAliasInput `json:"serviceAliases,omitempty"` + SampleMessages []*SampleMessageInput `json:"sampleMessages,omitempty"` Properties *BundleProperties `json:"properties,omitempty"` } @@ -162,6 +166,7 @@ type BundleMappings struct { Keys []*MappingInstructionInput `json:"keys,omitempty"` CassandraConnections []*MappingInstructionInput `json:"cassandraConnections,omitempty"` JmsDestinations []*MappingInstructionInput `json:"jmsDestinations,omitempty"` + KerberosConfigs []*MappingInstructionInput `json:"kerberosConfigs,omitempty"` GlobalPolicies []*MappingInstructionInput `json:"globalPolicies,omitempty"` BackgroundTasks []*MappingInstructionInput `json:"backgroundTaskPolicies,omitempty"` ScheduledTasks []*MappingInstructionInput `json:"scheduledTasks,omitempty"` @@ -190,6 +195,10 @@ type BundleMappings struct { Roles []*MappingInstructionInput `json:"roles,omitempty"` GenericEntities []*MappingInstructionInput `json:"genericEntities,omitempty"` AuditConfigurations []*MappingInstructionInput `json:"auditConfigurations,omitempty"` + PolicyBackedServices []*MappingInstructionInput `json:"policyBackedServices,omitempty"` + PolicyAliases []*MappingInstructionInput `json:"policyAliases,omitempty"` + ServiceAliases []*MappingInstructionInput `json:"serviceAliases,omitempty"` + SampleMessages []*MappingInstructionInput `json:"sampleMessages,omitempty"` } type MutationDetailedStatus struct { @@ -226,6 +235,7 @@ type BundleResponseDetailedStatus struct { Keys *MutationDetailedStatus `json:"setKeys,omitempty"` CassandraConnections *MutationDetailedStatus `json:"setCassandraConnections,omitempty"` JmsDestinations *MutationDetailedStatus `json:"setJmsDestinations,omitempty"` + KerberosConfigs *MutationDetailedStatus `json:"setKerberosConfigs,omitempty"` GlobalPolicies *MutationDetailedStatus `json:"setGlobalPolicies,omitempty"` BackgroundTasks *MutationDetailedStatus `json:"setBackgroundTaskPolicies,omitempty"` ScheduledTasks *MutationDetailedStatus `json:"setScheduledTasks,omitempty"` @@ -254,7 +264,10 @@ type BundleResponseDetailedStatus struct { Roles *MutationDetailedStatus `json:"setRoles,omitempty"` GenericEntities *MutationDetailedStatus `json:"setGenericEntities,omitempty"` AuditConfigurations *MutationDetailedStatus `json:"setAuditConfigurations,omitempty"` - KerberosConfigs *MutationDetailedStatus `json:"setKerberosConfigs,omitempty"` + PolicyBackedServices *MutationDetailedStatus `json:"setPolicyBackedServices,omitempty"` + PolicyAliases *MutationDetailedStatus `json:"setPolicyAliases,omitempty"` + ServiceAliases *MutationDetailedStatus `json:"setServiceAliases,omitempty"` + SampleMessages *MutationDetailedStatus `json:"setSampleMessages,omitempty"` } type MutationError struct { @@ -302,6 +315,7 @@ var entities = []string{ "fipUsers", "scheduledTasks", "jmsDestinations", + "kerberosConfigs", "secrets", "keys", "listenPorts", @@ -336,7 +350,10 @@ var entities = []string{ "roles", "genericEntities", "auditConfigurations", - "kerberosConfigs", + "policyAliases", + "serviceAliases", + "policyBackedServices", + "sampleMessages", } var entityFolderList = []string{ @@ -355,6 +372,7 @@ var entityFolderList = []string{ "fipUsers", "scheduledTasks", "jmsDestinations", + "kerberosConfigs", "secrets", "keys", "listenPorts", @@ -380,7 +398,8 @@ var entityFolderList = []string{ "roles", "genericEntities", "auditConfigurations", - "kerberosConfigs", + "policyBackedServices", + "sampleMessages", "tree", } @@ -528,76 +547,127 @@ func parsePacCode(p *PolicyInput, file string) (PolicyInput, error) { } // parseEntity determines which entity the file from a Graphman directory belongs to -// this works with a static list of globally defined entities -func parseEntity(path string) (string, bool) { +// this works with a static list of globally defined entities. +// repoRoot must be the graphman repository root (the path passed to Implode / BuildAndValidateBundle). +// +// WalkDir passes absolute paths. The checkout prefix (e.g. /tmp/--/ from this operator, +// or any other host/volume layout) is not part of graphman semantics. Matching entity folder names with +// strings.Contains on the full path can false-positive when that prefix contains the substring "/folders/" +// (same characters as the graphman "folders" entity) without any graphman folders/ directory under the +// repo. Matching on "/" + Rel(repoRoot, fullPath) + "/" applies entity names only under repoRoot. +func parseEntity(fullPath, repoRoot string) (string, bool) { + repoRoot = filepath.Clean(repoRoot) + fullPath = filepath.Clean(fullPath) + rel, err := filepath.Rel(repoRoot, fullPath) + if err != nil { + return "", false + } + relSlash := filepath.ToSlash(rel) + pathForMatch := "/" + relSlash + "/" for _, e := range entities { - entityName := e - filePath := path - if !strings.HasPrefix(e, ".") { - entityName = fmt.Sprintf("/%s/", e) - } else { - filePath = strings.Split(path, "/")[len(strings.Split(path, "/"))-1] + if strings.HasPrefix(e, ".") { + base := filepath.Base(fullPath) + if strings.Contains(base, e) { + return e, true + } + continue } - if strings.Contains(filePath, entityName) { + entityName := "/" + e + "/" + if strings.Contains(pathForMatch, entityName) { return e, true } } return "", false } +// ParseEntityPath returns the entity type if path matches the same rules as implodeBundle (parseEntity). +// Callers use this to skip files in a second pass that were already merged by Implode. +// repoRoot must be the same root passed to WalkDir (the graphman clone or bundle directory). +func ParseEntityPath(fullPath, repoRoot string) (entityType string, matched bool) { + return parseEntity(fullPath, repoRoot) +} + +// BundleJSONFromPolicyOrServiceAlias returns a minimal bundle JSON if data is a single policy or +// service alias document (aliasedPolicyName / aliasedServiceName); otherwise ok is false. +func BundleJSONFromPolicyOrServiceAlias(data []byte) (bundleJSON []byte, ok bool, err error) { + var pa L7PolicyAliasInput + if err := json.Unmarshal(data, &pa); err == nil && strings.TrimSpace(pa.AliasedPolicyName) != "" { + b := Bundle{PolicyAliases: []*L7PolicyAliasInput{&pa}} + out, err := json.Marshal(b) + return out, true, err + } + var sa L7ServiceAliasInput + if err := json.Unmarshal(data, &sa); err == nil && strings.TrimSpace(sa.AliasedServiceName) != "" { + b := Bundle{ServiceAliases: []*L7ServiceAliasInput{&sa}} + out, err := json.Marshal(b) + return out, true, err + } + return nil, false, nil +} + +// entityJSONUnmarshalError wraps readBundle failures for exploded entity files so logs include path and entity kind. +// Most callers pass json.Unmarshal errors; some pass adjunct parse errors (e.g. parsePacCode, parseCacString) for the same path. +// Paths under entity folders are not filtered by IsFullGraphmanBundleJSON; failures should surface with context. +func entityJSONUnmarshalError(entityType, file string, err error) error { + return fmt.Errorf("graphman entity JSON in %q (entity %q): %w", file, entityType, err) +} + // readBundle unmarshals a JSON file in the specified Graphman directory into the working Bundle object. func readBundle(entityType string, file string, bundle *Bundle) (Bundle, error) { ext := strings.Split(file, ".")[len(strings.Split(file, "."))-1] if ext != "json" { return *bundle, nil } - f, _ := os.ReadFile(file) + f, err := os.ReadFile(file) + if err != nil { + return *bundle, fmt.Errorf("read graphman entity file %q: %w", file, err) + } switch entityType { case ".webapi": webApiService := WebApiServiceInput{} err := json.Unmarshal(f, &webApiService) if err != nil { - return *bundle, err + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.WebApiServices = append(bundle.WebApiServices, &webApiService) case ".internalwebapi": internalWebApiService := WebApiServiceInput{} err := json.Unmarshal(f, &internalWebApiService) if err != nil { - return *bundle, err + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.InternalWebApiServices = append(bundle.InternalWebApiServices, &internalWebApiService) case ".soap": soapService := SoapServiceInput{} err := json.Unmarshal(f, &soapService) if err != nil { - return *bundle, err + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.SoapServices = append(bundle.SoapServices, &soapService) case ".internalsoap": internalSoapService := SoapServiceInput{} err := json.Unmarshal(f, &internalSoapService) if err != nil { - return *bundle, err + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.InternalSoapServices = append(bundle.InternalSoapServices, &internalSoapService) case ".global": globalPolicy := GlobalPolicyInput{} err := json.Unmarshal(f, &globalPolicy) if err != nil { - return *bundle, err + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.GlobalPolicies = append(bundle.GlobalPolicies, &globalPolicy) case ".policy": policyFragment := L7PolicyInput{} err := json.Unmarshal(f, &policyFragment) if err != nil { - return *bundle, err + return *bundle, entityJSONUnmarshalError(entityType, file, err) } policy, err := parsePacCode(policyFragment.Policy, file) if err != nil { - return *bundle, err + return *bundle, entityJSONUnmarshalError(entityType, file, err) } policyFragment.Policy = &policy @@ -606,12 +676,12 @@ func readBundle(entityType string, file string, bundle *Bundle) (Bundle, error) service := L7ServiceInput{} err := json.Unmarshal(f, &service) if err != nil { - return *bundle, nil + return *bundle, entityJSONUnmarshalError(entityType, file, err) } if service.ServiceType == "SOAP" { wsdl, err := parseCacString(entityType, file, service.Wsdl) if err != nil { - return *bundle, nil + return *bundle, entityJSONUnmarshalError(entityType, file, err) } if wsdl != "" { service.Wsdl = wsdl @@ -619,7 +689,7 @@ func readBundle(entityType string, file string, bundle *Bundle) (Bundle, error) } policy, err := parsePacCode(service.Policy, file) if err != nil { - return *bundle, err + return *bundle, entityJSONUnmarshalError(entityType, file, err) } service.Policy = &policy bundle.Services = append(bundle.Services, &service) @@ -627,39 +697,39 @@ func readBundle(entityType string, file string, bundle *Bundle) (Bundle, error) clusterProperty := ClusterPropertyInput{} err := json.Unmarshal(f, &clusterProperty) if err != nil { - return *bundle, err + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.ClusterProperties = append(bundle.ClusterProperties, &clusterProperty) case "scheduledTasks": scheduledTask := ScheduledTaskInput{} err := json.Unmarshal(f, &scheduledTask) if err != nil { - return *bundle, err + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.ScheduledTasks = append(bundle.ScheduledTasks, &scheduledTask) case "encassConfigs": encassConfig := EncassConfigInput{} err := json.Unmarshal(f, &encassConfig) if err != nil { - return *bundle, err + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.EncassConfigs = append(bundle.EncassConfigs, &encassConfig) case "jdbcConnections": jdbcConnection := JdbcConnectionInput{} err := json.Unmarshal(f, &jdbcConnection) if err != nil { - return *bundle, err + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.JdbcConnections = append(bundle.JdbcConnections, &jdbcConnection) case "trustedCerts": trustedCert := TrustedCertInput{} err := json.Unmarshal(f, &trustedCert) if err != nil { - return *bundle, err + return *bundle, entityJSONUnmarshalError(entityType, file, err) } cert, err := parseCacString(entityType, file, trustedCert.CertBase64) if err != nil { - return *bundle, err + return *bundle, entityJSONUnmarshalError(entityType, file, err) } if cert != "" { trustedCert.CertBase64 = cert @@ -669,74 +739,74 @@ func readBundle(entityType string, file string, bundle *Bundle) (Bundle, error) schema := SchemaInput{} err := json.Unmarshal(f, &schema) if err != nil { - return *bundle, err + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.Schemas = append(bundle.Schemas, &schema) case "dtds": dtd := DtdInput{} err := json.Unmarshal(f, &dtd) if err != nil { - return *bundle, err + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.Dtds = append(bundle.Dtds, &dtd) case "fips": fip := FipInput{} err := json.Unmarshal(f, &fip) if err != nil { - return *bundle, err + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.Fips = append(bundle.Fips, &fip) case "ldaps": ldap := LdapInput{} err := json.Unmarshal(f, &ldap) if err != nil { - return *bundle, err + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.Ldaps = append(bundle.Ldaps, &ldap) case "internalGroups": internalGroup := InternalGroupInput{} err := json.Unmarshal(f, &internalGroup) if err != nil { - return *bundle, err + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.InternalGroups = append(bundle.InternalGroups, &internalGroup) case "fipGroups": fipsGroup := FipGroupInput{} err := json.Unmarshal(f, &fipsGroup) if err != nil { - return *bundle, err + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.FipGroups = append(bundle.FipGroups, &fipsGroup) case "internalUsers": internalUser := InternalUserInput{} err := json.Unmarshal(f, &internalUser) if err != nil { - return *bundle, err + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.InternalUsers = append(bundle.InternalUsers, &internalUser) case "fipUsers": fipsUser := FipUserInput{} err := json.Unmarshal(f, &fipsUser) if err != nil { - return *bundle, err + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.FipUsers = append(bundle.FipUsers, &fipsUser) case "secrets": secret := SecretInput{} err := json.Unmarshal(f, &secret) if err != nil { - return *bundle, err + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.Secrets = append(bundle.Secrets, &secret) case "keys": key := KeyInput{} err := json.Unmarshal(f, &key) if err != nil { - return *bundle, err + return *bundle, entityJSONUnmarshalError(entityType, file, err) } certChainString, err := parseCacString(entityType+"-crt", file, key.CertChain) if err != nil { - return *bundle, err + return *bundle, entityJSONUnmarshalError(entityType, file, err) } keyField := key.Pem if key.P12 != "" { @@ -744,7 +814,7 @@ func readBundle(entityType string, file string, bundle *Bundle) (Bundle, error) } privKey, err := parseCacString(entityType+"-key", file, keyField) if err != nil { - return *bundle, err + return *bundle, entityJSONUnmarshalError(entityType, file, err) } if certChainString != "" { certsChain := []string{} @@ -768,42 +838,42 @@ func readBundle(entityType string, file string, bundle *Bundle) (Bundle, error) jmsDestination := JmsDestinationInput{} err := json.Unmarshal(f, &jmsDestination) if err != nil { - return *bundle, err + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.JmsDestinations = append(bundle.JmsDestinations, &jmsDestination) case "activeConnectors": activeConnector := ActiveConnectorInput{} err := json.Unmarshal(f, &activeConnector) if err != nil { - return *bundle, nil + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.ActiveConnectors = append(bundle.ActiveConnectors, &activeConnector) case "listenPorts": listenPort := ListenPortInput{} err := json.Unmarshal(f, &listenPort) if err != nil { - return *bundle, nil + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.ListenPorts = append(bundle.ListenPorts, &listenPort) case "emailListeners": emailListener := EmailListenerInput{} err := json.Unmarshal(f, &emailListener) if err != nil { - return *bundle, nil + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.EmailListeners = append(bundle.EmailListeners, &emailListener) case "serverModuleFiles": serverModuleFile := ServerModuleFileInput{} err := json.Unmarshal(f, &serverModuleFile) if err != nil { - return *bundle, nil + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.ServerModuleFiles = append(bundle.ServerModuleFiles, &serverModuleFile) case "smConfigs": smConfig := SMConfigInput{} err := json.Unmarshal(f, &smConfig) if err != nil { - return *bundle, nil + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.SiteMinderConfigs = append(bundle.SiteMinderConfigs, &smConfig) @@ -811,142 +881,156 @@ func readBundle(entityType string, file string, bundle *Bundle) (Bundle, error) administrativeUserAccountProperty := AdministrativeUserAccountPropertyInput{} err := json.Unmarshal(f, &administrativeUserAccountProperty) if err != nil { - return *bundle, nil + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.AdministrativeUserAccountProperties = append(bundle.AdministrativeUserAccountProperties, &administrativeUserAccountProperty) case "passwordPolicies": passwordPolicy := PasswordPolicyInput{} err := json.Unmarshal(f, &passwordPolicy) if err != nil { - return *bundle, nil + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.PasswordPolicies = append(bundle.PasswordPolicies, &passwordPolicy) case "revocationCheckPolicies": revocationCheckPolicy := RevocationCheckPolicyInput{} err := json.Unmarshal(f, &revocationCheckPolicy) if err != nil { - return *bundle, nil + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.RevocationCheckPolicies = append(bundle.RevocationCheckPolicies, &revocationCheckPolicy) case "logSinks": logSink := LogSinkInput{} err := json.Unmarshal(f, &logSink) if err != nil { - return *bundle, nil + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.LogSinks = append(bundle.LogSinks, &logSink) case "httpConfigurations": httpConfiguration := HttpConfigurationInput{} err := json.Unmarshal(f, &httpConfiguration) if err != nil { - return *bundle, nil + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.HttpConfigurations = append(bundle.HttpConfigurations, &httpConfiguration) case "customKeyValues": customKeyValue := CustomKeyValueInput{} err := json.Unmarshal(f, &customKeyValue) if err != nil { - return *bundle, nil + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.CustomKeyValues = append(bundle.CustomKeyValues, &customKeyValue) case "serviceResolutionConfigs": serviceResolutionConfig := ServiceResolutionConfigInput{} err := json.Unmarshal(f, &serviceResolutionConfig) if err != nil { - return *bundle, nil + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.ServiceResolutionConfigs = append(bundle.ServiceResolutionConfigs, &serviceResolutionConfig) case "folders": folder := FolderInput{} err := json.Unmarshal(f, &folder) if err != nil { - return *bundle, nil + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.Folders = append(bundle.Folders, &folder) case "federatedIdps": federatedIdp := FederatedIdpInput{} err := json.Unmarshal(f, &federatedIdp) if err != nil { - return *bundle, nil + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.FederatedIdps = append(bundle.FederatedIdps, &federatedIdp) case "federatedGroups": federatedGroup := FederatedGroupInput{} err := json.Unmarshal(f, &federatedGroup) if err != nil { - return *bundle, nil + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.FederatedGroups = append(bundle.FederatedGroups, &federatedGroup) case "federatedUsers": federatedUser := FederatedUserInput{} err := json.Unmarshal(f, &federatedUser) if err != nil { - return *bundle, nil + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.FederatedUsers = append(bundle.FederatedUsers, &federatedUser) case "internalIdps": internalIdp := InternalIdpInput{} err := json.Unmarshal(f, &internalIdp) if err != nil { - return *bundle, nil + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.InternalIdps = append(bundle.InternalIdps, &internalIdp) case "ldapIdps": ldapIdp := LdapIdpInput{} err := json.Unmarshal(f, &ldapIdp) if err != nil { - return *bundle, nil + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.LdapIdps = append(bundle.LdapIdps, &ldapIdp) case "simpleLdapIdps": simpleLdapIdp := SimpleLdapIdpInput{} err := json.Unmarshal(f, &simpleLdapIdp) if err != nil { - return *bundle, nil + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.SimpleLdapIdps = append(bundle.SimpleLdapIdps, &simpleLdapIdp) case "policyBackedIdps": policyBackedIdp := PolicyBackedIdpInput{} err := json.Unmarshal(f, &policyBackedIdp) if err != nil { - return *bundle, nil + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.PolicyBackedIdps = append(bundle.PolicyBackedIdps, &policyBackedIdp) case "policies": policy := L7PolicyInput{} err := json.Unmarshal(f, &policy) if err != nil { - return *bundle, nil + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.Policies = append(bundle.Policies, &policy) case "services": service := L7ServiceInput{} err := json.Unmarshal(f, &service) if err != nil { - return *bundle, nil + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.Services = append(bundle.Services, &service) case "roles": role := RoleInput{} err := json.Unmarshal(f, &role) if err != nil { - return *bundle, nil + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.Roles = append(bundle.Roles, &role) case "genericEntities": genericEntity := GenericEntityInput{} err := json.Unmarshal(f, &genericEntity) if err != nil { - return *bundle, nil + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.GenericEntities = append(bundle.GenericEntities, &genericEntity) case "auditConfigurations": auditConfiguration := AuditConfigurationInput{} err := json.Unmarshal(f, &auditConfiguration) if err != nil { - return *bundle, nil + return *bundle, entityJSONUnmarshalError(entityType, file, err) } bundle.AuditConfigurations = append(bundle.AuditConfigurations, &auditConfiguration) + case "policyAliases": + policyAlias := L7PolicyAliasInput{} + err := json.Unmarshal(f, &policyAlias) + if err != nil { + return *bundle, entityJSONUnmarshalError(entityType, file, err) + } + bundle.PolicyAliases = append(bundle.PolicyAliases, &policyAlias) + case "serviceAliases": + serviceAlias := L7ServiceAliasInput{} + err := json.Unmarshal(f, &serviceAlias) + if err != nil { + return *bundle, entityJSONUnmarshalError(entityType, file, err) + } + bundle.ServiceAliases = append(bundle.ServiceAliases, &serviceAlias) } return *bundle, nil } @@ -981,7 +1065,7 @@ func implodeBundle(path string, processNestedRepos bool) (Bundle, error) { } if !d.IsDir() { - name, isEntity := parseEntity(path) + name, isEntity := parseEntity(path, startPath) if isEntity { bundle, err = readBundle(name, path, &bundle) if err != nil { @@ -1056,6 +1140,15 @@ func ResetDelta(src []byte) (dst []byte, err error) { return nil, nil } +// The query or mutation executed by installBundleGeneric. +const installBundleGeneric_Operation = ` +mutation installBundleGeneric { + installBundleEntities { + summary + } +} +` + func installGenericBundle( ctx_ context.Context, client_ graphql.Client, @@ -1079,6 +1172,15 @@ func installGenericBundle( return &data_, err_ } +// The query or mutation executed by deleteBundleGeneric. +const deleteBundleGeneric_Operation = ` +mutation deleteBundleGeneric { + deleteBundleEntities { + summary + } +} +` + func deleteGenericBundle( ctx_ context.Context, client_ graphql.Client, diff --git a/internal/graphman/bundle_helpers.go b/internal/graphman/bundle_helpers.go index 00fac20c..c1c8a5a5 100644 --- a/internal/graphman/bundle_helpers.go +++ b/internal/graphman/bundle_helpers.go @@ -96,6 +96,9 @@ func CombineWithOverwrite(src Bundle, dest Bundle) (Bundle, error) { case "CustomKeyValues": // Custom KV: Match on Key primaryFields = []string{"Key"} + case "ServiceResolutionConfigs": + // Global service resolution config: no Name; match on Goid + primaryFields = []string{"Goid"} default: // Default: Match on Name primaryFields = []string{"Name"} @@ -246,6 +249,9 @@ func CombineWithOverwritePreservingDeleteMappings(src Bundle, dest Bundle) (Bund case "CustomKeyValues": // Custom KV: Match on Key primaryFields = []string{"Key"} + case "ServiceResolutionConfigs": + // Global service resolution config: no Name; match on Goid + primaryFields = []string{"Goid"} default: // Default: Match on Name primaryFields = []string{"Name"} @@ -414,6 +420,8 @@ func CleanDeleteMappingsForEntities(bundle *Bundle, source Bundle) error { primaryFields = []string{"SystemId"} case "CustomKeyValues": primaryFields = []string{"Key"} + case "ServiceResolutionConfigs": + primaryFields = []string{"Goid"} default: primaryFields = []string{"Name"} } diff --git a/internal/graphman/bundle_helpers_test.go b/internal/graphman/bundle_helpers_test.go index b94dfd6d..841d094f 100644 --- a/internal/graphman/bundle_helpers_test.go +++ b/internal/graphman/bundle_helpers_test.go @@ -291,6 +291,46 @@ func TestCombineWithOverwrite_CustomKeyValuesByKey(t *testing.T) { } } +func TestCombineWithOverwrite_ServiceResolutionConfigsByGoid(t *testing.T) { + goidA := "0000000000000000fffffffffffffffe" + goidB := "0000000000000000fffffffffffffffd" + + bundle1 := Bundle{ + ServiceResolutionConfigs: []*ServiceResolutionConfigInput{ + {Goid: goidA, ResolutionPathRequired: false}, + {Goid: goidB, ResolutionPathRequired: false}, + }, + } + + bundle2 := Bundle{ + ServiceResolutionConfigs: []*ServiceResolutionConfigInput{ + {Goid: goidA, ResolutionPathRequired: true}, // same Goid overwrites + }, + } + + result, err := CombineWithOverwrite(bundle2, bundle1) + if err != nil { + t.Fatalf("CombineWithOverwrite failed: %v", err) + } + + if len(result.ServiceResolutionConfigs) != 2 { + t.Fatalf("Expected 2 service resolution configs, got %d", len(result.ServiceResolutionConfigs)) + } + + for _, c := range result.ServiceResolutionConfigs { + switch c.Goid { + case goidA: + if !c.ResolutionPathRequired { + t.Errorf("expected goid A ResolutionPathRequired true after overwrite") + } + case goidB: + if c.ResolutionPathRequired { + t.Errorf("expected goid B unchanged (ResolutionPathRequired false)") + } + } + } +} + func TestCalculateDelta_DetectsNewEntities(t *testing.T) { // Test that new entities are detected current := Bundle{} diff --git a/internal/graphman/bundle_shape.go b/internal/graphman/bundle_shape.go new file mode 100644 index 00000000..2bbffc06 --- /dev/null +++ b/internal/graphman/bundle_shape.go @@ -0,0 +1,111 @@ +/* +* Copyright (c) 2025 Broadcom. All rights reserved. +* The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries. +* All trademarks, trade names, service marks, and logos referenced +* herein belong to their respective companies. +* +* This software and all information contained therein is confidential +* and proprietary and shall not be duplicated, used, disclosed or +* disseminated in any way except as authorized by the applicable +* license agreement, without the express written permission of Broadcom. +* All authorized reproductions must be marked with this language. +* +* EXCEPT AS SET FORTH IN THE APPLICABLE LICENSE AGREEMENT, TO THE +* EXTENT PERMITTED BY APPLICABLE LAW OR AS AGREED BY BROADCOM IN ITS +* APPLICABLE LICENSE AGREEMENT, BROADCOM PROVIDES THIS DOCUMENTATION +* "AS IS" WITHOUT WARRANTY OF ANY KIND, INCLUDING WITHOUT LIMITATION, +* ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* PURPOSE, OR. NONINFRINGEMENT. IN NO EVENT WILL BROADCOM BE LIABLE TO +* THE END USER OR ANY THIRD PARTY FOR ANY LOSS OR DAMAGE, DIRECT OR +* INDIRECT, FROM THE USE OF THIS DOCUMENTATION, INCLUDING WITHOUT LIMITATION, +* LOST PROFITS, LOST INVESTMENT, BUSINESS INTERRUPTION, GOODWILL, OR +* LOST DATA, EVEN IF BROADCOM IS EXPRESSLY ADVISED IN ADVANCE OF THE +* POSSIBILITY OF SUCH LOSS OR DAMAGE. +* +* AI assistance has been used to generate some or all contents of this file. That includes, but is not limited to, new code, modifying existing code, stylistic edits. + */ + +package graphman + +import ( + "encoding/json" +) + +// fullGraphmanBundleJSONKeys lists JSON object keys that may appear at the top level of a +// Graphman Bundle document (see Bundle struct json tags). Used to detect loose files that are +// intended as full bundles vs unrelated JSON. +var fullGraphmanBundleJSONKeys = map[string]struct{}{ + "webApiServices": {}, + "internalWebApiServices": {}, + "soapServices": {}, + "internalSoapServices": {}, + "policyFragments": {}, + "encassConfigs": {}, + "clusterProperties": {}, + "jdbcConnections": {}, + "trustedCerts": {}, + "schemas": {}, + "dtds": {}, + "fips": {}, + "ldaps": {}, + "internalGroups": {}, + "fipGroups": {}, + "internalUsers": {}, + "fipUsers": {}, + "secrets": {}, + "keys": {}, + "cassandraConnections": {}, + "jmsDestinations": {}, + "kerberosConfigs": {}, + "globalPolicies": {}, + "backgroundTaskPolicies": {}, + "scheduledTasks": {}, + "serverModuleFiles": {}, + "smConfigs": {}, + "activeConnectors": {}, + "emailListeners": {}, + "listenPorts": {}, + "administrativeUserAccountProperties": {}, + "passwordPolicies": {}, + "revocationCheckPolicies": {}, + "logSinks": {}, + "httpConfigurations": {}, + "customKeyValues": {}, + "serviceResolutionConfigs": {}, + "folders": {}, + "federatedIdps": {}, + "federatedGroups": {}, + "federatedUsers": {}, + "internalIdps": {}, + "ldapIdps": {}, + "simpleLdapIdps": {}, + "policyBackedIdps": {}, + "policies": {}, + "services": {}, + "roles": {}, + "genericEntities": {}, + "auditConfigurations": {}, + "policyBackedServices": {}, + "policyAliases": {}, + "serviceAliases": {}, + "sampleMessages": {}, + "properties": {}, +} + +// IsFullGraphmanBundleJSON reports whether data is a JSON object whose top-level keys suggest a +// full Graphman Bundle document (as opposed to unrelated repo JSON or a standalone alias file). +func IsFullGraphmanBundleJSON(data []byte) bool { + var m map[string]json.RawMessage + if err := json.Unmarshal(data, &m); err != nil { + return false + } + if len(m) == 0 { + return false + } + for k := range m { + if _, ok := fullGraphmanBundleJSONKeys[k]; ok { + return true + } + } + return false +} diff --git a/internal/graphman/bundle_shape_test.go b/internal/graphman/bundle_shape_test.go new file mode 100644 index 00000000..4d515a80 --- /dev/null +++ b/internal/graphman/bundle_shape_test.go @@ -0,0 +1,56 @@ +/* +* Copyright (c) 2025 Broadcom. All rights reserved. +* The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries. +* All trademarks, trade names, service marks, and logos referenced +* herein belong to their respective companies. +* +* This software and all information contained therein is confidential +* and proprietary and shall not be duplicated, used, disclosed or +* disseminated in any way except as authorized by the applicable +* license agreement, without the express written permission of Broadcom. +* All authorized reproductions must be marked with this language. +* +* EXCEPT AS SET FORTH IN THE APPLICABLE LICENSE AGREEMENT, TO THE +* EXTENT PERMITTED BY APPLICABLE LAW OR AS AGREED BY BROADCOM IN ITS +* APPLICABLE LICENSE AGREEMENT, BROADCOM PROVIDES THIS DOCUMENTATION +* "AS IS" WITHOUT WARRANTY OF ANY KIND, INCLUDING WITHOUT LIMITATION, +* ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* PURPOSE, OR. NONINFRINGEMENT. IN NO EVENT WILL BROADCOM BE LIABLE TO +* THE END USER OR ANY THIRD PARTY FOR ANY LOSS OR DAMAGE, DIRECT OR +* INDIRECT, FROM THE USE OF THIS DOCUMENTATION, INCLUDING WITHOUT LIMITATION, +* LOST PROFITS, LOST INVESTMENT, BUSINESS INTERRUPTION, GOODWILL, OR +* LOST DATA, EVEN IF BROADCOM IS EXPRESSLY ADVISED IN ADVANCE OF THE +* POSSIBILITY OF SUCH LOSS OR DAMAGE. +* +* AI assistance has been used to generate some or all contents of this file. That includes, but is not limited to, new code, modifying existing code, stylistic edits. + */ + +package graphman + +import "testing" + +func TestIsFullGraphmanBundleJSON(t *testing.T) { + t.Parallel() + tests := []struct { + name string + json string + want bool + }{ + {"services array", `{"services":[]}`, true}, + {"properties only", `{"properties":{}}`, true}, + {"clusterProperties", `{"clusterProperties":[]}`, true}, + {"unrelated keys", `{"appSettings":{"x":1}}`, false}, + {"empty object", `{}`, false}, + {"non object", `"string"`, false}, + {"invalid json", `{`, false}, + {"policy alias standalone shape", `{"aliasedPolicyName":"p"}`, false}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + if got := IsFullGraphmanBundleJSON([]byte(tt.json)); got != tt.want { + t.Fatalf("IsFullGraphmanBundleJSON(%q) = %v, want %v", tt.json, got, tt.want) + } + }) + } +} diff --git a/internal/graphman/bundle_test.go b/internal/graphman/bundle_test.go index 0b0c8a85..829bc1ee 100644 --- a/internal/graphman/bundle_test.go +++ b/internal/graphman/bundle_test.go @@ -29,6 +29,7 @@ package graphman import ( "encoding/json" + "path/filepath" "testing" ) @@ -236,3 +237,37 @@ func TestConcatBundle_DuplicatesAcrossFolders(t *testing.T) { t.Errorf("Expected folder path '/folder2' (latest), got '%s'", finalResult.Services[0].FolderPath) } } + +func TestBundleJSONFromPolicyOrServiceAlias(t *testing.T) { + policyAlias := []byte(`{"goid":"1","folderPath":"/a","name":"n","aliasedPolicyName":"target","checksum":""}`) + b, ok, err := BundleJSONFromPolicyOrServiceAlias(policyAlias) + if err != nil || !ok { + t.Fatalf("policy alias: ok=%v err=%v", ok, err) + } + var u Bundle + if err := json.Unmarshal(b, &u); err != nil { + t.Fatal(err) + } + if len(u.PolicyAliases) != 1 || u.PolicyAliases[0].AliasedPolicyName != "target" { + t.Fatalf("unexpected bundle: %+v", u.PolicyAliases) + } + + _, ok, _ = BundleJSONFromPolicyOrServiceAlias([]byte(`{"goid":"x"}`)) + if ok { + t.Fatal("expected not alias") + } +} + +func TestParseEntityPath_CheckoutPrefixFoldersSubstring(t *testing.T) { + // Synthetic root: prefix contains "/folders/" as a path segment (common cache/temp layouts) but + // repo-relative paths at root must not be classified as the graphman "folders" entity. + repoRoot := filepath.Join("/var", "folders", "abc", "T", "TestRepo", "001") + fullPath := filepath.Join(repoRoot, "invalid-full.json") + if _, m := ParseEntityPath(fullPath, repoRoot); m { + t.Fatalf("file at repo root should not match entity: prefix contains /folders/ substring only outside repo layout") + } + under := filepath.Join(repoRoot, "folders", "x.json") + if et, m := ParseEntityPath(under, repoRoot); !m || et != "folders" { + t.Fatalf("expected graphman folders/ entity, got matched=%v entity=%q", m, et) + } +} diff --git a/internal/graphman/generated-modified.go b/internal/graphman/generated-modified.go index 7ea0bf11..8caa7bc9 100644 --- a/internal/graphman/generated-modified.go +++ b/internal/graphman/generated-modified.go @@ -749,7 +749,9 @@ type FederatedUserInput struct { FirstName string `json:"firstName"` LastName string `json:"lastName"` Email string `json:"email"` - Checksum string `json:"checksum"` + // The description of the federated user + Description string `json:"description"` + Checksum string `json:"checksum"` } // GetName returns FederatedUserInput.Name, and is useful for accessing the field via an interface. @@ -785,6 +787,9 @@ func (v *FederatedUserInput) GetLastName() string { return v.LastName } // GetEmail returns FederatedUserInput.Email, and is useful for accessing the field via an interface. func (v *FederatedUserInput) GetEmail() string { return v.Email } +// GetDescription returns FederatedUserInput.Description, and is useful for accessing the field via an interface. +func (v *FederatedUserInput) GetDescription() string { return v.Description } + // GetChecksum returns FederatedUserInput.Checksum, and is useful for accessing the field via an interface. func (v *FederatedUserInput) GetChecksum() string { return v.Checksum } @@ -1102,22 +1107,32 @@ func (v *GroupMappingInput) GetMemberStrategy() *MemberStrategyInput { return v. // IDP Group Reference input type GroupRefInput struct { + // The goid of user + Goid string `json:"goid"` // The name of group Name string `json:"name"` // The subjectDn of group SubjectDn string `json:"subjectDn"` + // The description of group + Description string `json:"description"` // The name of identity provider that the group belongs to ProviderName string `json:"providerName"` // The type of identity provider that the group belongs to ProviderType IdpType `json:"providerType"` } +// GetGoid returns GroupRefInput.Goid, and is useful for accessing the field via an interface. +func (v *GroupRefInput) GetGoid() string { return v.Goid } + // GetName returns GroupRefInput.Name, and is useful for accessing the field via an interface. func (v *GroupRefInput) GetName() string { return v.Name } // GetSubjectDn returns GroupRefInput.SubjectDn, and is useful for accessing the field via an interface. func (v *GroupRefInput) GetSubjectDn() string { return v.SubjectDn } +// GetDescription returns GroupRefInput.Description, and is useful for accessing the field via an interface. +func (v *GroupRefInput) GetDescription() string { return v.Description } + // GetProviderName returns GroupRefInput.ProviderName, and is useful for accessing the field via an interface. func (v *GroupRefInput) GetProviderName() string { return v.ProviderName } @@ -1344,6 +1359,8 @@ type InternalUserInput struct { FirstName string `json:"firstName"` LastName string `json:"lastName"` Email string `json:"email"` + // The description of the Internal User + Description string `json:"description"` // Is user enabled or not! Enabled bool `json:"enabled"` // Ignored at creation time but can be used to compare bundle with gw state @@ -1383,6 +1400,9 @@ func (v *InternalUserInput) GetLastName() string { return v.LastName } // GetEmail returns InternalUserInput.Email, and is useful for accessing the field via an interface. func (v *InternalUserInput) GetEmail() string { return v.Email } +// GetDescription returns InternalUserInput.Description, and is useful for accessing the field via an interface. +func (v *InternalUserInput) GetDescription() string { return v.Description } + // GetEnabled returns InternalUserInput.Enabled, and is useful for accessing the field via an interface. func (v *InternalUserInput) GetEnabled() bool { return v.Enabled } @@ -1613,6 +1633,39 @@ func (v *KerberosConfigInput) GetKeytab() string { return v.Keytab } // GetConf returns KerberosConfigInput.Conf, and is useful for accessing the field via an interface. func (v *KerberosConfigInput) GetConf() string { return v.Conf } +type KeyGenerateOptions struct { + // RSA Key Size + RsaKeyBits int `json:"rsaKeyBits"` + // EC Curve Name + EcName string `json:"ecName"` + // Number of days before the initial self-signed certificate expires + CertExpiry int `json:"certExpiry"` + // Signature hash algorithm for signing a certificate + SignatureHashAlg string `json:"signatureHashAlg"` + // Use RSASSA-PSS Signature Scheme + UseRsaSsaPss bool `json:"useRsaSsaPss"` + // The Certificate will be used to sign other certificates + CertCACapable bool `json:"certCACapable"` +} + +// GetRsaKeyBits returns KeyGenerateOptions.RsaKeyBits, and is useful for accessing the field via an interface. +func (v *KeyGenerateOptions) GetRsaKeyBits() int { return v.RsaKeyBits } + +// GetEcName returns KeyGenerateOptions.EcName, and is useful for accessing the field via an interface. +func (v *KeyGenerateOptions) GetEcName() string { return v.EcName } + +// GetCertExpiry returns KeyGenerateOptions.CertExpiry, and is useful for accessing the field via an interface. +func (v *KeyGenerateOptions) GetCertExpiry() int { return v.CertExpiry } + +// GetSignatureHashAlg returns KeyGenerateOptions.SignatureHashAlg, and is useful for accessing the field via an interface. +func (v *KeyGenerateOptions) GetSignatureHashAlg() string { return v.SignatureHashAlg } + +// GetUseRsaSsaPss returns KeyGenerateOptions.UseRsaSsaPss, and is useful for accessing the field via an interface. +func (v *KeyGenerateOptions) GetUseRsaSsaPss() bool { return v.UseRsaSsaPss } + +// GetCertCACapable returns KeyGenerateOptions.CertCACapable, and is useful for accessing the field via an interface. +func (v *KeyGenerateOptions) GetCertCACapable() bool { return v.CertCACapable } + type KeyInput struct { KeystoreId string `json:"keystoreId"` Alias string `json:"alias"` @@ -1625,7 +1678,7 @@ type KeyInput struct { Goid string `json:"goid"` // SubjectDn of the certificate associated with the key. (Note that, this field has no effect on the mutation) SubjectDn string `json:"subjectDn"` - // Key type. (Note that, this field has no effect on the mutation) + // Key type RSA/EC KeyType string `json:"keyType"` // The Key usage types. (Note that, the key usage will not be reset when this field is not specified) UsageTypes []KeyUsageType `json:"usageTypes"` @@ -1633,6 +1686,8 @@ type KeyInput struct { CertChain interface{} `json:"certChain"` // Ignored at entity creation time but declared here so you can embed checksums in graphman bundles Checksum string `json:"checksum"` + // Key Generate Options + KeyGenerateOptions *KeyGenerateOptions `json:"keyGenerateOptions,omitempty"` } // GetKeystoreId returns KeyInput.KeystoreId, and is useful for accessing the field via an interface. @@ -1665,6 +1720,9 @@ func (v *KeyInput) GetCertChain() interface{} { return v.CertChain } // GetChecksum returns KeyInput.Checksum, and is useful for accessing the field via an interface. func (v *KeyInput) GetChecksum() string { return v.Checksum } +// GetKeyGenerateOptions returns KeyInput.KeyGenerateOptions, and is useful for accessing the field via an interface. +func (v *KeyInput) GetKeyGenerateOptions() *KeyGenerateOptions { return v.KeyGenerateOptions } + type KeyUsageType string const ( @@ -1678,6 +1736,31 @@ const ( KeyUsageTypeAuditSigning KeyUsageType = "AUDIT_SIGNING" ) +type L7PolicyAliasInput struct { + // The internal entity unique identifier + Goid string `json:"goid"` + // The folder path where to create this alias. If the path does not exist, it will be created + FolderPath string `json:"folderPath"` + // The name of the aliased entity. + Name string `json:"name"` + // The name of the aliased entity. + AliasedPolicyName string `json:"aliasedPolicyName,omitempty"` + // Ignored at creation time but can be used to compare bundle with gw state + Checksum string `json:"checksum"` +} + +// GetGoid returns L7PolicyAliasInput.Goid, and is useful for accessing the field via an interface. +func (v *L7PolicyAliasInput) GetGoid() string { return v.Goid } + +// GetFolderPath returns L7PolicyAliasInput.FolderPath, and is useful for accessing the field via an interface. +func (v *L7PolicyAliasInput) GetFolderPath() string { return v.FolderPath } + +// GetName returns L7PolicyAliasInput.Name, and is useful for accessing the field via an interface. +func (v *L7PolicyAliasInput) GetName() string { return v.Name } + +// GetChecksum returns L7PolicyAliasInput.Checksum, and is useful for accessing the field via an interface. +func (v *L7PolicyAliasInput) GetChecksum() string { return v.Checksum } + type L7PolicyInput struct { // The internal entity unique identifier Goid string `json:"goid"` @@ -1688,13 +1771,19 @@ type L7PolicyInput struct { // The guid for this policy, if none provided, assigned at creation Guid string `json:"guid"` // The policy - Policy *PolicyInput `json:"policy,omitempty"` - PolicyRevision *PolicyRevisionInput `json:"policyRevision,omitempty"` + Policy *PolicyInput `json:"policy,omitempty"` + // (Deprecated) The policy revision. + PolicyRevision *PolicyRevisionInput `json:"policyRevision,omitempty"` + // The policy revisions. PolicyRevisions []*PolicyRevisionInput `json:"policyRevisions,omitempty"` Soap bool `json:"soap"` PolicyType L7PolicyType `json:"policyType"` Tag string `json:"tag,omitempty"` SubTag string `json:"subTag,omitempty"` + // The policy version + Version int `json:"version"` + // Is the policy enabled or not + Enabled bool `json:"enabled"` // Ignored at creation time but can be used to compare bundle with gw state Checksum string `json:"checksum,omitempty"` } @@ -1732,6 +1821,12 @@ func (v *L7PolicyInput) GetTag() string { return v.Tag } // GetSubTag returns L7PolicyInput.SubTag, and is useful for accessing the field via an interface. func (v *L7PolicyInput) GetSubTag() string { return v.SubTag } +// GetVersion returns L7PolicyInput.Version, and is useful for accessing the field via an interface. +func (v *L7PolicyInput) GetVersion() int { return v.Version } + +// GetEnabled returns L7PolicyInput.Enabled, and is useful for accessing the field via an interface. +func (v *L7PolicyInput) GetEnabled() bool { return v.Enabled } + // GetChecksum returns L7PolicyInput.Checksum, and is useful for accessing the field via an interface. func (v *L7PolicyInput) GetChecksum() string { return v.Checksum } @@ -1754,6 +1849,31 @@ const ( L7PolicyTypePolicyBackedServiceMetrics L7PolicyType = "POLICY_BACKED_SERVICE_METRICS" ) +type L7ServiceAliasInput struct { + // The internal entity unique identifier + Goid string `json:"goid"` + // The folder path where to create this alias. If the path does not exist, it will be created + FolderPath string `json:"folderPath"` + // The name of the aliased entity. + Name string `json:"name"` + // The name of the aliased entity. + AliasedServiceName string `json:"aliasedServiceName,omitempty"` + // Ignored at creation time but can be used to compare bundle with gw state + Checksum string `json:"checksum"` +} + +// GetGoid returns L7ServiceAliasInput.Goid, and is useful for accessing the field via an interface. +func (v *L7ServiceAliasInput) GetGoid() string { return v.Goid } + +// GetFolderPath returns L7ServiceAliasInput.FolderPath, and is useful for accessing the field via an interface. +func (v *L7ServiceAliasInput) GetFolderPath() string { return v.FolderPath } + +// GetName returns L7ServiceAliasInput.Name, and is useful for accessing the field via an interface. +func (v *L7ServiceAliasInput) GetName() string { return v.Name } + +// GetChecksum returns L7ServiceAliasInput.Checksum, and is useful for accessing the field via an interface. +func (v *L7ServiceAliasInput) GetChecksum() string { return v.Checksum } + type L7ServiceInput struct { // The goid for this service Goid string `json:"goid"` @@ -1769,6 +1889,8 @@ type L7ServiceInput struct { ServiceType L7ServiceType `json:"serviceType"` // The configuration checksum Checksum string `json:"checksum"` + // The service version + Version int `json:"version"` // Whether or not the published service is enabled Enabled bool `json:"enabled"` // The folder path where to create this service. If the path does not exist, it will be created @@ -1790,7 +1912,7 @@ type L7ServiceInput struct { WsdlResources []*ServiceResourceInput `json:"wsdlResources,omitempty"` // The service policy Policy *PolicyInput `json:"policy,omitempty"` - // This will be ignored during the mutation + // (Deprecated) This will be ignored during the mutation PolicyRevision *PolicyRevisionInput `json:"policyRevision,omitempty"` // This will be ignored during the mutation PolicyRevisions []*PolicyRevisionInput `json:"policyRevisions,omitempty"` @@ -1817,6 +1939,9 @@ func (v *L7ServiceInput) GetServiceType() L7ServiceType { return v.ServiceType } // GetChecksum returns L7ServiceInput.Checksum, and is useful for accessing the field via an interface. func (v *L7ServiceInput) GetChecksum() string { return v.Checksum } +// GetVersion returns L7ServiceInput.Version, and is useful for accessing the field via an interface. +func (v *L7ServiceInput) GetVersion() int { return v.Version } + // GetEnabled returns L7ServiceInput.Enabled, and is useful for accessing the field via an interface. func (v *L7ServiceInput) GetEnabled() bool { return v.Enabled } @@ -2405,6 +2530,49 @@ func (v *PolicyBackedIdpInput) GetDefaultRoleName() string { return v.DefaultRol // GetProperties returns PolicyBackedIdpInput.Properties, and is useful for accessing the field via an interface. func (v *PolicyBackedIdpInput) GetProperties() []*EntityPropertyInput { return v.Properties } +type PolicyBackedServiceInput struct { + // The internal entity unique identifier + Goid string `json:"goid"` + // The policy-backed service name + Name string `json:"name"` + // The policy-backed service interface name + InterfaceName string `json:"interfaceName"` + // The policy-backed service operations + Operations []*PolicyBackedServiceOperationInput `json:"operations,omitempty"` + // Ignored at creation time but can be used to compare bundle with gw state + Checksum string `json:"checksum"` +} + +// GetGoid returns PolicyBackedServiceInput.Goid, and is useful for accessing the field via an interface. +func (v *PolicyBackedServiceInput) GetGoid() string { return v.Goid } + +// GetName returns PolicyBackedServiceInput.Name, and is useful for accessing the field via an interface. +func (v *PolicyBackedServiceInput) GetName() string { return v.Name } + +// GetInterfaceName returns PolicyBackedServiceInput.InterfaceName, and is useful for accessing the field via an interface. +func (v *PolicyBackedServiceInput) GetInterfaceName() string { return v.InterfaceName } + +// GetOperations returns PolicyBackedServiceInput.Operations, and is useful for accessing the field via an interface. +func (v *PolicyBackedServiceInput) GetOperations() []*PolicyBackedServiceOperationInput { + return v.Operations +} + +// GetChecksum returns PolicyBackedServiceInput.Checksum, and is useful for accessing the field via an interface. +func (v *PolicyBackedServiceInput) GetChecksum() string { return v.Checksum } + +type PolicyBackedServiceOperationInput struct { + // An operation associated with a policy-backed service + OperationName string `json:"operationName"` + // A backed policy defining the operation + PolicyName string `json:"policyName"` +} + +// GetOperationName returns PolicyBackedServiceOperationInput.OperationName, and is useful for accessing the field via an interface. +func (v *PolicyBackedServiceOperationInput) GetOperationName() string { return v.OperationName } + +// GetPolicyName returns PolicyBackedServiceOperationInput.PolicyName, and is useful for accessing the field via an interface. +func (v *PolicyBackedServiceOperationInput) GetPolicyName() string { return v.PolicyName } + type PolicyFragmentInput struct { // The internal entity unique identifier Goid string `json:"goid"` @@ -2746,6 +2914,44 @@ const ( SMCryptoModeFips SMCryptoMode = "FIPS" ) +// A SampleMessage Configuration. +// > @l7-entity +// > @l7-identity-fields name +// > @l7-summary-fields goid,name,checksum +// > @l7-excluded-fields +type SampleMessageInput struct { + // The goid for the SampleMessage + Goid string `json:"goid"` + // Name of a SampleMessage + Name string `json:"name"` + // The configuration checksum + Checksum string `json:"checksum"` + // sample message content + Content string `json:"content"` + // Operation name + OperationName string `json:"operationName"` + // The name of the service belongs to the sample message + ServiceName string `json:"serviceName"` +} + +// GetGoid returns SampleMessageInput.Goid, and is useful for accessing the field via an interface. +func (v *SampleMessageInput) GetGoid() string { return v.Goid } + +// GetName returns SampleMessageInput.Name, and is useful for accessing the field via an interface. +func (v *SampleMessageInput) GetName() string { return v.Name } + +// GetChecksum returns SampleMessageInput.Checksum, and is useful for accessing the field via an interface. +func (v *SampleMessageInput) GetChecksum() string { return v.Checksum } + +// GetContent returns SampleMessageInput.Content, and is useful for accessing the field via an interface. +func (v *SampleMessageInput) GetContent() string { return v.Content } + +// GetOperationName returns SampleMessageInput.OperationName, and is useful for accessing the field via an interface. +func (v *SampleMessageInput) GetOperationName() string { return v.OperationName } + +// GetServiceName returns SampleMessageInput.ServiceName, and is useful for accessing the field via an interface. +func (v *SampleMessageInput) GetServiceName() string { return v.ServiceName } + type ScheduledTaskInput struct { // The internal entity unique identifier Goid string `json:"goid"` @@ -2859,6 +3065,12 @@ type SecretInput struct { Secret string `json:"secret"` // Description of the password. This is optional Description string `json:"description"` + // PEM RSA Private Key Size in bits. Default: 2048 bits + KeySize int `json:"keySize,omitempty"` + // Public key of the secret. This can be ignored for set operation + PublicKey string `json:"publicKey,omitempty"` + // Last modified date of the secret. This can be ignored for set operation + LastModifiedDate time.Time `json:"lastModifiedDate"` } // GetName returns SecretInput.Name, and is useful for accessing the field via an interface. @@ -2882,6 +3094,15 @@ func (v *SecretInput) GetSecret() string { return v.Secret } // GetDescription returns SecretInput.Description, and is useful for accessing the field via an interface. func (v *SecretInput) GetDescription() string { return v.Description } +// GetKeySize returns SecretInput.KeySize, and is useful for accessing the field via an interface. +func (v *SecretInput) GetKeySize() int { return v.KeySize } + +// GetPublicKey returns SecretInput.PublicKey, and is useful for accessing the field via an interface. +func (v *SecretInput) GetPublicKey() string { return v.PublicKey } + +// GetLastModifiedDate returns SecretInput.LastModifiedDate, and is useful for accessing the field via an interface. +func (v *SecretInput) GetLastModifiedDate() time.Time { return v.LastModifiedDate } + type SecretType string const ( @@ -3406,18 +3627,25 @@ func (v *UserMappingInput) GetPasswdType() *PasswdStrategyInput { return v.Passw // IDP User Reference input type UserRefInput struct { + // The goid of user + Goid string `json:"goid"` // The name of user Name string `json:"name"` // The login identity of user Login string `json:"login"` // The DN of user SubjectDn string `json:"subjectDn"` + // The description of user + Description string `json:"description"` // The name of identity provider that the user belongs to ProviderName string `json:"providerName"` // The type of identity provider that the user belongs to ProviderType IdpType `json:"providerType"` } +// GetGoid returns UserRefInput.Goid, and is useful for accessing the field via an interface. +func (v *UserRefInput) GetGoid() string { return v.Goid } + // GetName returns UserRefInput.Name, and is useful for accessing the field via an interface. func (v *UserRefInput) GetName() string { return v.Name } @@ -3427,6 +3655,9 @@ func (v *UserRefInput) GetLogin() string { return v.Login } // GetSubjectDn returns UserRefInput.SubjectDn, and is useful for accessing the field via an interface. func (v *UserRefInput) GetSubjectDn() string { return v.SubjectDn } +// GetDescription returns UserRefInput.Description, and is useful for accessing the field via an interface. +func (v *UserRefInput) GetDescription() string { return v.Description } + // GetProviderName returns UserRefInput.ProviderName, and is useful for accessing the field via an interface. func (v *UserRefInput) GetProviderName() string { return v.ProviderName } @@ -3493,6 +3724,254 @@ func (v *WebApiServiceInput) GetProperties() []*EntityPropertyInput { return v.P // GetChecksum returns WebApiServiceInput.Checksum, and is useful for accessing the field via an interface. func (v *WebApiServiceInput) GetChecksum() string { return v.Checksum } +// __deleteBundleInput is used internally by genqlient +type __deleteBundleInput struct { + ActiveConnectors []*ActiveConnectorInput `json:"activeConnectors,omitempty"` + AdministrativeUserAccountProperties []*AdministrativeUserAccountPropertyInput `json:"administrativeUserAccountProperties,omitempty"` + BackgroundTaskPolicies []*BackgroundTaskPolicyInput `json:"backgroundTaskPolicies,omitempty"` + CassandraConnections []*CassandraConnectionInput `json:"cassandraConnections,omitempty"` + ClusterProperties []*ClusterPropertyInput `json:"clusterProperties,omitempty"` + Dtds []*DtdInput `json:"dtds,omitempty"` + EmailListeners []*EmailListenerInput `json:"emailListeners,omitempty"` + EncassConfigs []*EncassConfigInput `json:"encassConfigs,omitempty"` + FipGroups []*FipGroupInput `json:"fipGroups,omitempty"` + FipUsers []*FipUserInput `json:"fipUsers,omitempty"` + Fips []*FipInput `json:"fips,omitempty"` + FederatedGroups []*FederatedGroupInput `json:"federatedGroups,omitempty"` + FederatedUsers []*FederatedUserInput `json:"federatedUsers,omitempty"` + InternalIdps []*InternalIdpInput `json:"internalIdps,omitempty"` + FederatedIdps []*FederatedIdpInput `json:"federatedIdps,omitempty"` + LdapIdps []*LdapIdpInput `json:"ldapIdps,omitempty"` + SimpleLdapIdps []*SimpleLdapIdpInput `json:"simpleLdapIdps,omitempty"` + PolicyBackedIdps []*PolicyBackedIdpInput `json:"policyBackedIdps,omitempty"` + GlobalPolicies []*GlobalPolicyInput `json:"globalPolicies,omitempty"` + InternalGroups []*InternalGroupInput `json:"internalGroups,omitempty"` + InternalSoapServices []*SoapServiceInput `json:"internalSoapServices,omitempty"` + InternalUsers []*InternalUserInput `json:"internalUsers,omitempty"` + InternalWebApiServices []*WebApiServiceInput `json:"internalWebApiServices,omitempty"` + JdbcConnections []*JdbcConnectionInput `json:"jdbcConnections,omitempty"` + JmsDestinations []*JmsDestinationInput `json:"jmsDestinations,omitempty"` + KerberosConfigs []*KerberosConfigInput `json:"kerberosConfigs,omitempty"` + Keys []*KeyInput `json:"keys,omitempty"` + Ldaps []*LdapInput `json:"ldaps,omitempty"` + Roles []*RoleInput `json:"roles,omitempty"` + ListenPorts []*ListenPortInput `json:"listenPorts,omitempty"` + PasswordPolicies []*PasswordPolicyInput `json:"passwordPolicies,omitempty"` + Policies []*L7PolicyInput `json:"policies,omitempty"` + PolicyFragments []*PolicyFragmentInput `json:"policyFragments,omitempty"` + RevocationCheckPolicies []*RevocationCheckPolicyInput `json:"revocationCheckPolicies,omitempty"` + LogSinks []*LogSinkInput `json:"logSinks,omitempty"` + ScheduledTasks []*ScheduledTaskInput `json:"scheduledTasks,omitempty"` + Schemas []*SchemaInput `json:"schemas,omitempty"` + HttpConfigurations []*HttpConfigurationInput `json:"httpConfigurations,omitempty"` + CustomKeyValues []*CustomKeyValueInput `json:"customKeyValues,omitempty"` + Secrets []*SecretInput `json:"secrets,omitempty"` + ServerModuleFiles []*ServerModuleFileInput `json:"serverModuleFiles,omitempty"` + ServiceResolutionConfigs []*ServiceResolutionConfigInput `json:"serviceResolutionConfigs,omitempty"` + Folders []*FolderInput `json:"folders,omitempty"` + SmConfigs []*SMConfigInput `json:"smConfigs,omitempty"` + Services []*L7ServiceInput `json:"services,omitempty"` + SoapServices []*SoapServiceInput `json:"soapServices,omitempty"` + TrustedCerts []*TrustedCertInput `json:"trustedCerts,omitempty"` + WebApiServices []*WebApiServiceInput `json:"webApiServices,omitempty"` + GenericEntities []*GenericEntityInput `json:"genericEntities,omitempty"` + AuditConfigurations []*AuditConfigurationInput `json:"auditConfigurations,omitempty"` + PolicyBackedServices []*PolicyBackedServiceInput `json:"policyBackedServices,omitempty"` + PolicyAliases []*L7PolicyAliasInput `json:"policyAliases,omitempty"` + ServiceAliases []*L7ServiceAliasInput `json:"serviceAliases,omitempty"` + SampleMessages []*SampleMessageInput `json:"sampleMessages,omitempty"` +} + +// GetActiveConnectors returns __deleteBundleInput.ActiveConnectors, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetActiveConnectors() []*ActiveConnectorInput { + return v.ActiveConnectors +} + +// GetAdministrativeUserAccountProperties returns __deleteBundleInput.AdministrativeUserAccountProperties, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetAdministrativeUserAccountProperties() []*AdministrativeUserAccountPropertyInput { + return v.AdministrativeUserAccountProperties +} + +// GetBackgroundTaskPolicies returns __deleteBundleInput.BackgroundTaskPolicies, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetBackgroundTaskPolicies() []*BackgroundTaskPolicyInput { + return v.BackgroundTaskPolicies +} + +// GetCassandraConnections returns __deleteBundleInput.CassandraConnections, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetCassandraConnections() []*CassandraConnectionInput { + return v.CassandraConnections +} + +// GetClusterProperties returns __deleteBundleInput.ClusterProperties, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetClusterProperties() []*ClusterPropertyInput { + return v.ClusterProperties +} + +// GetDtds returns __deleteBundleInput.Dtds, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetDtds() []*DtdInput { return v.Dtds } + +// GetEmailListeners returns __deleteBundleInput.EmailListeners, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetEmailListeners() []*EmailListenerInput { return v.EmailListeners } + +// GetEncassConfigs returns __deleteBundleInput.EncassConfigs, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetEncassConfigs() []*EncassConfigInput { return v.EncassConfigs } + +// GetFipGroups returns __deleteBundleInput.FipGroups, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetFipGroups() []*FipGroupInput { return v.FipGroups } + +// GetFipUsers returns __deleteBundleInput.FipUsers, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetFipUsers() []*FipUserInput { return v.FipUsers } + +// GetFips returns __deleteBundleInput.Fips, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetFips() []*FipInput { return v.Fips } + +// GetFederatedGroups returns __deleteBundleInput.FederatedGroups, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetFederatedGroups() []*FederatedGroupInput { return v.FederatedGroups } + +// GetFederatedUsers returns __deleteBundleInput.FederatedUsers, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetFederatedUsers() []*FederatedUserInput { return v.FederatedUsers } + +// GetInternalIdps returns __deleteBundleInput.InternalIdps, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetInternalIdps() []*InternalIdpInput { return v.InternalIdps } + +// GetFederatedIdps returns __deleteBundleInput.FederatedIdps, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetFederatedIdps() []*FederatedIdpInput { return v.FederatedIdps } + +// GetLdapIdps returns __deleteBundleInput.LdapIdps, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetLdapIdps() []*LdapIdpInput { return v.LdapIdps } + +// GetSimpleLdapIdps returns __deleteBundleInput.SimpleLdapIdps, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetSimpleLdapIdps() []*SimpleLdapIdpInput { return v.SimpleLdapIdps } + +// GetPolicyBackedIdps returns __deleteBundleInput.PolicyBackedIdps, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetPolicyBackedIdps() []*PolicyBackedIdpInput { + return v.PolicyBackedIdps +} + +// GetGlobalPolicies returns __deleteBundleInput.GlobalPolicies, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetGlobalPolicies() []*GlobalPolicyInput { return v.GlobalPolicies } + +// GetInternalGroups returns __deleteBundleInput.InternalGroups, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetInternalGroups() []*InternalGroupInput { return v.InternalGroups } + +// GetInternalSoapServices returns __deleteBundleInput.InternalSoapServices, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetInternalSoapServices() []*SoapServiceInput { + return v.InternalSoapServices +} + +// GetInternalUsers returns __deleteBundleInput.InternalUsers, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetInternalUsers() []*InternalUserInput { return v.InternalUsers } + +// GetInternalWebApiServices returns __deleteBundleInput.InternalWebApiServices, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetInternalWebApiServices() []*WebApiServiceInput { + return v.InternalWebApiServices +} + +// GetJdbcConnections returns __deleteBundleInput.JdbcConnections, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetJdbcConnections() []*JdbcConnectionInput { return v.JdbcConnections } + +// GetJmsDestinations returns __deleteBundleInput.JmsDestinations, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetJmsDestinations() []*JmsDestinationInput { return v.JmsDestinations } + +// GetKerberosConfigs returns __deleteBundleInput.KerberosConfigs, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetKerberosConfigs() []*KerberosConfigInput { return v.KerberosConfigs } + +// GetKeys returns __deleteBundleInput.Keys, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetKeys() []*KeyInput { return v.Keys } + +// GetLdaps returns __deleteBundleInput.Ldaps, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetLdaps() []*LdapInput { return v.Ldaps } + +// GetRoles returns __deleteBundleInput.Roles, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetRoles() []*RoleInput { return v.Roles } + +// GetListenPorts returns __deleteBundleInput.ListenPorts, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetListenPorts() []*ListenPortInput { return v.ListenPorts } + +// GetPasswordPolicies returns __deleteBundleInput.PasswordPolicies, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetPasswordPolicies() []*PasswordPolicyInput { return v.PasswordPolicies } + +// GetPolicies returns __deleteBundleInput.Policies, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetPolicies() []*L7PolicyInput { return v.Policies } + +// GetPolicyFragments returns __deleteBundleInput.PolicyFragments, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetPolicyFragments() []*PolicyFragmentInput { return v.PolicyFragments } + +// GetRevocationCheckPolicies returns __deleteBundleInput.RevocationCheckPolicies, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetRevocationCheckPolicies() []*RevocationCheckPolicyInput { + return v.RevocationCheckPolicies +} + +// GetLogSinks returns __deleteBundleInput.LogSinks, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetLogSinks() []*LogSinkInput { return v.LogSinks } + +// GetScheduledTasks returns __deleteBundleInput.ScheduledTasks, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetScheduledTasks() []*ScheduledTaskInput { return v.ScheduledTasks } + +// GetSchemas returns __deleteBundleInput.Schemas, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetSchemas() []*SchemaInput { return v.Schemas } + +// GetHttpConfigurations returns __deleteBundleInput.HttpConfigurations, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetHttpConfigurations() []*HttpConfigurationInput { + return v.HttpConfigurations +} + +// GetCustomKeyValues returns __deleteBundleInput.CustomKeyValues, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetCustomKeyValues() []*CustomKeyValueInput { return v.CustomKeyValues } + +// GetSecrets returns __deleteBundleInput.Secrets, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetSecrets() []*SecretInput { return v.Secrets } + +// GetServerModuleFiles returns __deleteBundleInput.ServerModuleFiles, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetServerModuleFiles() []*ServerModuleFileInput { + return v.ServerModuleFiles +} + +// GetServiceResolutionConfigs returns __deleteBundleInput.ServiceResolutionConfigs, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetServiceResolutionConfigs() []*ServiceResolutionConfigInput { + return v.ServiceResolutionConfigs +} + +// GetFolders returns __deleteBundleInput.Folders, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetFolders() []*FolderInput { return v.Folders } + +// GetSmConfigs returns __deleteBundleInput.SmConfigs, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetSmConfigs() []*SMConfigInput { return v.SmConfigs } + +// GetServices returns __deleteBundleInput.Services, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetServices() []*L7ServiceInput { return v.Services } + +// GetSoapServices returns __deleteBundleInput.SoapServices, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetSoapServices() []*SoapServiceInput { return v.SoapServices } + +// GetTrustedCerts returns __deleteBundleInput.TrustedCerts, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetTrustedCerts() []*TrustedCertInput { return v.TrustedCerts } + +// GetWebApiServices returns __deleteBundleInput.WebApiServices, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetWebApiServices() []*WebApiServiceInput { return v.WebApiServices } + +// GetGenericEntities returns __deleteBundleInput.GenericEntities, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetGenericEntities() []*GenericEntityInput { return v.GenericEntities } + +// GetAuditConfigurations returns __deleteBundleInput.AuditConfigurations, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetAuditConfigurations() []*AuditConfigurationInput { + return v.AuditConfigurations +} + +// GetPolicyBackedServices returns __deleteBundleInput.PolicyBackedServices, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetPolicyBackedServices() []*PolicyBackedServiceInput { + return v.PolicyBackedServices +} + +// GetPolicyAliases returns __deleteBundleInput.PolicyAliases, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetPolicyAliases() []*L7PolicyAliasInput { return v.PolicyAliases } + +// GetServiceAliases returns __deleteBundleInput.ServiceAliases, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetServiceAliases() []*L7ServiceAliasInput { return v.ServiceAliases } + +// GetSampleMessages returns __deleteBundleInput.SampleMessages, and is useful for accessing the field via an interface. +func (v *__deleteBundleInput) GetSampleMessages() []*SampleMessageInput { return v.SampleMessages } + // __deleteKeysInput is used internally by genqlient type __deleteKeysInput struct { Keys []string `json:"keys"` @@ -3554,6 +4033,7 @@ type __installBundleInput struct { InternalWebApiServices []*WebApiServiceInput `json:"internalWebApiServices,omitempty"` JdbcConnections []*JdbcConnectionInput `json:"jdbcConnections,omitempty"` JmsDestinations []*JmsDestinationInput `json:"jmsDestinations,omitempty"` + KerberosConfigs []*KerberosConfigInput `json:"kerberosConfigs,omitempty"` Keys []*KeyInput `json:"keys,omitempty"` Ldaps []*LdapInput `json:"ldaps,omitempty"` Roles []*RoleInput `json:"roles,omitempty"` @@ -3578,7 +4058,10 @@ type __installBundleInput struct { WebApiServices []*WebApiServiceInput `json:"webApiServices,omitempty"` GenericEntities []*GenericEntityInput `json:"genericEntities,omitempty"` AuditConfigurations []*AuditConfigurationInput `json:"auditConfigurations,omitempty"` - KerberosConfigs []*KerberosConfigInput `json:"kerberosConfigs,omitempty"` + PolicyBackedServices []*PolicyBackedServiceInput `json:"policyBackedServices,omitempty"` + PolicyAliases []*L7PolicyAliasInput `json:"policyAliases,omitempty"` + ServiceAliases []*L7ServiceAliasInput `json:"serviceAliases,omitempty"` + SampleMessages []*SampleMessageInput `json:"sampleMessages,omitempty"` } // GetActiveConnectors returns __installBundleInput.ActiveConnectors, and is useful for accessing the field via an interface. @@ -3672,6 +4155,9 @@ func (v *__installBundleInput) GetJdbcConnections() []*JdbcConnectionInput { ret // GetJmsDestinations returns __installBundleInput.JmsDestinations, and is useful for accessing the field via an interface. func (v *__installBundleInput) GetJmsDestinations() []*JmsDestinationInput { return v.JmsDestinations } +// GetKerberosConfigs returns __installBundleInput.KerberosConfigs, and is useful for accessing the field via an interface. +func (v *__installBundleInput) GetKerberosConfigs() []*KerberosConfigInput { return v.KerberosConfigs } + // GetKeys returns __installBundleInput.Keys, and is useful for accessing the field via an interface. func (v *__installBundleInput) GetKeys() []*KeyInput { return v.Keys } @@ -3756,38 +4242,4776 @@ func (v *__installBundleInput) GetAuditConfigurations() []*AuditConfigurationInp return v.AuditConfigurations } -// GetKerberosConfigs returns __installBundleInput.KerberosConfigs, and is useful for accessing the field via an interface. -func (v *__installBundleInput) GetKerberosConfigs() []*KerberosConfigInput { return v.KerberosConfigs } - -// deleteKeysDeleteKeysKeysPayload includes the requested fields of the GraphQL type KeysPayload. -type deleteKeysDeleteKeysKeysPayload struct { - DetailedStatus []*deleteKeysDeleteKeysKeysPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` - Keys []*deleteKeysDeleteKeysKeysPayloadKeysKey `json:"keys"` -} - -// GetDetailedStatus returns deleteKeysDeleteKeysKeysPayload.DetailedStatus, and is useful for accessing the field via an interface. -func (v *deleteKeysDeleteKeysKeysPayload) GetDetailedStatus() []*deleteKeysDeleteKeysKeysPayloadDetailedStatusEntityMutationDetailedStatus { - return v.DetailedStatus +// GetPolicyBackedServices returns __installBundleInput.PolicyBackedServices, and is useful for accessing the field via an interface. +func (v *__installBundleInput) GetPolicyBackedServices() []*PolicyBackedServiceInput { + return v.PolicyBackedServices } -// GetKeys returns deleteKeysDeleteKeysKeysPayload.Keys, and is useful for accessing the field via an interface. -func (v *deleteKeysDeleteKeysKeysPayload) GetKeys() []*deleteKeysDeleteKeysKeysPayloadKeysKey { - return v.Keys -} +// GetPolicyAliases returns __installBundleInput.PolicyAliases, and is useful for accessing the field via an interface. +func (v *__installBundleInput) GetPolicyAliases() []*L7PolicyAliasInput { return v.PolicyAliases } -// deleteKeysDeleteKeysKeysPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. -type deleteKeysDeleteKeysKeysPayloadDetailedStatusEntityMutationDetailedStatus struct { - Status EntityMutationStatus `json:"status"` - Description string `json:"description"` -} +// GetServiceAliases returns __installBundleInput.ServiceAliases, and is useful for accessing the field via an interface. +func (v *__installBundleInput) GetServiceAliases() []*L7ServiceAliasInput { return v.ServiceAliases } -// GetStatus returns deleteKeysDeleteKeysKeysPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. -func (v *deleteKeysDeleteKeysKeysPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { - return v.Status -} +// GetSampleMessages returns __installBundleInput.SampleMessages, and is useful for accessing the field via an interface. +func (v *__installBundleInput) GetSampleMessages() []*SampleMessageInput { return v.SampleMessages } -// GetDescription returns deleteKeysDeleteKeysKeysPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. -func (v *deleteKeysDeleteKeysKeysPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { +// deleteBundleResponse is returned by deleteBundle on success. +type deleteBundleResponse struct { + SetAuditConfigurations *deleteBundleSetAuditConfigurationsAuditConfigurationsPayload `json:"setAuditConfigurations"` + // Update Roles with user/group assignees. + // Note: Creating a role is unsupported. + SetRoles *deleteBundleSetRolesRolesPayload `json:"setRoles"` + // Create or update Log Sinks. + // If Log Sink with the same name exist, the Log Sink will be updated. + // If no Log Sink with the name exist, a new Log Sink will be created. + SetLogSinks *deleteBundleSetLogSinksLogSinksPayload `json:"setLogSinks"` + // Creates or updates one or more scheduled tasks + SetScheduledTasks *deleteBundleSetScheduledTasksScheduledTasksPayload `json:"setScheduledTasks"` + // Create or update existing active connector. + // Match is carried by name. If match is found, it will be updated. Otherwise, it will be created. + SetActiveConnectors *deleteBundleSetActiveConnectorsActiveConnectorsPayload `json:"setActiveConnectors"` + // Create or update Listen Ports. + // If Listen Port with the same name exist, the Listen Port will be updated. + // If no Listen Port with the name exist, a new Listen Port will be created. + SetListenPorts *deleteBundleSetListenPortsListenPortsPayload `json:"setListenPorts"` + // Create or update existing email listeners. + // Match is carried by name. If match is found, it will be updated. Otherwise, it will be created. + SetEmailListeners *deleteBundleSetEmailListenersEmailListenersPayload `json:"setEmailListeners"` + // (Experimental) + // Create/update the Kerberos configurations. + // Automatically generates the Kerberos login config file, "login.config", and + // Kerberos config file, "krb5.conf" (unless the cluster-wide property + // kerberos.krb5Config.overwrite=false and it is set in the mutation). + SetKerberosConfigs *deleteBundleSetKerberosConfigsKerberosConfigPayload `json:"setKerberosConfigs"` + // Create or update JMS destinations. + // If JMS destination exists, the JMS destination will be updated. + // If no JMS destination with given name, direction, providerType exist, a new JMS destination will be created. + SetJmsDestinations *deleteBundleSetJmsDestinationsJmsDestinationsPayload `json:"setJmsDestinations"` + // Creates or updates one or more policy backed ldaps + SetPolicyBackedIdps *deleteBundleSetPolicyBackedIdpsPolicyBackedIdpsPayload `json:"setPolicyBackedIdps"` + // Create or update existing generic entities. + // Match is carried by name. If match is found, it will be updated. Otherwise, it will be created. + SetGenericEntities *deleteBundleSetGenericEntitiesGenericEntitiesPayload `json:"setGenericEntities"` + // Create or update existing policy-backed service. + // Match is carried by name. If match is found, it will be updated. Otherwise, it will be created. + SetPolicyBackedServices *deleteBundleSetPolicyBackedServicesPolicyBackedServicesPayload `json:"setPolicyBackedServices"` + // Create/Update Sample Messages. + SetSampleMessages *deleteBundleSetSampleMessagesSampleMessagesPayload `json:"setSampleMessages"` + // Create or update service aliases + SetServiceAliases *deleteBundleSetServiceAliasesL7ServiceAliasesPayload `json:"setServiceAliases"` + // Create or update services + SetServices *deleteBundleSetServicesL7ServicesPayload `json:"setServices"` + // Create or update Internal soap services + SetInternalSoapServices *deleteBundleSetInternalSoapServicesInternalSoapServicesPayload `json:"setInternalSoapServices"` + // Create or update Internal web api services + SetInternalWebApiServices *deleteBundleSetInternalWebApiServicesInternalWebApiServicesPayload `json:"setInternalWebApiServices"` + // Create or update soap services + SetSoapServices *deleteBundleSetSoapServicesSoapServicesPayload `json:"setSoapServices"` + // Create or update web api services + SetWebApiServices *deleteBundleSetWebApiServicesWebApiServicesPayload `json:"setWebApiServices"` + // Create or update Encapsulated Assertion Configurations + SetEncassConfigs *deleteBundleSetEncassConfigsEncassConfigsPayload `json:"setEncassConfigs"` + // Create or update policy aliases + SetPolicyAliases *deleteBundleSetPolicyAliasesL7PolicyAliasesPayload `json:"setPolicyAliases"` + // Create or update policies + SetPolicies *deleteBundleSetPoliciesL7PoliciesPayload `json:"setPolicies"` + // Creates or updates one or more background task policies + SetBackgroundTaskPolicies *deleteBundleSetBackgroundTaskPoliciesBackgroundTaskPoliciesPayload `json:"setBackgroundTaskPolicies"` + // Create or update global policies + SetGlobalPolicies *deleteBundleSetGlobalPoliciesGlobalPoliciesPayload `json:"setGlobalPolicies"` + // Create or update policy fragments + SetPolicyFragments *deleteBundleSetPolicyFragmentsPolicyFragmentsPayload `json:"setPolicyFragments"` + // Create or update existing siteminder configurations. + // Match is carried by name. If match is found, it will be updated. Otherwise, it will be created + SetSMConfigs *deleteBundleSetSMConfigsSMConfigsPayload `json:"setSMConfigs"` + // Create or update Cassandra connections. + // If Cassandra connection with the same name exist, the Cassandra connection will be updated. + // If no Cassandra connection with the name exist, a new Cassandra connection will be created. + SetCassandraConnections *deleteBundleSetCassandraConnectionsCassandraConnectionsPayload `json:"setCassandraConnections"` + // Creates or updates one or more internal users + SetInternalUsers *deleteBundleSetInternalUsersInternalUsersPayload `json:"setInternalUsers"` + // Creates or updates one or more fip users. + // NOTE: Existing user will be found by either login or subjectDn or name. + SetFederatedUsers *deleteBundleSetFederatedUsersFederatedUsersPayload `json:"setFederatedUsers"` + // Creates or updates one or more fip users. + // NOTE: Existing user will be found by either login or subjectDn or name. + SetFipUsers *deleteBundleSetFipUsersFipUsersPayload `json:"setFipUsers"` + // Creates or updates one or more internal groups + SetInternalGroups *deleteBundleSetInternalGroupsInternalGroupsPayload `json:"setInternalGroups"` + // Creates or updates one or more fip groups + SetFederatedGroups *deleteBundleSetFederatedGroupsFederatedGroupsPayload `json:"setFederatedGroups"` + // Creates or updates one or more fip groups + SetFipGroups *deleteBundleSetFipGroupsFipGroupsPayload `json:"setFipGroups"` + // Creates or updates one or more simple ldaps + SetSimpleLdapIdps *deleteBundleSetSimpleLdapIdpsSimpleLdapIdpsPayload `json:"setSimpleLdapIdps"` + // Creates or updates one or more ldaps + SetLdapIdps *deleteBundleSetLdapIdpsLdapIdpsPayload `json:"setLdapIdps"` + // Creates or updates one or more fips + SetFederatedIdps *deleteBundleSetFederatedIdpsFederatedIdpsPayload `json:"setFederatedIdps"` + // Creates or updates one ore more internal IDP configurations + SetInternalIdps *deleteBundleSetInternalIdpsInternalIdpsPayload `json:"setInternalIdps"` + // Creates or updates one or more ldaps + SetLdaps *deleteBundleSetLdapsLdapsPayload `json:"setLdaps"` + // Creates or updates one or more fips + SetFips *deleteBundleSetFipsFipsPayload `json:"setFips"` + // Create or update JDBC connections. + // If JDBC connection with the same name exist, the JDBC connection will be updated. + // If no JDBC connection with the name exist, a new JDBC connection will be created. + SetJdbcConnections *deleteBundleSetJdbcConnectionsJdbcConnectionsPayload `json:"setJdbcConnections"` + // Create or Update multiple DTD resources + SetDtds *deleteBundleSetDtdsDtdsPayload `json:"setDtds"` + // Create or Update multiple XML schemas + SetSchemas *deleteBundleSetSchemasSchemasPayload `json:"setSchemas"` + // Create or update existing custom key values data. If a custom key value with the given key does not + // exist, one will be created, otherwise the existing one will be updated. This returns the list of + // entities created and/or updated + SetCustomKeyValues *deleteBundleSetCustomKeyValuesCustomKeyValuePayload `json:"setCustomKeyValues"` + // Create or update existing http configuration. + SetHttpConfigurations *deleteBundleSetHttpConfigurationsHttpConfigurationsPayload `json:"setHttpConfigurations"` + // Creates or updates one or more secrets + SetSecrets *deleteBundleSetSecretsSecretsPayload `json:"setSecrets"` + // Create or update trusted certificates. + // If a certificate with the same sha1 thumbprint already exist, it will be updated. + SetTrustedCerts *deleteBundleSetTrustedCertsTrustedCertsPayload `json:"setTrustedCerts"` + // Create or update existing revocation check policies. + // Match is carried by name. If match is found, it will be updated. Otherwise, it will be created. + SetRevocationCheckPolicies *deleteBundleSetRevocationCheckPoliciesRevocationCheckPoliciesPayload `json:"setRevocationCheckPolicies"` + // Set the Folders + SetFolders *deleteBundleSetFoldersFoldersPayload `json:"setFolders"` + // Create or update existing Administrative User Account Minimum cluster properties. + // If Administrative User Account Minimum cluster property with the given name + // does not exist, one will be created, otherwise the existing one will be updated. + // This returns the list of entities created and/or updated. + // Below are the allowed Administrative User Account Minimum properties + // logonMaxAllowableAttempts : Logon attempts must be between 1 and 20 + // logonLockoutTime : Lockout period must be between 1 and 86400 seconds + // logonSessionExpiry : Expiry period must be between 1 and 86400 seconds + // logonInactivityPeriod : Inactivity period must be between 1 and 365 days + SetAdministrativeUserAccountProperties *deleteBundleSetAdministrativeUserAccountPropertiesAdministrativeUserAccountPropertiesPayload `json:"setAdministrativeUserAccountProperties"` + // Set/Update the Password Policies + SetPasswordPolicies *deleteBundleSetPasswordPoliciesPasswordPoliciesPayLoad `json:"setPasswordPolicies"` + // Update Service Resolution Configs + SetServiceResolutionConfigs *deleteBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoad `json:"setServiceResolutionConfigs"` + // Create or update existing cluster properties. If a cluster property with the given name does not + // exist, one will be created, otherwise the existing one will be updated. This returns the list of + // entities created and/or updated + SetClusterProperties *deleteBundleSetClusterPropertiesClusterPropertiesPayload `json:"setClusterProperties"` + // Sets Server module files. Updating the existing server module file is unsupported. + SetServerModuleFiles *deleteBundleSetServerModuleFilesServerModuleFilesPayload `json:"setServerModuleFiles"` + // Creates or updates one or more keys + SetKeys *deleteBundleSetKeysKeysPayload `json:"setKeys"` +} + +// GetSetAuditConfigurations returns deleteBundleResponse.SetAuditConfigurations, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetAuditConfigurations() *deleteBundleSetAuditConfigurationsAuditConfigurationsPayload { + return v.SetAuditConfigurations +} + +// GetSetRoles returns deleteBundleResponse.SetRoles, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetRoles() *deleteBundleSetRolesRolesPayload { return v.SetRoles } + +// GetSetLogSinks returns deleteBundleResponse.SetLogSinks, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetLogSinks() *deleteBundleSetLogSinksLogSinksPayload { + return v.SetLogSinks +} + +// GetSetScheduledTasks returns deleteBundleResponse.SetScheduledTasks, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetScheduledTasks() *deleteBundleSetScheduledTasksScheduledTasksPayload { + return v.SetScheduledTasks +} + +// GetSetActiveConnectors returns deleteBundleResponse.SetActiveConnectors, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetActiveConnectors() *deleteBundleSetActiveConnectorsActiveConnectorsPayload { + return v.SetActiveConnectors +} + +// GetSetListenPorts returns deleteBundleResponse.SetListenPorts, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetListenPorts() *deleteBundleSetListenPortsListenPortsPayload { + return v.SetListenPorts +} + +// GetSetEmailListeners returns deleteBundleResponse.SetEmailListeners, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetEmailListeners() *deleteBundleSetEmailListenersEmailListenersPayload { + return v.SetEmailListeners +} + +// GetSetKerberosConfigs returns deleteBundleResponse.SetKerberosConfigs, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetKerberosConfigs() *deleteBundleSetKerberosConfigsKerberosConfigPayload { + return v.SetKerberosConfigs +} + +// GetSetJmsDestinations returns deleteBundleResponse.SetJmsDestinations, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetJmsDestinations() *deleteBundleSetJmsDestinationsJmsDestinationsPayload { + return v.SetJmsDestinations +} + +// GetSetPolicyBackedIdps returns deleteBundleResponse.SetPolicyBackedIdps, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetPolicyBackedIdps() *deleteBundleSetPolicyBackedIdpsPolicyBackedIdpsPayload { + return v.SetPolicyBackedIdps +} + +// GetSetGenericEntities returns deleteBundleResponse.SetGenericEntities, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetGenericEntities() *deleteBundleSetGenericEntitiesGenericEntitiesPayload { + return v.SetGenericEntities +} + +// GetSetPolicyBackedServices returns deleteBundleResponse.SetPolicyBackedServices, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetPolicyBackedServices() *deleteBundleSetPolicyBackedServicesPolicyBackedServicesPayload { + return v.SetPolicyBackedServices +} + +// GetSetSampleMessages returns deleteBundleResponse.SetSampleMessages, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetSampleMessages() *deleteBundleSetSampleMessagesSampleMessagesPayload { + return v.SetSampleMessages +} + +// GetSetServiceAliases returns deleteBundleResponse.SetServiceAliases, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetServiceAliases() *deleteBundleSetServiceAliasesL7ServiceAliasesPayload { + return v.SetServiceAliases +} + +// GetSetServices returns deleteBundleResponse.SetServices, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetServices() *deleteBundleSetServicesL7ServicesPayload { + return v.SetServices +} + +// GetSetInternalSoapServices returns deleteBundleResponse.SetInternalSoapServices, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetInternalSoapServices() *deleteBundleSetInternalSoapServicesInternalSoapServicesPayload { + return v.SetInternalSoapServices +} + +// GetSetInternalWebApiServices returns deleteBundleResponse.SetInternalWebApiServices, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetInternalWebApiServices() *deleteBundleSetInternalWebApiServicesInternalWebApiServicesPayload { + return v.SetInternalWebApiServices +} + +// GetSetSoapServices returns deleteBundleResponse.SetSoapServices, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetSoapServices() *deleteBundleSetSoapServicesSoapServicesPayload { + return v.SetSoapServices +} + +// GetSetWebApiServices returns deleteBundleResponse.SetWebApiServices, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetWebApiServices() *deleteBundleSetWebApiServicesWebApiServicesPayload { + return v.SetWebApiServices +} + +// GetSetEncassConfigs returns deleteBundleResponse.SetEncassConfigs, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetEncassConfigs() *deleteBundleSetEncassConfigsEncassConfigsPayload { + return v.SetEncassConfigs +} + +// GetSetPolicyAliases returns deleteBundleResponse.SetPolicyAliases, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetPolicyAliases() *deleteBundleSetPolicyAliasesL7PolicyAliasesPayload { + return v.SetPolicyAliases +} + +// GetSetPolicies returns deleteBundleResponse.SetPolicies, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetPolicies() *deleteBundleSetPoliciesL7PoliciesPayload { + return v.SetPolicies +} + +// GetSetBackgroundTaskPolicies returns deleteBundleResponse.SetBackgroundTaskPolicies, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetBackgroundTaskPolicies() *deleteBundleSetBackgroundTaskPoliciesBackgroundTaskPoliciesPayload { + return v.SetBackgroundTaskPolicies +} + +// GetSetGlobalPolicies returns deleteBundleResponse.SetGlobalPolicies, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetGlobalPolicies() *deleteBundleSetGlobalPoliciesGlobalPoliciesPayload { + return v.SetGlobalPolicies +} + +// GetSetPolicyFragments returns deleteBundleResponse.SetPolicyFragments, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetPolicyFragments() *deleteBundleSetPolicyFragmentsPolicyFragmentsPayload { + return v.SetPolicyFragments +} + +// GetSetSMConfigs returns deleteBundleResponse.SetSMConfigs, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetSMConfigs() *deleteBundleSetSMConfigsSMConfigsPayload { + return v.SetSMConfigs +} + +// GetSetCassandraConnections returns deleteBundleResponse.SetCassandraConnections, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetCassandraConnections() *deleteBundleSetCassandraConnectionsCassandraConnectionsPayload { + return v.SetCassandraConnections +} + +// GetSetInternalUsers returns deleteBundleResponse.SetInternalUsers, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetInternalUsers() *deleteBundleSetInternalUsersInternalUsersPayload { + return v.SetInternalUsers +} + +// GetSetFederatedUsers returns deleteBundleResponse.SetFederatedUsers, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetFederatedUsers() *deleteBundleSetFederatedUsersFederatedUsersPayload { + return v.SetFederatedUsers +} + +// GetSetFipUsers returns deleteBundleResponse.SetFipUsers, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetFipUsers() *deleteBundleSetFipUsersFipUsersPayload { + return v.SetFipUsers +} + +// GetSetInternalGroups returns deleteBundleResponse.SetInternalGroups, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetInternalGroups() *deleteBundleSetInternalGroupsInternalGroupsPayload { + return v.SetInternalGroups +} + +// GetSetFederatedGroups returns deleteBundleResponse.SetFederatedGroups, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetFederatedGroups() *deleteBundleSetFederatedGroupsFederatedGroupsPayload { + return v.SetFederatedGroups +} + +// GetSetFipGroups returns deleteBundleResponse.SetFipGroups, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetFipGroups() *deleteBundleSetFipGroupsFipGroupsPayload { + return v.SetFipGroups +} + +// GetSetSimpleLdapIdps returns deleteBundleResponse.SetSimpleLdapIdps, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetSimpleLdapIdps() *deleteBundleSetSimpleLdapIdpsSimpleLdapIdpsPayload { + return v.SetSimpleLdapIdps +} + +// GetSetLdapIdps returns deleteBundleResponse.SetLdapIdps, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetLdapIdps() *deleteBundleSetLdapIdpsLdapIdpsPayload { + return v.SetLdapIdps +} + +// GetSetFederatedIdps returns deleteBundleResponse.SetFederatedIdps, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetFederatedIdps() *deleteBundleSetFederatedIdpsFederatedIdpsPayload { + return v.SetFederatedIdps +} + +// GetSetInternalIdps returns deleteBundleResponse.SetInternalIdps, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetInternalIdps() *deleteBundleSetInternalIdpsInternalIdpsPayload { + return v.SetInternalIdps +} + +// GetSetLdaps returns deleteBundleResponse.SetLdaps, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetLdaps() *deleteBundleSetLdapsLdapsPayload { return v.SetLdaps } + +// GetSetFips returns deleteBundleResponse.SetFips, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetFips() *deleteBundleSetFipsFipsPayload { return v.SetFips } + +// GetSetJdbcConnections returns deleteBundleResponse.SetJdbcConnections, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetJdbcConnections() *deleteBundleSetJdbcConnectionsJdbcConnectionsPayload { + return v.SetJdbcConnections +} + +// GetSetDtds returns deleteBundleResponse.SetDtds, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetDtds() *deleteBundleSetDtdsDtdsPayload { return v.SetDtds } + +// GetSetSchemas returns deleteBundleResponse.SetSchemas, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetSchemas() *deleteBundleSetSchemasSchemasPayload { + return v.SetSchemas +} + +// GetSetCustomKeyValues returns deleteBundleResponse.SetCustomKeyValues, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetCustomKeyValues() *deleteBundleSetCustomKeyValuesCustomKeyValuePayload { + return v.SetCustomKeyValues +} + +// GetSetHttpConfigurations returns deleteBundleResponse.SetHttpConfigurations, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetHttpConfigurations() *deleteBundleSetHttpConfigurationsHttpConfigurationsPayload { + return v.SetHttpConfigurations +} + +// GetSetSecrets returns deleteBundleResponse.SetSecrets, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetSecrets() *deleteBundleSetSecretsSecretsPayload { + return v.SetSecrets +} + +// GetSetTrustedCerts returns deleteBundleResponse.SetTrustedCerts, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetTrustedCerts() *deleteBundleSetTrustedCertsTrustedCertsPayload { + return v.SetTrustedCerts +} + +// GetSetRevocationCheckPolicies returns deleteBundleResponse.SetRevocationCheckPolicies, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetRevocationCheckPolicies() *deleteBundleSetRevocationCheckPoliciesRevocationCheckPoliciesPayload { + return v.SetRevocationCheckPolicies +} + +// GetSetFolders returns deleteBundleResponse.SetFolders, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetFolders() *deleteBundleSetFoldersFoldersPayload { + return v.SetFolders +} + +// GetSetAdministrativeUserAccountProperties returns deleteBundleResponse.SetAdministrativeUserAccountProperties, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetAdministrativeUserAccountProperties() *deleteBundleSetAdministrativeUserAccountPropertiesAdministrativeUserAccountPropertiesPayload { + return v.SetAdministrativeUserAccountProperties +} + +// GetSetPasswordPolicies returns deleteBundleResponse.SetPasswordPolicies, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetPasswordPolicies() *deleteBundleSetPasswordPoliciesPasswordPoliciesPayLoad { + return v.SetPasswordPolicies +} + +// GetSetServiceResolutionConfigs returns deleteBundleResponse.SetServiceResolutionConfigs, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetServiceResolutionConfigs() *deleteBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoad { + return v.SetServiceResolutionConfigs +} + +// GetSetClusterProperties returns deleteBundleResponse.SetClusterProperties, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetClusterProperties() *deleteBundleSetClusterPropertiesClusterPropertiesPayload { + return v.SetClusterProperties +} + +// GetSetServerModuleFiles returns deleteBundleResponse.SetServerModuleFiles, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetServerModuleFiles() *deleteBundleSetServerModuleFilesServerModuleFilesPayload { + return v.SetServerModuleFiles +} + +// GetSetKeys returns deleteBundleResponse.SetKeys, and is useful for accessing the field via an interface. +func (v *deleteBundleResponse) GetSetKeys() *deleteBundleSetKeysKeysPayload { return v.SetKeys } + +// deleteBundleSetActiveConnectorsActiveConnectorsPayload includes the requested fields of the GraphQL type ActiveConnectorsPayload. +type deleteBundleSetActiveConnectorsActiveConnectorsPayload struct { + DetailedStatus []*deleteBundleSetActiveConnectorsActiveConnectorsPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetActiveConnectorsActiveConnectorsPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetActiveConnectorsActiveConnectorsPayload) GetDetailedStatus() []*deleteBundleSetActiveConnectorsActiveConnectorsPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetActiveConnectorsActiveConnectorsPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetActiveConnectorsActiveConnectorsPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetActiveConnectorsActiveConnectorsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetActiveConnectorsActiveConnectorsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetActiveConnectorsActiveConnectorsPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetActiveConnectorsActiveConnectorsPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetActiveConnectorsActiveConnectorsPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetActiveConnectorsActiveConnectorsPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetActiveConnectorsActiveConnectorsPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetActiveConnectorsActiveConnectorsPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetActiveConnectorsActiveConnectorsPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetActiveConnectorsActiveConnectorsPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetActiveConnectorsActiveConnectorsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetActiveConnectorsActiveConnectorsPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetActiveConnectorsActiveConnectorsPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetActiveConnectorsActiveConnectorsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetActiveConnectorsActiveConnectorsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetActiveConnectorsActiveConnectorsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetActiveConnectorsActiveConnectorsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetActiveConnectorsActiveConnectorsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetActiveConnectorsActiveConnectorsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetActiveConnectorsActiveConnectorsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetActiveConnectorsActiveConnectorsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetActiveConnectorsActiveConnectorsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetActiveConnectorsActiveConnectorsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetActiveConnectorsActiveConnectorsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetActiveConnectorsActiveConnectorsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetActiveConnectorsActiveConnectorsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetAdministrativeUserAccountPropertiesAdministrativeUserAccountPropertiesPayload includes the requested fields of the GraphQL type AdministrativeUserAccountPropertiesPayload. +type deleteBundleSetAdministrativeUserAccountPropertiesAdministrativeUserAccountPropertiesPayload struct { + DetailedStatus []*deleteBundleSetAdministrativeUserAccountPropertiesAdministrativeUserAccountPropertiesPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetAdministrativeUserAccountPropertiesAdministrativeUserAccountPropertiesPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetAdministrativeUserAccountPropertiesAdministrativeUserAccountPropertiesPayload) GetDetailedStatus() []*deleteBundleSetAdministrativeUserAccountPropertiesAdministrativeUserAccountPropertiesPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetAdministrativeUserAccountPropertiesAdministrativeUserAccountPropertiesPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetAdministrativeUserAccountPropertiesAdministrativeUserAccountPropertiesPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetAdministrativeUserAccountPropertiesAdministrativeUserAccountPropertiesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetAdministrativeUserAccountPropertiesAdministrativeUserAccountPropertiesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetAdministrativeUserAccountPropertiesAdministrativeUserAccountPropertiesPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetAdministrativeUserAccountPropertiesAdministrativeUserAccountPropertiesPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetAdministrativeUserAccountPropertiesAdministrativeUserAccountPropertiesPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetAdministrativeUserAccountPropertiesAdministrativeUserAccountPropertiesPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetAdministrativeUserAccountPropertiesAdministrativeUserAccountPropertiesPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetAdministrativeUserAccountPropertiesAdministrativeUserAccountPropertiesPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetAdministrativeUserAccountPropertiesAdministrativeUserAccountPropertiesPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetAdministrativeUserAccountPropertiesAdministrativeUserAccountPropertiesPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetAdministrativeUserAccountPropertiesAdministrativeUserAccountPropertiesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetAdministrativeUserAccountPropertiesAdministrativeUserAccountPropertiesPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetAdministrativeUserAccountPropertiesAdministrativeUserAccountPropertiesPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetAdministrativeUserAccountPropertiesAdministrativeUserAccountPropertiesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetAdministrativeUserAccountPropertiesAdministrativeUserAccountPropertiesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetAdministrativeUserAccountPropertiesAdministrativeUserAccountPropertiesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetAdministrativeUserAccountPropertiesAdministrativeUserAccountPropertiesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetAdministrativeUserAccountPropertiesAdministrativeUserAccountPropertiesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetAdministrativeUserAccountPropertiesAdministrativeUserAccountPropertiesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetAdministrativeUserAccountPropertiesAdministrativeUserAccountPropertiesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetAdministrativeUserAccountPropertiesAdministrativeUserAccountPropertiesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetAdministrativeUserAccountPropertiesAdministrativeUserAccountPropertiesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetAdministrativeUserAccountPropertiesAdministrativeUserAccountPropertiesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetAdministrativeUserAccountPropertiesAdministrativeUserAccountPropertiesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetAdministrativeUserAccountPropertiesAdministrativeUserAccountPropertiesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetAdministrativeUserAccountPropertiesAdministrativeUserAccountPropertiesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetAuditConfigurationsAuditConfigurationsPayload includes the requested fields of the GraphQL type AuditConfigurationsPayload. +type deleteBundleSetAuditConfigurationsAuditConfigurationsPayload struct { + DetailedStatus []*deleteBundleSetAuditConfigurationsAuditConfigurationsPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetAuditConfigurationsAuditConfigurationsPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetAuditConfigurationsAuditConfigurationsPayload) GetDetailedStatus() []*deleteBundleSetAuditConfigurationsAuditConfigurationsPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetAuditConfigurationsAuditConfigurationsPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetAuditConfigurationsAuditConfigurationsPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetAuditConfigurationsAuditConfigurationsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetAuditConfigurationsAuditConfigurationsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetAuditConfigurationsAuditConfigurationsPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetAuditConfigurationsAuditConfigurationsPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetAuditConfigurationsAuditConfigurationsPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetAuditConfigurationsAuditConfigurationsPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetAuditConfigurationsAuditConfigurationsPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetAuditConfigurationsAuditConfigurationsPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetAuditConfigurationsAuditConfigurationsPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetAuditConfigurationsAuditConfigurationsPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetAuditConfigurationsAuditConfigurationsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetAuditConfigurationsAuditConfigurationsPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetAuditConfigurationsAuditConfigurationsPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetAuditConfigurationsAuditConfigurationsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetAuditConfigurationsAuditConfigurationsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetAuditConfigurationsAuditConfigurationsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetAuditConfigurationsAuditConfigurationsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetAuditConfigurationsAuditConfigurationsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetAuditConfigurationsAuditConfigurationsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetAuditConfigurationsAuditConfigurationsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetAuditConfigurationsAuditConfigurationsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetAuditConfigurationsAuditConfigurationsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetAuditConfigurationsAuditConfigurationsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetAuditConfigurationsAuditConfigurationsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetAuditConfigurationsAuditConfigurationsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetAuditConfigurationsAuditConfigurationsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetBackgroundTaskPoliciesBackgroundTaskPoliciesPayload includes the requested fields of the GraphQL type BackgroundTaskPoliciesPayload. +type deleteBundleSetBackgroundTaskPoliciesBackgroundTaskPoliciesPayload struct { + DetailedStatus []*deleteBundleSetBackgroundTaskPoliciesBackgroundTaskPoliciesPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetBackgroundTaskPoliciesBackgroundTaskPoliciesPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetBackgroundTaskPoliciesBackgroundTaskPoliciesPayload) GetDetailedStatus() []*deleteBundleSetBackgroundTaskPoliciesBackgroundTaskPoliciesPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetBackgroundTaskPoliciesBackgroundTaskPoliciesPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetBackgroundTaskPoliciesBackgroundTaskPoliciesPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetBackgroundTaskPoliciesBackgroundTaskPoliciesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetBackgroundTaskPoliciesBackgroundTaskPoliciesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetBackgroundTaskPoliciesBackgroundTaskPoliciesPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetBackgroundTaskPoliciesBackgroundTaskPoliciesPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetBackgroundTaskPoliciesBackgroundTaskPoliciesPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetBackgroundTaskPoliciesBackgroundTaskPoliciesPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetBackgroundTaskPoliciesBackgroundTaskPoliciesPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetBackgroundTaskPoliciesBackgroundTaskPoliciesPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetBackgroundTaskPoliciesBackgroundTaskPoliciesPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetBackgroundTaskPoliciesBackgroundTaskPoliciesPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetBackgroundTaskPoliciesBackgroundTaskPoliciesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetBackgroundTaskPoliciesBackgroundTaskPoliciesPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetBackgroundTaskPoliciesBackgroundTaskPoliciesPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetBackgroundTaskPoliciesBackgroundTaskPoliciesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetBackgroundTaskPoliciesBackgroundTaskPoliciesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetBackgroundTaskPoliciesBackgroundTaskPoliciesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetBackgroundTaskPoliciesBackgroundTaskPoliciesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetBackgroundTaskPoliciesBackgroundTaskPoliciesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetBackgroundTaskPoliciesBackgroundTaskPoliciesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetBackgroundTaskPoliciesBackgroundTaskPoliciesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetBackgroundTaskPoliciesBackgroundTaskPoliciesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetBackgroundTaskPoliciesBackgroundTaskPoliciesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetBackgroundTaskPoliciesBackgroundTaskPoliciesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetBackgroundTaskPoliciesBackgroundTaskPoliciesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetBackgroundTaskPoliciesBackgroundTaskPoliciesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetBackgroundTaskPoliciesBackgroundTaskPoliciesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetCassandraConnectionsCassandraConnectionsPayload includes the requested fields of the GraphQL type CassandraConnectionsPayload. +type deleteBundleSetCassandraConnectionsCassandraConnectionsPayload struct { + DetailedStatus []*deleteBundleSetCassandraConnectionsCassandraConnectionsPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetCassandraConnectionsCassandraConnectionsPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetCassandraConnectionsCassandraConnectionsPayload) GetDetailedStatus() []*deleteBundleSetCassandraConnectionsCassandraConnectionsPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetCassandraConnectionsCassandraConnectionsPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetCassandraConnectionsCassandraConnectionsPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetCassandraConnectionsCassandraConnectionsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetCassandraConnectionsCassandraConnectionsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetCassandraConnectionsCassandraConnectionsPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetCassandraConnectionsCassandraConnectionsPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetCassandraConnectionsCassandraConnectionsPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetCassandraConnectionsCassandraConnectionsPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetCassandraConnectionsCassandraConnectionsPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetCassandraConnectionsCassandraConnectionsPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetCassandraConnectionsCassandraConnectionsPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetCassandraConnectionsCassandraConnectionsPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetCassandraConnectionsCassandraConnectionsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetCassandraConnectionsCassandraConnectionsPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetCassandraConnectionsCassandraConnectionsPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetCassandraConnectionsCassandraConnectionsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetCassandraConnectionsCassandraConnectionsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetCassandraConnectionsCassandraConnectionsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetCassandraConnectionsCassandraConnectionsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetCassandraConnectionsCassandraConnectionsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetCassandraConnectionsCassandraConnectionsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetCassandraConnectionsCassandraConnectionsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetCassandraConnectionsCassandraConnectionsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetCassandraConnectionsCassandraConnectionsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetCassandraConnectionsCassandraConnectionsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetCassandraConnectionsCassandraConnectionsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetCassandraConnectionsCassandraConnectionsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetCassandraConnectionsCassandraConnectionsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetClusterPropertiesClusterPropertiesPayload includes the requested fields of the GraphQL type ClusterPropertiesPayload. +type deleteBundleSetClusterPropertiesClusterPropertiesPayload struct { + DetailedStatus []*deleteBundleSetClusterPropertiesClusterPropertiesPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetClusterPropertiesClusterPropertiesPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetClusterPropertiesClusterPropertiesPayload) GetDetailedStatus() []*deleteBundleSetClusterPropertiesClusterPropertiesPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetClusterPropertiesClusterPropertiesPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetClusterPropertiesClusterPropertiesPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetClusterPropertiesClusterPropertiesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetClusterPropertiesClusterPropertiesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetClusterPropertiesClusterPropertiesPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetClusterPropertiesClusterPropertiesPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetClusterPropertiesClusterPropertiesPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetClusterPropertiesClusterPropertiesPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetClusterPropertiesClusterPropertiesPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetClusterPropertiesClusterPropertiesPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetClusterPropertiesClusterPropertiesPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetClusterPropertiesClusterPropertiesPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetClusterPropertiesClusterPropertiesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetClusterPropertiesClusterPropertiesPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetClusterPropertiesClusterPropertiesPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetClusterPropertiesClusterPropertiesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetClusterPropertiesClusterPropertiesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetClusterPropertiesClusterPropertiesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetClusterPropertiesClusterPropertiesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetClusterPropertiesClusterPropertiesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetClusterPropertiesClusterPropertiesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetClusterPropertiesClusterPropertiesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetClusterPropertiesClusterPropertiesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetClusterPropertiesClusterPropertiesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetClusterPropertiesClusterPropertiesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetClusterPropertiesClusterPropertiesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetClusterPropertiesClusterPropertiesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetClusterPropertiesClusterPropertiesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetCustomKeyValuesCustomKeyValuePayload includes the requested fields of the GraphQL type CustomKeyValuePayload. +type deleteBundleSetCustomKeyValuesCustomKeyValuePayload struct { + DetailedStatus []*deleteBundleSetCustomKeyValuesCustomKeyValuePayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetCustomKeyValuesCustomKeyValuePayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetCustomKeyValuesCustomKeyValuePayload) GetDetailedStatus() []*deleteBundleSetCustomKeyValuesCustomKeyValuePayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetCustomKeyValuesCustomKeyValuePayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetCustomKeyValuesCustomKeyValuePayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetCustomKeyValuesCustomKeyValuePayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetCustomKeyValuesCustomKeyValuePayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetCustomKeyValuesCustomKeyValuePayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetCustomKeyValuesCustomKeyValuePayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetCustomKeyValuesCustomKeyValuePayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetCustomKeyValuesCustomKeyValuePayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetCustomKeyValuesCustomKeyValuePayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetCustomKeyValuesCustomKeyValuePayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetCustomKeyValuesCustomKeyValuePayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetCustomKeyValuesCustomKeyValuePayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetCustomKeyValuesCustomKeyValuePayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetCustomKeyValuesCustomKeyValuePayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetCustomKeyValuesCustomKeyValuePayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetCustomKeyValuesCustomKeyValuePayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetCustomKeyValuesCustomKeyValuePayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetCustomKeyValuesCustomKeyValuePayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetCustomKeyValuesCustomKeyValuePayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetCustomKeyValuesCustomKeyValuePayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetCustomKeyValuesCustomKeyValuePayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetCustomKeyValuesCustomKeyValuePayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetCustomKeyValuesCustomKeyValuePayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetCustomKeyValuesCustomKeyValuePayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetCustomKeyValuesCustomKeyValuePayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetCustomKeyValuesCustomKeyValuePayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetCustomKeyValuesCustomKeyValuePayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetCustomKeyValuesCustomKeyValuePayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetDtdsDtdsPayload includes the requested fields of the GraphQL type DtdsPayload. +type deleteBundleSetDtdsDtdsPayload struct { + DetailedStatus []*deleteBundleSetDtdsDtdsPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetDtdsDtdsPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetDtdsDtdsPayload) GetDetailedStatus() []*deleteBundleSetDtdsDtdsPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetDtdsDtdsPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetDtdsDtdsPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetDtdsDtdsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetDtdsDtdsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetDtdsDtdsPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetDtdsDtdsPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetDtdsDtdsPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetDtdsDtdsPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetDtdsDtdsPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetDtdsDtdsPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetDtdsDtdsPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetDtdsDtdsPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetDtdsDtdsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetDtdsDtdsPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetDtdsDtdsPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetDtdsDtdsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetDtdsDtdsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetDtdsDtdsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetDtdsDtdsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetDtdsDtdsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetDtdsDtdsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetDtdsDtdsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetDtdsDtdsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetDtdsDtdsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetDtdsDtdsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetDtdsDtdsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetDtdsDtdsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetDtdsDtdsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetEmailListenersEmailListenersPayload includes the requested fields of the GraphQL type EmailListenersPayload. +type deleteBundleSetEmailListenersEmailListenersPayload struct { + DetailedStatus []*deleteBundleSetEmailListenersEmailListenersPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetEmailListenersEmailListenersPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetEmailListenersEmailListenersPayload) GetDetailedStatus() []*deleteBundleSetEmailListenersEmailListenersPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetEmailListenersEmailListenersPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetEmailListenersEmailListenersPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetEmailListenersEmailListenersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetEmailListenersEmailListenersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetEmailListenersEmailListenersPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetEmailListenersEmailListenersPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetEmailListenersEmailListenersPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetEmailListenersEmailListenersPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetEmailListenersEmailListenersPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetEmailListenersEmailListenersPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetEmailListenersEmailListenersPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetEmailListenersEmailListenersPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetEmailListenersEmailListenersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetEmailListenersEmailListenersPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetEmailListenersEmailListenersPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetEmailListenersEmailListenersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetEmailListenersEmailListenersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetEmailListenersEmailListenersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetEmailListenersEmailListenersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetEmailListenersEmailListenersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetEmailListenersEmailListenersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetEmailListenersEmailListenersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetEmailListenersEmailListenersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetEmailListenersEmailListenersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetEmailListenersEmailListenersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetEmailListenersEmailListenersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetEmailListenersEmailListenersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetEmailListenersEmailListenersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetEncassConfigsEncassConfigsPayload includes the requested fields of the GraphQL type EncassConfigsPayload. +type deleteBundleSetEncassConfigsEncassConfigsPayload struct { + DetailedStatus []*deleteBundleSetEncassConfigsEncassConfigsPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetEncassConfigsEncassConfigsPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetEncassConfigsEncassConfigsPayload) GetDetailedStatus() []*deleteBundleSetEncassConfigsEncassConfigsPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetEncassConfigsEncassConfigsPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetEncassConfigsEncassConfigsPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetEncassConfigsEncassConfigsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetEncassConfigsEncassConfigsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetEncassConfigsEncassConfigsPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetEncassConfigsEncassConfigsPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetEncassConfigsEncassConfigsPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetEncassConfigsEncassConfigsPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetEncassConfigsEncassConfigsPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetEncassConfigsEncassConfigsPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetEncassConfigsEncassConfigsPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetEncassConfigsEncassConfigsPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetEncassConfigsEncassConfigsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetEncassConfigsEncassConfigsPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetEncassConfigsEncassConfigsPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetEncassConfigsEncassConfigsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetEncassConfigsEncassConfigsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetEncassConfigsEncassConfigsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetEncassConfigsEncassConfigsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetEncassConfigsEncassConfigsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetEncassConfigsEncassConfigsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetEncassConfigsEncassConfigsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetEncassConfigsEncassConfigsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetEncassConfigsEncassConfigsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetEncassConfigsEncassConfigsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetEncassConfigsEncassConfigsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetEncassConfigsEncassConfigsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetEncassConfigsEncassConfigsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetFederatedGroupsFederatedGroupsPayload includes the requested fields of the GraphQL type FederatedGroupsPayload. +type deleteBundleSetFederatedGroupsFederatedGroupsPayload struct { + DetailedStatus []*deleteBundleSetFederatedGroupsFederatedGroupsPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetFederatedGroupsFederatedGroupsPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFederatedGroupsFederatedGroupsPayload) GetDetailedStatus() []*deleteBundleSetFederatedGroupsFederatedGroupsPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetFederatedGroupsFederatedGroupsPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetFederatedGroupsFederatedGroupsPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetFederatedGroupsFederatedGroupsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetFederatedGroupsFederatedGroupsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetFederatedGroupsFederatedGroupsPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFederatedGroupsFederatedGroupsPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetFederatedGroupsFederatedGroupsPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFederatedGroupsFederatedGroupsPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetFederatedGroupsFederatedGroupsPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFederatedGroupsFederatedGroupsPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetFederatedGroupsFederatedGroupsPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFederatedGroupsFederatedGroupsPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetFederatedGroupsFederatedGroupsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetFederatedGroupsFederatedGroupsPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFederatedGroupsFederatedGroupsPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetFederatedGroupsFederatedGroupsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetFederatedGroupsFederatedGroupsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetFederatedGroupsFederatedGroupsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetFederatedGroupsFederatedGroupsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFederatedGroupsFederatedGroupsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetFederatedGroupsFederatedGroupsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFederatedGroupsFederatedGroupsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetFederatedGroupsFederatedGroupsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetFederatedGroupsFederatedGroupsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetFederatedGroupsFederatedGroupsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFederatedGroupsFederatedGroupsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetFederatedGroupsFederatedGroupsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFederatedGroupsFederatedGroupsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetFederatedIdpsFederatedIdpsPayload includes the requested fields of the GraphQL type FederatedIdpsPayload. +type deleteBundleSetFederatedIdpsFederatedIdpsPayload struct { + DetailedStatus []*deleteBundleSetFederatedIdpsFederatedIdpsPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetFederatedIdpsFederatedIdpsPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFederatedIdpsFederatedIdpsPayload) GetDetailedStatus() []*deleteBundleSetFederatedIdpsFederatedIdpsPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetFederatedIdpsFederatedIdpsPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetFederatedIdpsFederatedIdpsPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetFederatedIdpsFederatedIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetFederatedIdpsFederatedIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetFederatedIdpsFederatedIdpsPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFederatedIdpsFederatedIdpsPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetFederatedIdpsFederatedIdpsPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFederatedIdpsFederatedIdpsPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetFederatedIdpsFederatedIdpsPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFederatedIdpsFederatedIdpsPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetFederatedIdpsFederatedIdpsPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFederatedIdpsFederatedIdpsPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetFederatedIdpsFederatedIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetFederatedIdpsFederatedIdpsPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFederatedIdpsFederatedIdpsPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetFederatedIdpsFederatedIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetFederatedIdpsFederatedIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetFederatedIdpsFederatedIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetFederatedIdpsFederatedIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFederatedIdpsFederatedIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetFederatedIdpsFederatedIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFederatedIdpsFederatedIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetFederatedIdpsFederatedIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetFederatedIdpsFederatedIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetFederatedIdpsFederatedIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFederatedIdpsFederatedIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetFederatedIdpsFederatedIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFederatedIdpsFederatedIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetFederatedUsersFederatedUsersPayload includes the requested fields of the GraphQL type FederatedUsersPayload. +type deleteBundleSetFederatedUsersFederatedUsersPayload struct { + DetailedStatus []*deleteBundleSetFederatedUsersFederatedUsersPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetFederatedUsersFederatedUsersPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFederatedUsersFederatedUsersPayload) GetDetailedStatus() []*deleteBundleSetFederatedUsersFederatedUsersPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetFederatedUsersFederatedUsersPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetFederatedUsersFederatedUsersPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetFederatedUsersFederatedUsersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetFederatedUsersFederatedUsersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetFederatedUsersFederatedUsersPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFederatedUsersFederatedUsersPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetFederatedUsersFederatedUsersPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFederatedUsersFederatedUsersPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetFederatedUsersFederatedUsersPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFederatedUsersFederatedUsersPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetFederatedUsersFederatedUsersPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFederatedUsersFederatedUsersPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetFederatedUsersFederatedUsersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetFederatedUsersFederatedUsersPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFederatedUsersFederatedUsersPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetFederatedUsersFederatedUsersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetFederatedUsersFederatedUsersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetFederatedUsersFederatedUsersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetFederatedUsersFederatedUsersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFederatedUsersFederatedUsersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetFederatedUsersFederatedUsersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFederatedUsersFederatedUsersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetFederatedUsersFederatedUsersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetFederatedUsersFederatedUsersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetFederatedUsersFederatedUsersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFederatedUsersFederatedUsersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetFederatedUsersFederatedUsersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFederatedUsersFederatedUsersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetFipGroupsFipGroupsPayload includes the requested fields of the GraphQL type FipGroupsPayload. +type deleteBundleSetFipGroupsFipGroupsPayload struct { + DetailedStatus []*deleteBundleSetFipGroupsFipGroupsPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetFipGroupsFipGroupsPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFipGroupsFipGroupsPayload) GetDetailedStatus() []*deleteBundleSetFipGroupsFipGroupsPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetFipGroupsFipGroupsPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetFipGroupsFipGroupsPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetFipGroupsFipGroupsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetFipGroupsFipGroupsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetFipGroupsFipGroupsPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFipGroupsFipGroupsPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetFipGroupsFipGroupsPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFipGroupsFipGroupsPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetFipGroupsFipGroupsPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFipGroupsFipGroupsPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetFipGroupsFipGroupsPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFipGroupsFipGroupsPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetFipGroupsFipGroupsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetFipGroupsFipGroupsPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFipGroupsFipGroupsPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetFipGroupsFipGroupsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetFipGroupsFipGroupsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetFipGroupsFipGroupsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetFipGroupsFipGroupsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFipGroupsFipGroupsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetFipGroupsFipGroupsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFipGroupsFipGroupsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetFipGroupsFipGroupsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetFipGroupsFipGroupsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetFipGroupsFipGroupsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFipGroupsFipGroupsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetFipGroupsFipGroupsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFipGroupsFipGroupsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetFipUsersFipUsersPayload includes the requested fields of the GraphQL type FipUsersPayload. +type deleteBundleSetFipUsersFipUsersPayload struct { + DetailedStatus []*deleteBundleSetFipUsersFipUsersPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetFipUsersFipUsersPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFipUsersFipUsersPayload) GetDetailedStatus() []*deleteBundleSetFipUsersFipUsersPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetFipUsersFipUsersPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetFipUsersFipUsersPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetFipUsersFipUsersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetFipUsersFipUsersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetFipUsersFipUsersPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFipUsersFipUsersPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetFipUsersFipUsersPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFipUsersFipUsersPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetFipUsersFipUsersPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFipUsersFipUsersPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetFipUsersFipUsersPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFipUsersFipUsersPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetFipUsersFipUsersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetFipUsersFipUsersPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFipUsersFipUsersPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetFipUsersFipUsersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetFipUsersFipUsersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetFipUsersFipUsersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetFipUsersFipUsersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFipUsersFipUsersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetFipUsersFipUsersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFipUsersFipUsersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetFipUsersFipUsersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetFipUsersFipUsersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetFipUsersFipUsersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFipUsersFipUsersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetFipUsersFipUsersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFipUsersFipUsersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetFipsFipsPayload includes the requested fields of the GraphQL type FipsPayload. +type deleteBundleSetFipsFipsPayload struct { + DetailedStatus []*deleteBundleSetFipsFipsPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetFipsFipsPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFipsFipsPayload) GetDetailedStatus() []*deleteBundleSetFipsFipsPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetFipsFipsPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetFipsFipsPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetFipsFipsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetFipsFipsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetFipsFipsPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFipsFipsPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetFipsFipsPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFipsFipsPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetFipsFipsPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFipsFipsPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetFipsFipsPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFipsFipsPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetFipsFipsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetFipsFipsPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFipsFipsPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetFipsFipsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetFipsFipsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetFipsFipsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetFipsFipsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFipsFipsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetFipsFipsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFipsFipsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetFipsFipsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetFipsFipsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetFipsFipsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFipsFipsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetFipsFipsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFipsFipsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetFoldersFoldersPayload includes the requested fields of the GraphQL type FoldersPayload. +type deleteBundleSetFoldersFoldersPayload struct { + DetailedStatus []*deleteBundleSetFoldersFoldersPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetFoldersFoldersPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFoldersFoldersPayload) GetDetailedStatus() []*deleteBundleSetFoldersFoldersPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetFoldersFoldersPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetFoldersFoldersPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetFoldersFoldersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetFoldersFoldersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetFoldersFoldersPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFoldersFoldersPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetFoldersFoldersPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFoldersFoldersPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetFoldersFoldersPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFoldersFoldersPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetFoldersFoldersPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFoldersFoldersPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetFoldersFoldersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetFoldersFoldersPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFoldersFoldersPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetFoldersFoldersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetFoldersFoldersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetFoldersFoldersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetFoldersFoldersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFoldersFoldersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetFoldersFoldersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFoldersFoldersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetFoldersFoldersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetFoldersFoldersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetFoldersFoldersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFoldersFoldersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetFoldersFoldersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetFoldersFoldersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetGenericEntitiesGenericEntitiesPayload includes the requested fields of the GraphQL type GenericEntitiesPayload. +type deleteBundleSetGenericEntitiesGenericEntitiesPayload struct { + DetailedStatus []*deleteBundleSetGenericEntitiesGenericEntitiesPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetGenericEntitiesGenericEntitiesPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetGenericEntitiesGenericEntitiesPayload) GetDetailedStatus() []*deleteBundleSetGenericEntitiesGenericEntitiesPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetGenericEntitiesGenericEntitiesPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetGenericEntitiesGenericEntitiesPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetGenericEntitiesGenericEntitiesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetGenericEntitiesGenericEntitiesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetGenericEntitiesGenericEntitiesPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetGenericEntitiesGenericEntitiesPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetGenericEntitiesGenericEntitiesPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetGenericEntitiesGenericEntitiesPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetGenericEntitiesGenericEntitiesPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetGenericEntitiesGenericEntitiesPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetGenericEntitiesGenericEntitiesPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetGenericEntitiesGenericEntitiesPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetGenericEntitiesGenericEntitiesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetGenericEntitiesGenericEntitiesPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetGenericEntitiesGenericEntitiesPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetGenericEntitiesGenericEntitiesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetGenericEntitiesGenericEntitiesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetGenericEntitiesGenericEntitiesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetGenericEntitiesGenericEntitiesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetGenericEntitiesGenericEntitiesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetGenericEntitiesGenericEntitiesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetGenericEntitiesGenericEntitiesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetGenericEntitiesGenericEntitiesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetGenericEntitiesGenericEntitiesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetGenericEntitiesGenericEntitiesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetGenericEntitiesGenericEntitiesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetGenericEntitiesGenericEntitiesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetGenericEntitiesGenericEntitiesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetGlobalPoliciesGlobalPoliciesPayload includes the requested fields of the GraphQL type GlobalPoliciesPayload. +type deleteBundleSetGlobalPoliciesGlobalPoliciesPayload struct { + DetailedStatus []*deleteBundleSetGlobalPoliciesGlobalPoliciesPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetGlobalPoliciesGlobalPoliciesPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetGlobalPoliciesGlobalPoliciesPayload) GetDetailedStatus() []*deleteBundleSetGlobalPoliciesGlobalPoliciesPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetGlobalPoliciesGlobalPoliciesPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetGlobalPoliciesGlobalPoliciesPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetGlobalPoliciesGlobalPoliciesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetGlobalPoliciesGlobalPoliciesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetGlobalPoliciesGlobalPoliciesPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetGlobalPoliciesGlobalPoliciesPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetGlobalPoliciesGlobalPoliciesPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetGlobalPoliciesGlobalPoliciesPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetGlobalPoliciesGlobalPoliciesPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetGlobalPoliciesGlobalPoliciesPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetGlobalPoliciesGlobalPoliciesPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetGlobalPoliciesGlobalPoliciesPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetGlobalPoliciesGlobalPoliciesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetGlobalPoliciesGlobalPoliciesPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetGlobalPoliciesGlobalPoliciesPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetGlobalPoliciesGlobalPoliciesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetGlobalPoliciesGlobalPoliciesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetGlobalPoliciesGlobalPoliciesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetGlobalPoliciesGlobalPoliciesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetGlobalPoliciesGlobalPoliciesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetGlobalPoliciesGlobalPoliciesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetGlobalPoliciesGlobalPoliciesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetGlobalPoliciesGlobalPoliciesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetGlobalPoliciesGlobalPoliciesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetGlobalPoliciesGlobalPoliciesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetGlobalPoliciesGlobalPoliciesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetGlobalPoliciesGlobalPoliciesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetGlobalPoliciesGlobalPoliciesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetHttpConfigurationsHttpConfigurationsPayload includes the requested fields of the GraphQL type HttpConfigurationsPayload. +type deleteBundleSetHttpConfigurationsHttpConfigurationsPayload struct { + DetailedStatus []*deleteBundleSetHttpConfigurationsHttpConfigurationsPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetHttpConfigurationsHttpConfigurationsPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetHttpConfigurationsHttpConfigurationsPayload) GetDetailedStatus() []*deleteBundleSetHttpConfigurationsHttpConfigurationsPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetHttpConfigurationsHttpConfigurationsPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetHttpConfigurationsHttpConfigurationsPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetHttpConfigurationsHttpConfigurationsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetHttpConfigurationsHttpConfigurationsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetHttpConfigurationsHttpConfigurationsPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetHttpConfigurationsHttpConfigurationsPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetHttpConfigurationsHttpConfigurationsPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetHttpConfigurationsHttpConfigurationsPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetHttpConfigurationsHttpConfigurationsPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetHttpConfigurationsHttpConfigurationsPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetHttpConfigurationsHttpConfigurationsPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetHttpConfigurationsHttpConfigurationsPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetHttpConfigurationsHttpConfigurationsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetHttpConfigurationsHttpConfigurationsPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetHttpConfigurationsHttpConfigurationsPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetHttpConfigurationsHttpConfigurationsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetHttpConfigurationsHttpConfigurationsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetHttpConfigurationsHttpConfigurationsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetHttpConfigurationsHttpConfigurationsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetHttpConfigurationsHttpConfigurationsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetHttpConfigurationsHttpConfigurationsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetHttpConfigurationsHttpConfigurationsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetHttpConfigurationsHttpConfigurationsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetHttpConfigurationsHttpConfigurationsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetHttpConfigurationsHttpConfigurationsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetHttpConfigurationsHttpConfigurationsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetHttpConfigurationsHttpConfigurationsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetHttpConfigurationsHttpConfigurationsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetInternalGroupsInternalGroupsPayload includes the requested fields of the GraphQL type InternalGroupsPayload. +type deleteBundleSetInternalGroupsInternalGroupsPayload struct { + DetailedStatus []*deleteBundleSetInternalGroupsInternalGroupsPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetInternalGroupsInternalGroupsPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalGroupsInternalGroupsPayload) GetDetailedStatus() []*deleteBundleSetInternalGroupsInternalGroupsPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetInternalGroupsInternalGroupsPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetInternalGroupsInternalGroupsPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetInternalGroupsInternalGroupsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetInternalGroupsInternalGroupsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetInternalGroupsInternalGroupsPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalGroupsInternalGroupsPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetInternalGroupsInternalGroupsPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalGroupsInternalGroupsPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetInternalGroupsInternalGroupsPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalGroupsInternalGroupsPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetInternalGroupsInternalGroupsPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalGroupsInternalGroupsPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetInternalGroupsInternalGroupsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetInternalGroupsInternalGroupsPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalGroupsInternalGroupsPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetInternalGroupsInternalGroupsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetInternalGroupsInternalGroupsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetInternalGroupsInternalGroupsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetInternalGroupsInternalGroupsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalGroupsInternalGroupsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetInternalGroupsInternalGroupsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalGroupsInternalGroupsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetInternalGroupsInternalGroupsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetInternalGroupsInternalGroupsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetInternalGroupsInternalGroupsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalGroupsInternalGroupsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetInternalGroupsInternalGroupsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalGroupsInternalGroupsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetInternalIdpsInternalIdpsPayload includes the requested fields of the GraphQL type InternalIdpsPayload. +type deleteBundleSetInternalIdpsInternalIdpsPayload struct { + DetailedStatus []*deleteBundleSetInternalIdpsInternalIdpsPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetInternalIdpsInternalIdpsPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalIdpsInternalIdpsPayload) GetDetailedStatus() []*deleteBundleSetInternalIdpsInternalIdpsPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetInternalIdpsInternalIdpsPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetInternalIdpsInternalIdpsPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetInternalIdpsInternalIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetInternalIdpsInternalIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetInternalIdpsInternalIdpsPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalIdpsInternalIdpsPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetInternalIdpsInternalIdpsPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalIdpsInternalIdpsPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetInternalIdpsInternalIdpsPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalIdpsInternalIdpsPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetInternalIdpsInternalIdpsPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalIdpsInternalIdpsPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetInternalIdpsInternalIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetInternalIdpsInternalIdpsPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalIdpsInternalIdpsPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetInternalIdpsInternalIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetInternalIdpsInternalIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetInternalIdpsInternalIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetInternalIdpsInternalIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalIdpsInternalIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetInternalIdpsInternalIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalIdpsInternalIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetInternalIdpsInternalIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetInternalIdpsInternalIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetInternalIdpsInternalIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalIdpsInternalIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetInternalIdpsInternalIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalIdpsInternalIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetInternalSoapServicesInternalSoapServicesPayload includes the requested fields of the GraphQL type InternalSoapServicesPayload. +type deleteBundleSetInternalSoapServicesInternalSoapServicesPayload struct { + DetailedStatus []*deleteBundleSetInternalSoapServicesInternalSoapServicesPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetInternalSoapServicesInternalSoapServicesPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalSoapServicesInternalSoapServicesPayload) GetDetailedStatus() []*deleteBundleSetInternalSoapServicesInternalSoapServicesPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetInternalSoapServicesInternalSoapServicesPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetInternalSoapServicesInternalSoapServicesPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetInternalSoapServicesInternalSoapServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetInternalSoapServicesInternalSoapServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetInternalSoapServicesInternalSoapServicesPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalSoapServicesInternalSoapServicesPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetInternalSoapServicesInternalSoapServicesPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalSoapServicesInternalSoapServicesPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetInternalSoapServicesInternalSoapServicesPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalSoapServicesInternalSoapServicesPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetInternalSoapServicesInternalSoapServicesPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalSoapServicesInternalSoapServicesPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetInternalSoapServicesInternalSoapServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetInternalSoapServicesInternalSoapServicesPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalSoapServicesInternalSoapServicesPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetInternalSoapServicesInternalSoapServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetInternalSoapServicesInternalSoapServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetInternalSoapServicesInternalSoapServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetInternalSoapServicesInternalSoapServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalSoapServicesInternalSoapServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetInternalSoapServicesInternalSoapServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalSoapServicesInternalSoapServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetInternalSoapServicesInternalSoapServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetInternalSoapServicesInternalSoapServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetInternalSoapServicesInternalSoapServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalSoapServicesInternalSoapServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetInternalSoapServicesInternalSoapServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalSoapServicesInternalSoapServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetInternalUsersInternalUsersPayload includes the requested fields of the GraphQL type InternalUsersPayload. +type deleteBundleSetInternalUsersInternalUsersPayload struct { + DetailedStatus []*deleteBundleSetInternalUsersInternalUsersPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetInternalUsersInternalUsersPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalUsersInternalUsersPayload) GetDetailedStatus() []*deleteBundleSetInternalUsersInternalUsersPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetInternalUsersInternalUsersPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetInternalUsersInternalUsersPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetInternalUsersInternalUsersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetInternalUsersInternalUsersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetInternalUsersInternalUsersPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalUsersInternalUsersPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetInternalUsersInternalUsersPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalUsersInternalUsersPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetInternalUsersInternalUsersPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalUsersInternalUsersPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetInternalUsersInternalUsersPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalUsersInternalUsersPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetInternalUsersInternalUsersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetInternalUsersInternalUsersPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalUsersInternalUsersPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetInternalUsersInternalUsersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetInternalUsersInternalUsersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetInternalUsersInternalUsersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetInternalUsersInternalUsersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalUsersInternalUsersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetInternalUsersInternalUsersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalUsersInternalUsersPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetInternalUsersInternalUsersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetInternalUsersInternalUsersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetInternalUsersInternalUsersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalUsersInternalUsersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetInternalUsersInternalUsersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalUsersInternalUsersPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetInternalWebApiServicesInternalWebApiServicesPayload includes the requested fields of the GraphQL type InternalWebApiServicesPayload. +type deleteBundleSetInternalWebApiServicesInternalWebApiServicesPayload struct { + DetailedStatus []*deleteBundleSetInternalWebApiServicesInternalWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetInternalWebApiServicesInternalWebApiServicesPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalWebApiServicesInternalWebApiServicesPayload) GetDetailedStatus() []*deleteBundleSetInternalWebApiServicesInternalWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetInternalWebApiServicesInternalWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetInternalWebApiServicesInternalWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetInternalWebApiServicesInternalWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetInternalWebApiServicesInternalWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetInternalWebApiServicesInternalWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalWebApiServicesInternalWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetInternalWebApiServicesInternalWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalWebApiServicesInternalWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetInternalWebApiServicesInternalWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalWebApiServicesInternalWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetInternalWebApiServicesInternalWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalWebApiServicesInternalWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetInternalWebApiServicesInternalWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetInternalWebApiServicesInternalWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalWebApiServicesInternalWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetInternalWebApiServicesInternalWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetInternalWebApiServicesInternalWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetInternalWebApiServicesInternalWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetInternalWebApiServicesInternalWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalWebApiServicesInternalWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetInternalWebApiServicesInternalWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalWebApiServicesInternalWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetInternalWebApiServicesInternalWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetInternalWebApiServicesInternalWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetInternalWebApiServicesInternalWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalWebApiServicesInternalWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetInternalWebApiServicesInternalWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetInternalWebApiServicesInternalWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetJdbcConnectionsJdbcConnectionsPayload includes the requested fields of the GraphQL type JdbcConnectionsPayload. +type deleteBundleSetJdbcConnectionsJdbcConnectionsPayload struct { + DetailedStatus []*deleteBundleSetJdbcConnectionsJdbcConnectionsPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetJdbcConnectionsJdbcConnectionsPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetJdbcConnectionsJdbcConnectionsPayload) GetDetailedStatus() []*deleteBundleSetJdbcConnectionsJdbcConnectionsPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetJdbcConnectionsJdbcConnectionsPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetJdbcConnectionsJdbcConnectionsPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetJdbcConnectionsJdbcConnectionsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetJdbcConnectionsJdbcConnectionsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetJdbcConnectionsJdbcConnectionsPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetJdbcConnectionsJdbcConnectionsPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetJdbcConnectionsJdbcConnectionsPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetJdbcConnectionsJdbcConnectionsPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetJdbcConnectionsJdbcConnectionsPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetJdbcConnectionsJdbcConnectionsPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetJdbcConnectionsJdbcConnectionsPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetJdbcConnectionsJdbcConnectionsPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetJdbcConnectionsJdbcConnectionsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetJdbcConnectionsJdbcConnectionsPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetJdbcConnectionsJdbcConnectionsPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetJdbcConnectionsJdbcConnectionsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetJdbcConnectionsJdbcConnectionsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetJdbcConnectionsJdbcConnectionsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetJdbcConnectionsJdbcConnectionsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetJdbcConnectionsJdbcConnectionsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetJdbcConnectionsJdbcConnectionsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetJdbcConnectionsJdbcConnectionsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetJdbcConnectionsJdbcConnectionsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetJdbcConnectionsJdbcConnectionsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetJdbcConnectionsJdbcConnectionsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetJdbcConnectionsJdbcConnectionsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetJdbcConnectionsJdbcConnectionsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetJdbcConnectionsJdbcConnectionsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetJmsDestinationsJmsDestinationsPayload includes the requested fields of the GraphQL type JmsDestinationsPayload. +type deleteBundleSetJmsDestinationsJmsDestinationsPayload struct { + DetailedStatus []*deleteBundleSetJmsDestinationsJmsDestinationsPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetJmsDestinationsJmsDestinationsPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetJmsDestinationsJmsDestinationsPayload) GetDetailedStatus() []*deleteBundleSetJmsDestinationsJmsDestinationsPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetJmsDestinationsJmsDestinationsPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetJmsDestinationsJmsDestinationsPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetJmsDestinationsJmsDestinationsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetJmsDestinationsJmsDestinationsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetJmsDestinationsJmsDestinationsPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetJmsDestinationsJmsDestinationsPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetJmsDestinationsJmsDestinationsPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetJmsDestinationsJmsDestinationsPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetJmsDestinationsJmsDestinationsPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetJmsDestinationsJmsDestinationsPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetJmsDestinationsJmsDestinationsPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetJmsDestinationsJmsDestinationsPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetJmsDestinationsJmsDestinationsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetJmsDestinationsJmsDestinationsPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetJmsDestinationsJmsDestinationsPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetJmsDestinationsJmsDestinationsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetJmsDestinationsJmsDestinationsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetJmsDestinationsJmsDestinationsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetJmsDestinationsJmsDestinationsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetJmsDestinationsJmsDestinationsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetJmsDestinationsJmsDestinationsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetJmsDestinationsJmsDestinationsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetJmsDestinationsJmsDestinationsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetJmsDestinationsJmsDestinationsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetJmsDestinationsJmsDestinationsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetJmsDestinationsJmsDestinationsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetJmsDestinationsJmsDestinationsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetJmsDestinationsJmsDestinationsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetKerberosConfigsKerberosConfigPayload includes the requested fields of the GraphQL type KerberosConfigPayload. +type deleteBundleSetKerberosConfigsKerberosConfigPayload struct { + DetailedStatus []*deleteBundleSetKerberosConfigsKerberosConfigPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetKerberosConfigsKerberosConfigPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetKerberosConfigsKerberosConfigPayload) GetDetailedStatus() []*deleteBundleSetKerberosConfigsKerberosConfigPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetKerberosConfigsKerberosConfigPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetKerberosConfigsKerberosConfigPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetKerberosConfigsKerberosConfigPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetKerberosConfigsKerberosConfigPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetKerberosConfigsKerberosConfigPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetKerberosConfigsKerberosConfigPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetKerberosConfigsKerberosConfigPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetKerberosConfigsKerberosConfigPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetKerberosConfigsKerberosConfigPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetKerberosConfigsKerberosConfigPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetKerberosConfigsKerberosConfigPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetKerberosConfigsKerberosConfigPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetKerberosConfigsKerberosConfigPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetKerberosConfigsKerberosConfigPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetKerberosConfigsKerberosConfigPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetKerberosConfigsKerberosConfigPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetKerberosConfigsKerberosConfigPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetKerberosConfigsKerberosConfigPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetKerberosConfigsKerberosConfigPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetKerberosConfigsKerberosConfigPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetKerberosConfigsKerberosConfigPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetKerberosConfigsKerberosConfigPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetKerberosConfigsKerberosConfigPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetKerberosConfigsKerberosConfigPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetKerberosConfigsKerberosConfigPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetKerberosConfigsKerberosConfigPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetKerberosConfigsKerberosConfigPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetKerberosConfigsKerberosConfigPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetKeysKeysPayload includes the requested fields of the GraphQL type KeysPayload. +type deleteBundleSetKeysKeysPayload struct { + DetailedStatus []*deleteBundleSetKeysKeysPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetKeysKeysPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetKeysKeysPayload) GetDetailedStatus() []*deleteBundleSetKeysKeysPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetKeysKeysPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetKeysKeysPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetKeysKeysPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetKeysKeysPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetKeysKeysPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetKeysKeysPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetKeysKeysPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetKeysKeysPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetKeysKeysPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetKeysKeysPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetKeysKeysPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetKeysKeysPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetKeysKeysPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetKeysKeysPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetKeysKeysPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetKeysKeysPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetKeysKeysPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetKeysKeysPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetKeysKeysPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetKeysKeysPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetKeysKeysPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetKeysKeysPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetKeysKeysPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetKeysKeysPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetKeysKeysPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetKeysKeysPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetKeysKeysPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetKeysKeysPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetLdapIdpsLdapIdpsPayload includes the requested fields of the GraphQL type LdapIdpsPayload. +type deleteBundleSetLdapIdpsLdapIdpsPayload struct { + DetailedStatus []*deleteBundleSetLdapIdpsLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetLdapIdpsLdapIdpsPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetLdapIdpsLdapIdpsPayload) GetDetailedStatus() []*deleteBundleSetLdapIdpsLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetLdapIdpsLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetLdapIdpsLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetLdapIdpsLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetLdapIdpsLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetLdapIdpsLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetLdapIdpsLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetLdapIdpsLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetLdapIdpsLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetLdapIdpsLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetLdapIdpsLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetLdapIdpsLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetLdapIdpsLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetLdapIdpsLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetLdapIdpsLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetLdapIdpsLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetLdapIdpsLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetLdapIdpsLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetLdapIdpsLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetLdapIdpsLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetLdapIdpsLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetLdapIdpsLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetLdapIdpsLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetLdapIdpsLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetLdapIdpsLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetLdapIdpsLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetLdapIdpsLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetLdapIdpsLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetLdapIdpsLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetLdapsLdapsPayload includes the requested fields of the GraphQL type LdapsPayload. +type deleteBundleSetLdapsLdapsPayload struct { + DetailedStatus []*deleteBundleSetLdapsLdapsPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetLdapsLdapsPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetLdapsLdapsPayload) GetDetailedStatus() []*deleteBundleSetLdapsLdapsPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetLdapsLdapsPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetLdapsLdapsPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetLdapsLdapsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetLdapsLdapsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetLdapsLdapsPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetLdapsLdapsPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetLdapsLdapsPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetLdapsLdapsPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetLdapsLdapsPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetLdapsLdapsPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetLdapsLdapsPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetLdapsLdapsPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetLdapsLdapsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetLdapsLdapsPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetLdapsLdapsPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetLdapsLdapsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetLdapsLdapsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetLdapsLdapsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetLdapsLdapsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetLdapsLdapsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetLdapsLdapsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetLdapsLdapsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetLdapsLdapsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetLdapsLdapsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetLdapsLdapsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetLdapsLdapsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetLdapsLdapsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetLdapsLdapsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetListenPortsListenPortsPayload includes the requested fields of the GraphQL type ListenPortsPayload. +type deleteBundleSetListenPortsListenPortsPayload struct { + DetailedStatus []*deleteBundleSetListenPortsListenPortsPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetListenPortsListenPortsPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetListenPortsListenPortsPayload) GetDetailedStatus() []*deleteBundleSetListenPortsListenPortsPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetListenPortsListenPortsPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetListenPortsListenPortsPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetListenPortsListenPortsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetListenPortsListenPortsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetListenPortsListenPortsPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetListenPortsListenPortsPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetListenPortsListenPortsPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetListenPortsListenPortsPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetListenPortsListenPortsPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetListenPortsListenPortsPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetListenPortsListenPortsPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetListenPortsListenPortsPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetListenPortsListenPortsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetListenPortsListenPortsPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetListenPortsListenPortsPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetListenPortsListenPortsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetListenPortsListenPortsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetListenPortsListenPortsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetListenPortsListenPortsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetListenPortsListenPortsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetListenPortsListenPortsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetListenPortsListenPortsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetListenPortsListenPortsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetListenPortsListenPortsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetListenPortsListenPortsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetListenPortsListenPortsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetListenPortsListenPortsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetListenPortsListenPortsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetLogSinksLogSinksPayload includes the requested fields of the GraphQL type LogSinksPayload. +type deleteBundleSetLogSinksLogSinksPayload struct { + DetailedStatus []*deleteBundleSetLogSinksLogSinksPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetLogSinksLogSinksPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetLogSinksLogSinksPayload) GetDetailedStatus() []*deleteBundleSetLogSinksLogSinksPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetLogSinksLogSinksPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetLogSinksLogSinksPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetLogSinksLogSinksPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetLogSinksLogSinksPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetLogSinksLogSinksPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetLogSinksLogSinksPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetLogSinksLogSinksPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetLogSinksLogSinksPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetLogSinksLogSinksPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetLogSinksLogSinksPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetLogSinksLogSinksPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetLogSinksLogSinksPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetLogSinksLogSinksPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetLogSinksLogSinksPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetLogSinksLogSinksPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetLogSinksLogSinksPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetLogSinksLogSinksPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetLogSinksLogSinksPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetLogSinksLogSinksPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetLogSinksLogSinksPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetLogSinksLogSinksPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetLogSinksLogSinksPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetLogSinksLogSinksPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetLogSinksLogSinksPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetLogSinksLogSinksPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetLogSinksLogSinksPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetLogSinksLogSinksPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetLogSinksLogSinksPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetPasswordPoliciesPasswordPoliciesPayLoad includes the requested fields of the GraphQL type PasswordPoliciesPayLoad. +type deleteBundleSetPasswordPoliciesPasswordPoliciesPayLoad struct { + DetailedStatus []*deleteBundleSetPasswordPoliciesPasswordPoliciesPayLoadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetPasswordPoliciesPasswordPoliciesPayLoad.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPasswordPoliciesPasswordPoliciesPayLoad) GetDetailedStatus() []*deleteBundleSetPasswordPoliciesPasswordPoliciesPayLoadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetPasswordPoliciesPasswordPoliciesPayLoadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetPasswordPoliciesPasswordPoliciesPayLoadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetPasswordPoliciesPasswordPoliciesPayLoadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetPasswordPoliciesPasswordPoliciesPayLoadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetPasswordPoliciesPasswordPoliciesPayLoadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPasswordPoliciesPasswordPoliciesPayLoadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetPasswordPoliciesPasswordPoliciesPayLoadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPasswordPoliciesPasswordPoliciesPayLoadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetPasswordPoliciesPasswordPoliciesPayLoadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPasswordPoliciesPasswordPoliciesPayLoadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetPasswordPoliciesPasswordPoliciesPayLoadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPasswordPoliciesPasswordPoliciesPayLoadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetPasswordPoliciesPasswordPoliciesPayLoadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetPasswordPoliciesPasswordPoliciesPayLoadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPasswordPoliciesPasswordPoliciesPayLoadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetPasswordPoliciesPasswordPoliciesPayLoadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetPasswordPoliciesPasswordPoliciesPayLoadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetPasswordPoliciesPasswordPoliciesPayLoadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetPasswordPoliciesPasswordPoliciesPayLoadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPasswordPoliciesPasswordPoliciesPayLoadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetPasswordPoliciesPasswordPoliciesPayLoadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPasswordPoliciesPasswordPoliciesPayLoadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetPasswordPoliciesPasswordPoliciesPayLoadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetPasswordPoliciesPasswordPoliciesPayLoadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetPasswordPoliciesPasswordPoliciesPayLoadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPasswordPoliciesPasswordPoliciesPayLoadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetPasswordPoliciesPasswordPoliciesPayLoadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPasswordPoliciesPasswordPoliciesPayLoadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetPoliciesL7PoliciesPayload includes the requested fields of the GraphQL type L7PoliciesPayload. +type deleteBundleSetPoliciesL7PoliciesPayload struct { + DetailedStatus []*deleteBundleSetPoliciesL7PoliciesPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetPoliciesL7PoliciesPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPoliciesL7PoliciesPayload) GetDetailedStatus() []*deleteBundleSetPoliciesL7PoliciesPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetPoliciesL7PoliciesPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetPoliciesL7PoliciesPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetPoliciesL7PoliciesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetPoliciesL7PoliciesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetPoliciesL7PoliciesPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPoliciesL7PoliciesPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetPoliciesL7PoliciesPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPoliciesL7PoliciesPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetPoliciesL7PoliciesPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPoliciesL7PoliciesPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetPoliciesL7PoliciesPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPoliciesL7PoliciesPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetPoliciesL7PoliciesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetPoliciesL7PoliciesPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPoliciesL7PoliciesPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetPoliciesL7PoliciesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetPoliciesL7PoliciesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetPoliciesL7PoliciesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetPoliciesL7PoliciesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPoliciesL7PoliciesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetPoliciesL7PoliciesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPoliciesL7PoliciesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetPoliciesL7PoliciesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetPoliciesL7PoliciesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetPoliciesL7PoliciesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPoliciesL7PoliciesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetPoliciesL7PoliciesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPoliciesL7PoliciesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetPolicyAliasesL7PolicyAliasesPayload includes the requested fields of the GraphQL type L7PolicyAliasesPayload. +type deleteBundleSetPolicyAliasesL7PolicyAliasesPayload struct { + DetailedStatus []*deleteBundleSetPolicyAliasesL7PolicyAliasesPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetPolicyAliasesL7PolicyAliasesPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyAliasesL7PolicyAliasesPayload) GetDetailedStatus() []*deleteBundleSetPolicyAliasesL7PolicyAliasesPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetPolicyAliasesL7PolicyAliasesPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetPolicyAliasesL7PolicyAliasesPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetPolicyAliasesL7PolicyAliasesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetPolicyAliasesL7PolicyAliasesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetPolicyAliasesL7PolicyAliasesPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyAliasesL7PolicyAliasesPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetPolicyAliasesL7PolicyAliasesPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyAliasesL7PolicyAliasesPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetPolicyAliasesL7PolicyAliasesPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyAliasesL7PolicyAliasesPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetPolicyAliasesL7PolicyAliasesPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyAliasesL7PolicyAliasesPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetPolicyAliasesL7PolicyAliasesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetPolicyAliasesL7PolicyAliasesPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyAliasesL7PolicyAliasesPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetPolicyAliasesL7PolicyAliasesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetPolicyAliasesL7PolicyAliasesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetPolicyAliasesL7PolicyAliasesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetPolicyAliasesL7PolicyAliasesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyAliasesL7PolicyAliasesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetPolicyAliasesL7PolicyAliasesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyAliasesL7PolicyAliasesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetPolicyAliasesL7PolicyAliasesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetPolicyAliasesL7PolicyAliasesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetPolicyAliasesL7PolicyAliasesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyAliasesL7PolicyAliasesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetPolicyAliasesL7PolicyAliasesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyAliasesL7PolicyAliasesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetPolicyBackedIdpsPolicyBackedIdpsPayload includes the requested fields of the GraphQL type PolicyBackedIdpsPayload. +type deleteBundleSetPolicyBackedIdpsPolicyBackedIdpsPayload struct { + DetailedStatus []*deleteBundleSetPolicyBackedIdpsPolicyBackedIdpsPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetPolicyBackedIdpsPolicyBackedIdpsPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyBackedIdpsPolicyBackedIdpsPayload) GetDetailedStatus() []*deleteBundleSetPolicyBackedIdpsPolicyBackedIdpsPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetPolicyBackedIdpsPolicyBackedIdpsPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetPolicyBackedIdpsPolicyBackedIdpsPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetPolicyBackedIdpsPolicyBackedIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetPolicyBackedIdpsPolicyBackedIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetPolicyBackedIdpsPolicyBackedIdpsPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyBackedIdpsPolicyBackedIdpsPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetPolicyBackedIdpsPolicyBackedIdpsPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyBackedIdpsPolicyBackedIdpsPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetPolicyBackedIdpsPolicyBackedIdpsPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyBackedIdpsPolicyBackedIdpsPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetPolicyBackedIdpsPolicyBackedIdpsPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyBackedIdpsPolicyBackedIdpsPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetPolicyBackedIdpsPolicyBackedIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetPolicyBackedIdpsPolicyBackedIdpsPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyBackedIdpsPolicyBackedIdpsPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetPolicyBackedIdpsPolicyBackedIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetPolicyBackedIdpsPolicyBackedIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetPolicyBackedIdpsPolicyBackedIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetPolicyBackedIdpsPolicyBackedIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyBackedIdpsPolicyBackedIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetPolicyBackedIdpsPolicyBackedIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyBackedIdpsPolicyBackedIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetPolicyBackedIdpsPolicyBackedIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetPolicyBackedIdpsPolicyBackedIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetPolicyBackedIdpsPolicyBackedIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyBackedIdpsPolicyBackedIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetPolicyBackedIdpsPolicyBackedIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyBackedIdpsPolicyBackedIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetPolicyBackedServicesPolicyBackedServicesPayload includes the requested fields of the GraphQL type PolicyBackedServicesPayload. +type deleteBundleSetPolicyBackedServicesPolicyBackedServicesPayload struct { + DetailedStatus []*deleteBundleSetPolicyBackedServicesPolicyBackedServicesPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetPolicyBackedServicesPolicyBackedServicesPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyBackedServicesPolicyBackedServicesPayload) GetDetailedStatus() []*deleteBundleSetPolicyBackedServicesPolicyBackedServicesPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetPolicyBackedServicesPolicyBackedServicesPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetPolicyBackedServicesPolicyBackedServicesPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetPolicyBackedServicesPolicyBackedServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetPolicyBackedServicesPolicyBackedServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetPolicyBackedServicesPolicyBackedServicesPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyBackedServicesPolicyBackedServicesPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetPolicyBackedServicesPolicyBackedServicesPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyBackedServicesPolicyBackedServicesPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetPolicyBackedServicesPolicyBackedServicesPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyBackedServicesPolicyBackedServicesPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetPolicyBackedServicesPolicyBackedServicesPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyBackedServicesPolicyBackedServicesPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetPolicyBackedServicesPolicyBackedServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetPolicyBackedServicesPolicyBackedServicesPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyBackedServicesPolicyBackedServicesPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetPolicyBackedServicesPolicyBackedServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetPolicyBackedServicesPolicyBackedServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetPolicyBackedServicesPolicyBackedServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetPolicyBackedServicesPolicyBackedServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyBackedServicesPolicyBackedServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetPolicyBackedServicesPolicyBackedServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyBackedServicesPolicyBackedServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetPolicyBackedServicesPolicyBackedServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetPolicyBackedServicesPolicyBackedServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetPolicyBackedServicesPolicyBackedServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyBackedServicesPolicyBackedServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetPolicyBackedServicesPolicyBackedServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyBackedServicesPolicyBackedServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetPolicyFragmentsPolicyFragmentsPayload includes the requested fields of the GraphQL type PolicyFragmentsPayload. +type deleteBundleSetPolicyFragmentsPolicyFragmentsPayload struct { + DetailedStatus []*deleteBundleSetPolicyFragmentsPolicyFragmentsPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetPolicyFragmentsPolicyFragmentsPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyFragmentsPolicyFragmentsPayload) GetDetailedStatus() []*deleteBundleSetPolicyFragmentsPolicyFragmentsPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetPolicyFragmentsPolicyFragmentsPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetPolicyFragmentsPolicyFragmentsPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetPolicyFragmentsPolicyFragmentsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetPolicyFragmentsPolicyFragmentsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetPolicyFragmentsPolicyFragmentsPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyFragmentsPolicyFragmentsPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetPolicyFragmentsPolicyFragmentsPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyFragmentsPolicyFragmentsPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetPolicyFragmentsPolicyFragmentsPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyFragmentsPolicyFragmentsPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetPolicyFragmentsPolicyFragmentsPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyFragmentsPolicyFragmentsPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetPolicyFragmentsPolicyFragmentsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetPolicyFragmentsPolicyFragmentsPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyFragmentsPolicyFragmentsPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetPolicyFragmentsPolicyFragmentsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetPolicyFragmentsPolicyFragmentsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetPolicyFragmentsPolicyFragmentsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetPolicyFragmentsPolicyFragmentsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyFragmentsPolicyFragmentsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetPolicyFragmentsPolicyFragmentsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyFragmentsPolicyFragmentsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetPolicyFragmentsPolicyFragmentsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetPolicyFragmentsPolicyFragmentsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetPolicyFragmentsPolicyFragmentsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyFragmentsPolicyFragmentsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetPolicyFragmentsPolicyFragmentsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetPolicyFragmentsPolicyFragmentsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetRevocationCheckPoliciesRevocationCheckPoliciesPayload includes the requested fields of the GraphQL type RevocationCheckPoliciesPayload. +type deleteBundleSetRevocationCheckPoliciesRevocationCheckPoliciesPayload struct { + DetailedStatus []*deleteBundleSetRevocationCheckPoliciesRevocationCheckPoliciesPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetRevocationCheckPoliciesRevocationCheckPoliciesPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetRevocationCheckPoliciesRevocationCheckPoliciesPayload) GetDetailedStatus() []*deleteBundleSetRevocationCheckPoliciesRevocationCheckPoliciesPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetRevocationCheckPoliciesRevocationCheckPoliciesPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetRevocationCheckPoliciesRevocationCheckPoliciesPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetRevocationCheckPoliciesRevocationCheckPoliciesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetRevocationCheckPoliciesRevocationCheckPoliciesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetRevocationCheckPoliciesRevocationCheckPoliciesPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetRevocationCheckPoliciesRevocationCheckPoliciesPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetRevocationCheckPoliciesRevocationCheckPoliciesPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetRevocationCheckPoliciesRevocationCheckPoliciesPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetRevocationCheckPoliciesRevocationCheckPoliciesPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetRevocationCheckPoliciesRevocationCheckPoliciesPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetRevocationCheckPoliciesRevocationCheckPoliciesPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetRevocationCheckPoliciesRevocationCheckPoliciesPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetRevocationCheckPoliciesRevocationCheckPoliciesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetRevocationCheckPoliciesRevocationCheckPoliciesPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetRevocationCheckPoliciesRevocationCheckPoliciesPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetRevocationCheckPoliciesRevocationCheckPoliciesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetRevocationCheckPoliciesRevocationCheckPoliciesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetRevocationCheckPoliciesRevocationCheckPoliciesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetRevocationCheckPoliciesRevocationCheckPoliciesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetRevocationCheckPoliciesRevocationCheckPoliciesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetRevocationCheckPoliciesRevocationCheckPoliciesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetRevocationCheckPoliciesRevocationCheckPoliciesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetRevocationCheckPoliciesRevocationCheckPoliciesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetRevocationCheckPoliciesRevocationCheckPoliciesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetRevocationCheckPoliciesRevocationCheckPoliciesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetRevocationCheckPoliciesRevocationCheckPoliciesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetRevocationCheckPoliciesRevocationCheckPoliciesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetRevocationCheckPoliciesRevocationCheckPoliciesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetRolesRolesPayload includes the requested fields of the GraphQL type RolesPayload. +type deleteBundleSetRolesRolesPayload struct { + DetailedStatus []*deleteBundleSetRolesRolesPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetRolesRolesPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetRolesRolesPayload) GetDetailedStatus() []*deleteBundleSetRolesRolesPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetRolesRolesPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetRolesRolesPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetRolesRolesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetRolesRolesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetRolesRolesPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetRolesRolesPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetRolesRolesPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetRolesRolesPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetRolesRolesPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetRolesRolesPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetRolesRolesPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetRolesRolesPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetRolesRolesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetRolesRolesPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetRolesRolesPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetRolesRolesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetRolesRolesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetRolesRolesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetRolesRolesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetRolesRolesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetRolesRolesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetRolesRolesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetRolesRolesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetRolesRolesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetRolesRolesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetRolesRolesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetRolesRolesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetRolesRolesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetSMConfigsSMConfigsPayload includes the requested fields of the GraphQL type SMConfigsPayload. +type deleteBundleSetSMConfigsSMConfigsPayload struct { + DetailedStatus []*deleteBundleSetSMConfigsSMConfigsPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetSMConfigsSMConfigsPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSMConfigsSMConfigsPayload) GetDetailedStatus() []*deleteBundleSetSMConfigsSMConfigsPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetSMConfigsSMConfigsPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetSMConfigsSMConfigsPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetSMConfigsSMConfigsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetSMConfigsSMConfigsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetSMConfigsSMConfigsPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSMConfigsSMConfigsPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetSMConfigsSMConfigsPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSMConfigsSMConfigsPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetSMConfigsSMConfigsPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSMConfigsSMConfigsPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetSMConfigsSMConfigsPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSMConfigsSMConfigsPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetSMConfigsSMConfigsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetSMConfigsSMConfigsPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSMConfigsSMConfigsPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetSMConfigsSMConfigsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetSMConfigsSMConfigsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetSMConfigsSMConfigsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetSMConfigsSMConfigsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSMConfigsSMConfigsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetSMConfigsSMConfigsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSMConfigsSMConfigsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetSMConfigsSMConfigsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetSMConfigsSMConfigsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetSMConfigsSMConfigsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSMConfigsSMConfigsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetSMConfigsSMConfigsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSMConfigsSMConfigsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetSampleMessagesSampleMessagesPayload includes the requested fields of the GraphQL type SampleMessagesPayload. +type deleteBundleSetSampleMessagesSampleMessagesPayload struct { + DetailedStatus []*deleteBundleSetSampleMessagesSampleMessagesPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetSampleMessagesSampleMessagesPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSampleMessagesSampleMessagesPayload) GetDetailedStatus() []*deleteBundleSetSampleMessagesSampleMessagesPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetSampleMessagesSampleMessagesPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetSampleMessagesSampleMessagesPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetSampleMessagesSampleMessagesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetSampleMessagesSampleMessagesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetSampleMessagesSampleMessagesPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSampleMessagesSampleMessagesPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetSampleMessagesSampleMessagesPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSampleMessagesSampleMessagesPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetSampleMessagesSampleMessagesPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSampleMessagesSampleMessagesPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetSampleMessagesSampleMessagesPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSampleMessagesSampleMessagesPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetSampleMessagesSampleMessagesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetSampleMessagesSampleMessagesPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSampleMessagesSampleMessagesPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetSampleMessagesSampleMessagesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetSampleMessagesSampleMessagesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetSampleMessagesSampleMessagesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetSampleMessagesSampleMessagesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSampleMessagesSampleMessagesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetSampleMessagesSampleMessagesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSampleMessagesSampleMessagesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetSampleMessagesSampleMessagesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetSampleMessagesSampleMessagesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetSampleMessagesSampleMessagesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSampleMessagesSampleMessagesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetSampleMessagesSampleMessagesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSampleMessagesSampleMessagesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetScheduledTasksScheduledTasksPayload includes the requested fields of the GraphQL type ScheduledTasksPayload. +type deleteBundleSetScheduledTasksScheduledTasksPayload struct { + DetailedStatus []*deleteBundleSetScheduledTasksScheduledTasksPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetScheduledTasksScheduledTasksPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetScheduledTasksScheduledTasksPayload) GetDetailedStatus() []*deleteBundleSetScheduledTasksScheduledTasksPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetScheduledTasksScheduledTasksPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetScheduledTasksScheduledTasksPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetScheduledTasksScheduledTasksPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetScheduledTasksScheduledTasksPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetScheduledTasksScheduledTasksPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetScheduledTasksScheduledTasksPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetScheduledTasksScheduledTasksPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetScheduledTasksScheduledTasksPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetScheduledTasksScheduledTasksPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetScheduledTasksScheduledTasksPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetScheduledTasksScheduledTasksPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetScheduledTasksScheduledTasksPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetScheduledTasksScheduledTasksPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetScheduledTasksScheduledTasksPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetScheduledTasksScheduledTasksPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetScheduledTasksScheduledTasksPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetScheduledTasksScheduledTasksPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetScheduledTasksScheduledTasksPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetScheduledTasksScheduledTasksPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetScheduledTasksScheduledTasksPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetScheduledTasksScheduledTasksPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetScheduledTasksScheduledTasksPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetScheduledTasksScheduledTasksPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetScheduledTasksScheduledTasksPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetScheduledTasksScheduledTasksPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetScheduledTasksScheduledTasksPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetScheduledTasksScheduledTasksPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetScheduledTasksScheduledTasksPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetSchemasSchemasPayload includes the requested fields of the GraphQL type SchemasPayload. +type deleteBundleSetSchemasSchemasPayload struct { + DetailedStatus []*deleteBundleSetSchemasSchemasPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetSchemasSchemasPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSchemasSchemasPayload) GetDetailedStatus() []*deleteBundleSetSchemasSchemasPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetSchemasSchemasPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetSchemasSchemasPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetSchemasSchemasPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetSchemasSchemasPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetSchemasSchemasPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSchemasSchemasPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetSchemasSchemasPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSchemasSchemasPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetSchemasSchemasPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSchemasSchemasPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetSchemasSchemasPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSchemasSchemasPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetSchemasSchemasPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetSchemasSchemasPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSchemasSchemasPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetSchemasSchemasPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetSchemasSchemasPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetSchemasSchemasPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetSchemasSchemasPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSchemasSchemasPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetSchemasSchemasPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSchemasSchemasPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetSchemasSchemasPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetSchemasSchemasPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetSchemasSchemasPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSchemasSchemasPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetSchemasSchemasPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSchemasSchemasPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetSecretsSecretsPayload includes the requested fields of the GraphQL type SecretsPayload. +type deleteBundleSetSecretsSecretsPayload struct { + DetailedStatus []*deleteBundleSetSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetSecretsSecretsPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSecretsSecretsPayload) GetDetailedStatus() []*deleteBundleSetSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetServerModuleFilesServerModuleFilesPayload includes the requested fields of the GraphQL type ServerModuleFilesPayload. +type deleteBundleSetServerModuleFilesServerModuleFilesPayload struct { + DetailedStatus []*deleteBundleSetServerModuleFilesServerModuleFilesPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetServerModuleFilesServerModuleFilesPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServerModuleFilesServerModuleFilesPayload) GetDetailedStatus() []*deleteBundleSetServerModuleFilesServerModuleFilesPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetServerModuleFilesServerModuleFilesPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetServerModuleFilesServerModuleFilesPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetServerModuleFilesServerModuleFilesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetServerModuleFilesServerModuleFilesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetServerModuleFilesServerModuleFilesPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServerModuleFilesServerModuleFilesPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetServerModuleFilesServerModuleFilesPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServerModuleFilesServerModuleFilesPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetServerModuleFilesServerModuleFilesPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServerModuleFilesServerModuleFilesPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetServerModuleFilesServerModuleFilesPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServerModuleFilesServerModuleFilesPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetServerModuleFilesServerModuleFilesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetServerModuleFilesServerModuleFilesPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServerModuleFilesServerModuleFilesPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetServerModuleFilesServerModuleFilesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetServerModuleFilesServerModuleFilesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetServerModuleFilesServerModuleFilesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetServerModuleFilesServerModuleFilesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServerModuleFilesServerModuleFilesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetServerModuleFilesServerModuleFilesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServerModuleFilesServerModuleFilesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetServerModuleFilesServerModuleFilesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetServerModuleFilesServerModuleFilesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetServerModuleFilesServerModuleFilesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServerModuleFilesServerModuleFilesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetServerModuleFilesServerModuleFilesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServerModuleFilesServerModuleFilesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetServiceAliasesL7ServiceAliasesPayload includes the requested fields of the GraphQL type L7ServiceAliasesPayload. +type deleteBundleSetServiceAliasesL7ServiceAliasesPayload struct { + DetailedStatus []*deleteBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetServiceAliasesL7ServiceAliasesPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServiceAliasesL7ServiceAliasesPayload) GetDetailedStatus() []*deleteBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoad includes the requested fields of the GraphQL type ServiceResolutionConfigsPayLoad. +type deleteBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoad struct { + DetailedStatus []*deleteBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoad.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoad) GetDetailedStatus() []*deleteBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetServicesL7ServicesPayload includes the requested fields of the GraphQL type L7ServicesPayload. +type deleteBundleSetServicesL7ServicesPayload struct { + DetailedStatus []*deleteBundleSetServicesL7ServicesPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetServicesL7ServicesPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServicesL7ServicesPayload) GetDetailedStatus() []*deleteBundleSetServicesL7ServicesPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetServicesL7ServicesPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetServicesL7ServicesPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetServicesL7ServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetServicesL7ServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetServicesL7ServicesPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServicesL7ServicesPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetServicesL7ServicesPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServicesL7ServicesPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetServicesL7ServicesPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServicesL7ServicesPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetServicesL7ServicesPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServicesL7ServicesPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetServicesL7ServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetServicesL7ServicesPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServicesL7ServicesPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetServicesL7ServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetServicesL7ServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetServicesL7ServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetServicesL7ServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServicesL7ServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetServicesL7ServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServicesL7ServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetServicesL7ServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetServicesL7ServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetServicesL7ServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServicesL7ServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetServicesL7ServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetServicesL7ServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetSimpleLdapIdpsSimpleLdapIdpsPayload includes the requested fields of the GraphQL type SimpleLdapIdpsPayload. +type deleteBundleSetSimpleLdapIdpsSimpleLdapIdpsPayload struct { + DetailedStatus []*deleteBundleSetSimpleLdapIdpsSimpleLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetSimpleLdapIdpsSimpleLdapIdpsPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSimpleLdapIdpsSimpleLdapIdpsPayload) GetDetailedStatus() []*deleteBundleSetSimpleLdapIdpsSimpleLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetSimpleLdapIdpsSimpleLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetSimpleLdapIdpsSimpleLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetSimpleLdapIdpsSimpleLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetSimpleLdapIdpsSimpleLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetSimpleLdapIdpsSimpleLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSimpleLdapIdpsSimpleLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetSimpleLdapIdpsSimpleLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSimpleLdapIdpsSimpleLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetSimpleLdapIdpsSimpleLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSimpleLdapIdpsSimpleLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetSimpleLdapIdpsSimpleLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSimpleLdapIdpsSimpleLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetSimpleLdapIdpsSimpleLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetSimpleLdapIdpsSimpleLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSimpleLdapIdpsSimpleLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetSimpleLdapIdpsSimpleLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetSimpleLdapIdpsSimpleLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetSimpleLdapIdpsSimpleLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetSimpleLdapIdpsSimpleLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSimpleLdapIdpsSimpleLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetSimpleLdapIdpsSimpleLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSimpleLdapIdpsSimpleLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetSimpleLdapIdpsSimpleLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetSimpleLdapIdpsSimpleLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetSimpleLdapIdpsSimpleLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSimpleLdapIdpsSimpleLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetSimpleLdapIdpsSimpleLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSimpleLdapIdpsSimpleLdapIdpsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetSoapServicesSoapServicesPayload includes the requested fields of the GraphQL type SoapServicesPayload. +type deleteBundleSetSoapServicesSoapServicesPayload struct { + DetailedStatus []*deleteBundleSetSoapServicesSoapServicesPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetSoapServicesSoapServicesPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSoapServicesSoapServicesPayload) GetDetailedStatus() []*deleteBundleSetSoapServicesSoapServicesPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetSoapServicesSoapServicesPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetSoapServicesSoapServicesPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetSoapServicesSoapServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetSoapServicesSoapServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetSoapServicesSoapServicesPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSoapServicesSoapServicesPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetSoapServicesSoapServicesPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSoapServicesSoapServicesPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetSoapServicesSoapServicesPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSoapServicesSoapServicesPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetSoapServicesSoapServicesPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSoapServicesSoapServicesPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetSoapServicesSoapServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetSoapServicesSoapServicesPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSoapServicesSoapServicesPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetSoapServicesSoapServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetSoapServicesSoapServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetSoapServicesSoapServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetSoapServicesSoapServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSoapServicesSoapServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetSoapServicesSoapServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSoapServicesSoapServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetSoapServicesSoapServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetSoapServicesSoapServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetSoapServicesSoapServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSoapServicesSoapServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetSoapServicesSoapServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetSoapServicesSoapServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetTrustedCertsTrustedCertsPayload includes the requested fields of the GraphQL type TrustedCertsPayload. +type deleteBundleSetTrustedCertsTrustedCertsPayload struct { + DetailedStatus []*deleteBundleSetTrustedCertsTrustedCertsPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetTrustedCertsTrustedCertsPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetTrustedCertsTrustedCertsPayload) GetDetailedStatus() []*deleteBundleSetTrustedCertsTrustedCertsPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetTrustedCertsTrustedCertsPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetTrustedCertsTrustedCertsPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetTrustedCertsTrustedCertsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetTrustedCertsTrustedCertsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetTrustedCertsTrustedCertsPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetTrustedCertsTrustedCertsPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetTrustedCertsTrustedCertsPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetTrustedCertsTrustedCertsPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetTrustedCertsTrustedCertsPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetTrustedCertsTrustedCertsPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetTrustedCertsTrustedCertsPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetTrustedCertsTrustedCertsPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetTrustedCertsTrustedCertsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetTrustedCertsTrustedCertsPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetTrustedCertsTrustedCertsPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetTrustedCertsTrustedCertsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetTrustedCertsTrustedCertsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetTrustedCertsTrustedCertsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetTrustedCertsTrustedCertsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetTrustedCertsTrustedCertsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetTrustedCertsTrustedCertsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetTrustedCertsTrustedCertsPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetTrustedCertsTrustedCertsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetTrustedCertsTrustedCertsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetTrustedCertsTrustedCertsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetTrustedCertsTrustedCertsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetTrustedCertsTrustedCertsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetTrustedCertsTrustedCertsPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetWebApiServicesWebApiServicesPayload includes the requested fields of the GraphQL type WebApiServicesPayload. +type deleteBundleSetWebApiServicesWebApiServicesPayload struct { + DetailedStatus []*deleteBundleSetWebApiServicesWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns deleteBundleSetWebApiServicesWebApiServicesPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteBundleSetWebApiServicesWebApiServicesPayload) GetDetailedStatus() []*deleteBundleSetWebApiServicesWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// deleteBundleSetWebApiServicesWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteBundleSetWebApiServicesWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*deleteBundleSetWebApiServicesWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*deleteBundleSetWebApiServicesWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns deleteBundleSetWebApiServicesWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *deleteBundleSetWebApiServicesWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns deleteBundleSetWebApiServicesWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteBundleSetWebApiServicesWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteBundleSetWebApiServicesWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteBundleSetWebApiServicesWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns deleteBundleSetWebApiServicesWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *deleteBundleSetWebApiServicesWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*deleteBundleSetWebApiServicesWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns deleteBundleSetWebApiServicesWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *deleteBundleSetWebApiServicesWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*deleteBundleSetWebApiServicesWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// deleteBundleSetWebApiServicesWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetWebApiServicesWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetWebApiServicesWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetWebApiServicesWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetWebApiServicesWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetWebApiServicesWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteBundleSetWebApiServicesWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type deleteBundleSetWebApiServicesWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns deleteBundleSetWebApiServicesWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *deleteBundleSetWebApiServicesWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns deleteBundleSetWebApiServicesWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *deleteBundleSetWebApiServicesWebApiServicesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + +// deleteKeysDeleteKeysKeysPayload includes the requested fields of the GraphQL type KeysPayload. +type deleteKeysDeleteKeysKeysPayload struct { + DetailedStatus []*deleteKeysDeleteKeysKeysPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` + Keys []*deleteKeysDeleteKeysKeysPayloadKeysKey `json:"keys"` +} + +// GetDetailedStatus returns deleteKeysDeleteKeysKeysPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteKeysDeleteKeysKeysPayload) GetDetailedStatus() []*deleteKeysDeleteKeysKeysPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// GetKeys returns deleteKeysDeleteKeysKeysPayload.Keys, and is useful for accessing the field via an interface. +func (v *deleteKeysDeleteKeysKeysPayload) GetKeys() []*deleteKeysDeleteKeysKeysPayloadKeysKey { + return v.Keys +} + +// deleteKeysDeleteKeysKeysPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteKeysDeleteKeysKeysPayloadDetailedStatusEntityMutationDetailedStatus struct { + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` +} + +// GetStatus returns deleteKeysDeleteKeysKeysPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteKeysDeleteKeysKeysPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteKeysDeleteKeysKeysPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteKeysDeleteKeysKeysPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { return v.Description } @@ -3934,254 +9158,95 @@ func (v *deleteL7PortalApiResponse) GetDeleteSecrets() *deleteL7PortalApiDeleteS } // deleteSecretsDeleteSecretsSecretsPayload includes the requested fields of the GraphQL type SecretsPayload. -type deleteSecretsDeleteSecretsSecretsPayload struct { - DetailedStatus []*deleteSecretsDeleteSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` - Secrets []*deleteSecretsDeleteSecretsSecretsPayloadSecretsSecret `json:"secrets"` -} - -// GetDetailedStatus returns deleteSecretsDeleteSecretsSecretsPayload.DetailedStatus, and is useful for accessing the field via an interface. -func (v *deleteSecretsDeleteSecretsSecretsPayload) GetDetailedStatus() []*deleteSecretsDeleteSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatus { - return v.DetailedStatus -} - -// GetSecrets returns deleteSecretsDeleteSecretsSecretsPayload.Secrets, and is useful for accessing the field via an interface. -func (v *deleteSecretsDeleteSecretsSecretsPayload) GetSecrets() []*deleteSecretsDeleteSecretsSecretsPayloadSecretsSecret { - return v.Secrets -} - -// deleteSecretsDeleteSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. -type deleteSecretsDeleteSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatus struct { - Status EntityMutationStatus `json:"status"` - Description string `json:"description"` -} - -// GetStatus returns deleteSecretsDeleteSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. -func (v *deleteSecretsDeleteSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { - return v.Status -} - -// GetDescription returns deleteSecretsDeleteSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. -func (v *deleteSecretsDeleteSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { - return v.Description -} - -// deleteSecretsDeleteSecretsSecretsPayloadSecretsSecret includes the requested fields of the GraphQL type Secret. -// The GraphQL type's documentation follows. -// -// A secret (password or private key) which is used by gateway policies and other configurations. -// > @l7-entity -// > @l7-identity-fields name -// > @l7-summary-fields goid,name,checksum -// > @l7-excluded-fields -type deleteSecretsDeleteSecretsSecretsPayloadSecretsSecret struct { - // The goid for the Secret - Goid string `json:"goid"` - // Identify the password being stored. You may use letters, numbers, dashes, and underscores. - // Names that contain spaces or periods are valid, but the resulting stored - // password cannot be referenced via context variable. - // Names that contain @ or $ are valid, but the resulting stored password cannot be referenced via context variable. - Name string `json:"name"` -} - -// GetGoid returns deleteSecretsDeleteSecretsSecretsPayloadSecretsSecret.Goid, and is useful for accessing the field via an interface. -func (v *deleteSecretsDeleteSecretsSecretsPayloadSecretsSecret) GetGoid() string { return v.Goid } - -// GetName returns deleteSecretsDeleteSecretsSecretsPayloadSecretsSecret.Name, and is useful for accessing the field via an interface. -func (v *deleteSecretsDeleteSecretsSecretsPayloadSecretsSecret) GetName() string { return v.Name } - -// deleteSecretsResponse is returned by deleteSecrets on success. -type deleteSecretsResponse struct { - // Deletes one or more existing secrets - DeleteSecrets *deleteSecretsDeleteSecretsSecretsPayload `json:"deleteSecrets"` -} - -// GetDeleteSecrets returns deleteSecretsResponse.DeleteSecrets, and is useful for accessing the field via an interface. -func (v *deleteSecretsResponse) GetDeleteSecrets() *deleteSecretsDeleteSecretsSecretsPayload { - return v.DeleteSecrets -} - -// installBundleGenericInstallBundleEntitiesBundleEntitiesPayload includes the requested fields of the GraphQL type BundleEntitiesPayload. -type installBundleGenericInstallBundleEntitiesBundleEntitiesPayload struct { - Summary bool `json:"summary"` -} - -// GetSummary returns installBundleGenericInstallBundleEntitiesBundleEntitiesPayload.Summary, and is useful for accessing the field via an interface. -func (v *installBundleGenericInstallBundleEntitiesBundleEntitiesPayload) GetSummary() bool { - return v.Summary -} - -// installBundleGenericResponse is returned by installBundleGeneric on success. -type installBundleGenericResponse struct { - // Installs bundle of entities using set-based mutation operations - InstallBundleEntities *installBundleGenericInstallBundleEntitiesBundleEntitiesPayload `json:"installBundleEntities"` -} - -// GetInstallBundleEntities returns installBundleGenericResponse.InstallBundleEntities, and is useful for accessing the field via an interface. -func (v *installBundleGenericResponse) GetInstallBundleEntities() *installBundleGenericInstallBundleEntitiesBundleEntitiesPayload { - return v.InstallBundleEntities -} - -// installBundleResponse is returned by installBundle on success. -type installBundleResponse struct { - // Sets Server module files. Updating the existing server module file is unsupported. - SetServerModuleFiles *installBundleSetServerModuleFilesServerModuleFilesPayload `json:"setServerModuleFiles"` - // Create or update existing cluster properties. If a cluster property with the given name does not - // exist, one will be created, otherwise the existing one will be updated. This returns the list of - // entities created and/or updated - SetClusterProperties *installBundleSetClusterPropertiesClusterPropertiesPayload `json:"setClusterProperties"` - // Update Service Resolution Configs - SetServiceResolutionConfigs *installBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoad `json:"setServiceResolutionConfigs"` - // Set/Update the Password Policies - SetPasswordPolicies *installBundleSetPasswordPoliciesPasswordPoliciesPayLoad `json:"setPasswordPolicies"` - // Create or update existing Administrative User Account Minimum cluster properties. - // If Administrative User Account Minimum cluster property with the given name - // does not exist, one will be created, otherwise the existing one will be updated. - // This returns the list of entities created and/or updated. - // Below are the allowed Administrative User Account Minimum properties - // logonMaxAllowableAttempts : Logon attempts must be between 1 and 20 - // logonLockoutTime : Lockout period must be between 1 and 86400 seconds - // logonSessionExpiry : Expiry period must be between 1 and 86400 seconds - // logonInactivityPeriod : Inactivity period must be between 1 and 365 days - SetAdministrativeUserAccountProperties *installBundleSetAdministrativeUserAccountPropertiesAdministrativeUserAccountPropertiesPayload `json:"setAdministrativeUserAccountProperties"` - // Set the Folders - SetFolders *installBundleSetFoldersFoldersPayload `json:"setFolders"` - // Create or update existing revocation check policies. - // Match is carried by name. If match is found, it will be updated. Otherwise, it will be created. - SetRevocationCheckPolicies *installBundleSetRevocationCheckPoliciesRevocationCheckPoliciesPayload `json:"setRevocationCheckPolicies"` - // Create or update trusted certificates. - // If a certificate with the same sha1 thumbprint already exist, it will be updated. - SetTrustedCerts *installBundleSetTrustedCertsTrustedCertsPayload `json:"setTrustedCerts"` - // Creates or updates one or more secrets - SetSecrets *installBundleSetSecretsSecretsPayload `json:"setSecrets"` - // Create or update existing http configuration. - SetHttpConfigurations *installBundleSetHttpConfigurationsHttpConfigurationsPayload `json:"setHttpConfigurations"` - // Create or update existing custom key values data. If a custom key value with the given key does not - // exist, one will be created, otherwise the existing one will be updated. This returns the list of - // entities created and/or updated - SetCustomKeyValues *installBundleSetCustomKeyValuesCustomKeyValuePayload `json:"setCustomKeyValues"` - // Create or Update multiple XML schemas - SetSchemas *installBundleSetSchemasSchemasPayload `json:"setSchemas"` - // Create or Update multiple DTD resources - SetDtds *installBundleSetDtdsDtdsPayload `json:"setDtds"` - // Create or update JDBC connections. - // If JDBC connection with the same name exist, the JDBC connection will be updated. - // If no JDBC connection with the name exist, a new JDBC connection will be created. - SetJdbcConnections *installBundleSetJdbcConnectionsJdbcConnectionsPayload `json:"setJdbcConnections"` - // Creates or updates one ore more internal IDP configurations - SetInternalIdps *installBundleSetInternalIdpsInternalIdpsPayload `json:"setInternalIdps"` - // Creates or updates one or more fips - SetFederatedIdps *installBundleSetFederatedIdpsFederatedIdpsPayload `json:"setFederatedIdps"` - // Creates or updates one or more ldaps - SetLdapIdps *installBundleSetLdapIdpsLdapIdpsPayload `json:"setLdapIdps"` - // Creates or updates one or more simple ldaps - SetSimpleLdapIdps *installBundleSetSimpleLdapIdpsSimpleLdapIdpsPayload `json:"setSimpleLdapIdps"` - // Creates or updates one or more fips - SetFips *installBundleSetFipsFipsPayload `json:"setFips"` - // Creates or updates one or more ldaps - SetLdaps *installBundleSetLdapsLdapsPayload `json:"setLdaps"` - // Creates or updates one or more fip groups - SetFederatedGroups *installBundleSetFederatedGroupsFederatedGroupsPayload `json:"setFederatedGroups"` - // Creates or updates one or more fip groups - SetFipGroups *installBundleSetFipGroupsFipGroupsPayload `json:"setFipGroups"` - // Creates or updates one or more internal groups - SetInternalGroups *installBundleSetInternalGroupsInternalGroupsPayload `json:"setInternalGroups"` - // Creates or updates one or more fip users. - // NOTE: Existing user will be found by either login or subjectDn or name. - SetFederatedUsers *installBundleSetFederatedUsersFederatedUsersPayload `json:"setFederatedUsers"` - // Creates or updates one or more fip users. - // NOTE: Existing user will be found by either login or subjectDn or name. - SetFipUsers *installBundleSetFipUsersFipUsersPayload `json:"setFipUsers"` - // Creates or updates one or more internal users - SetInternalUsers *installBundleSetInternalUsersInternalUsersPayload `json:"setInternalUsers"` - // Create or update Cassandra connections. - // If Cassandra connection with the same name exist, the Cassandra connection will be updated. - // If no Cassandra connection with the name exist, a new Cassandra connection will be created. - SetCassandraConnections *installBundleSetCassandraConnectionsCassandraConnectionsPayload `json:"setCassandraConnections"` - // Create or update existing siteminder configurations. - // Match is carried by name. If match is found, it will be updated. Otherwise, it will be created - SetSMConfigs *installBundleSetSMConfigsSMConfigsPayload `json:"setSMConfigs"` - // Create or update policies - SetPolicies *installBundleSetPoliciesL7PoliciesPayload `json:"setPolicies"` - // Create or update policy fragments - SetPolicyFragments *installBundleSetPolicyFragmentsPolicyFragmentsPayload `json:"setPolicyFragments"` - // Create or update Encapsulated Assertion Configurations - SetEncassConfigs *installBundleSetEncassConfigsEncassConfigsPayload `json:"setEncassConfigs"` - // Create or update global policies - SetGlobalPolicies *installBundleSetGlobalPoliciesGlobalPoliciesPayload `json:"setGlobalPolicies"` - // Creates or updates one or more background task policies - SetBackgroundTaskPolicies *installBundleSetBackgroundTaskPoliciesBackgroundTaskPoliciesPayload `json:"setBackgroundTaskPolicies"` - // Create or update services - SetServices *installBundleSetServicesL7ServicesPayload `json:"setServices"` - // Create or update web api services - SetWebApiServices *installBundleSetWebApiServicesWebApiServicesPayload `json:"setWebApiServices"` - // Create or update soap services - SetSoapServices *installBundleSetSoapServicesSoapServicesPayload `json:"setSoapServices"` - // Create or update Internal web api services - SetInternalWebApiServices *installBundleSetInternalWebApiServicesInternalWebApiServicesPayload `json:"setInternalWebApiServices"` - // Create or update Internal soap services - SetInternalSoapServices *installBundleSetInternalSoapServicesInternalSoapServicesPayload `json:"setInternalSoapServices"` - // Creates or updates one or more policy backed ldaps - SetPolicyBackedIdps *installBundleSetPolicyBackedIdpsPolicyBackedIdpsPayload `json:"setPolicyBackedIdps"` - // Create or update JMS destinations. - // If JMS destination exists, the JMS destination will be updated. - // If no JMS destination with given name, direction, providerType exist, a new JMS destination will be created. - SetJmsDestinations *installBundleSetJmsDestinationsJmsDestinationsPayload `json:"setJmsDestinations"` - // Create or update existing email listeners. - // Match is carried by name. If match is found, it will be updated. Otherwise, it will be created. - SetEmailListeners *installBundleSetEmailListenersEmailListenersPayload `json:"setEmailListeners"` - // Create or update Listen Ports. - // If Listen Port with the same name exist, the Listen Port will be updated. - // If no Listen Port with the name exist, a new Listen Port will be created. - SetListenPorts *installBundleSetListenPortsListenPortsPayload `json:"setListenPorts"` - // Create or update existing active connector. - // Match is carried by name. If match is found, it will be updated. Otherwise, it will be created. - SetActiveConnectors *installBundleSetActiveConnectorsActiveConnectorsPayload `json:"setActiveConnectors"` - // Creates or updates one or more scheduled tasks - SetScheduledTasks *installBundleSetScheduledTasksScheduledTasksPayload `json:"setScheduledTasks"` - // Create or update Log Sinks. - // If Log Sink with the same name exist, the Log Sink will be updated. - // If no Log Sink with the name exist, a new Log Sink will be created. - SetLogSinks *installBundleSetLogSinksLogSinksPayload `json:"setLogSinks"` - // Create or update existing generic entities. - // Match is carried by name. If match is found, it will be updated. Otherwise, it will be created. - SetGenericEntities *installBundleSetGenericEntitiesGenericEntitiesPayload `json:"setGenericEntities"` - // Update Roles with user/group assignees. - // Note: Creating a role is unsupported. - SetRoles *installBundleSetRolesRolesPayload `json:"setRoles"` - SetAuditConfigurations *installBundleSetAuditConfigurationsAuditConfigurationsPayload `json:"setAuditConfigurations"` - // (Experimental) - // Create/update the Kerberos configurations. - // Automatically generates the Kerberos login config file, "login.config", and - // Kerberos config file, "krb5.conf" (unless the cluster-wide property - // kerberos.krb5Config.overwrite=false and it is set in the mutation). - SetKerberosConfigs *installBundleSetKerberosConfigsKerberosConfigPayload `json:"setKerberosConfigs"` - // Creates or updates one or more keys - SetKeys *installBundleSetKeysKeysPayload `json:"setKeys"` +type deleteSecretsDeleteSecretsSecretsPayload struct { + DetailedStatus []*deleteSecretsDeleteSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` + Secrets []*deleteSecretsDeleteSecretsSecretsPayloadSecretsSecret `json:"secrets"` } -// deleteBundleGenericDeleteBundleEntitiesBundleEntitiesPayload includes the requested fields of the GraphQL type BundleEntitiesPayload. -type deleteBundleGenericDeleteBundleEntitiesBundleEntitiesPayload struct { +// GetDetailedStatus returns deleteSecretsDeleteSecretsSecretsPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *deleteSecretsDeleteSecretsSecretsPayload) GetDetailedStatus() []*deleteSecretsDeleteSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// GetSecrets returns deleteSecretsDeleteSecretsSecretsPayload.Secrets, and is useful for accessing the field via an interface. +func (v *deleteSecretsDeleteSecretsSecretsPayload) GetSecrets() []*deleteSecretsDeleteSecretsSecretsPayloadSecretsSecret { + return v.Secrets +} + +// deleteSecretsDeleteSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type deleteSecretsDeleteSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatus struct { + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` +} + +// GetStatus returns deleteSecretsDeleteSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *deleteSecretsDeleteSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns deleteSecretsDeleteSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *deleteSecretsDeleteSecretsSecretsPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// deleteSecretsDeleteSecretsSecretsPayloadSecretsSecret includes the requested fields of the GraphQL type Secret. +// The GraphQL type's documentation follows. +// +// A secret (password or private key) which is used by gateway policies and other configurations. +// > @l7-entity +// > @l7-identity-fields name +// > @l7-summary-fields goid,name,checksum +// > @l7-excluded-fields +type deleteSecretsDeleteSecretsSecretsPayloadSecretsSecret struct { + // The goid for the Secret + Goid string `json:"goid"` + // Identify the password being stored. You may use letters, numbers, dashes, and underscores. + // Names that contain spaces or periods are valid, but the resulting stored + // password cannot be referenced via context variable. + // Names that contain @ or $ are valid, but the resulting stored password cannot be referenced via context variable. + Name string `json:"name"` +} + +// GetGoid returns deleteSecretsDeleteSecretsSecretsPayloadSecretsSecret.Goid, and is useful for accessing the field via an interface. +func (v *deleteSecretsDeleteSecretsSecretsPayloadSecretsSecret) GetGoid() string { return v.Goid } + +// GetName returns deleteSecretsDeleteSecretsSecretsPayloadSecretsSecret.Name, and is useful for accessing the field via an interface. +func (v *deleteSecretsDeleteSecretsSecretsPayloadSecretsSecret) GetName() string { return v.Name } + +// deleteSecretsResponse is returned by deleteSecrets on success. +type deleteSecretsResponse struct { + // Deletes one or more existing secrets + DeleteSecrets *deleteSecretsDeleteSecretsSecretsPayload `json:"deleteSecrets"` +} + +// GetDeleteSecrets returns deleteSecretsResponse.DeleteSecrets, and is useful for accessing the field via an interface. +func (v *deleteSecretsResponse) GetDeleteSecrets() *deleteSecretsDeleteSecretsSecretsPayload { + return v.DeleteSecrets +} + +// installBundleGenericInstallBundleEntitiesBundleEntitiesPayload includes the requested fields of the GraphQL type BundleEntitiesPayload. +type installBundleGenericInstallBundleEntitiesBundleEntitiesPayload struct { Summary bool `json:"summary"` } -// GetSummary returns deleteBundleGenericDeleteBundleEntitiesBundleEntitiesPayload.Summary, and is useful for accessing the field via an interface. -func (v *deleteBundleGenericDeleteBundleEntitiesBundleEntitiesPayload) GetDeleteSummary() bool { +// GetSummary returns installBundleGenericInstallBundleEntitiesBundleEntitiesPayload.Summary, and is useful for accessing the field via an interface. +func (v *installBundleGenericInstallBundleEntitiesBundleEntitiesPayload) GetSummary() bool { return v.Summary } -// deleteBundleGenericResponse is returned by installBundleGeneric on success. -type deleteBundleGenericResponse struct { +// installBundleGenericResponse is returned by installBundleGeneric on success. +type installBundleGenericResponse struct { // Installs bundle of entities using set-based mutation operations - DeleteBundleEntities *deleteBundleGenericDeleteBundleEntitiesBundleEntitiesPayload `json:"deleteBundleEntities"` + InstallBundleEntities *installBundleGenericInstallBundleEntitiesBundleEntitiesPayload `json:"installBundleEntities"` } // GetInstallBundleEntities returns installBundleGenericResponse.InstallBundleEntities, and is useful for accessing the field via an interface. -func (v *deleteBundleGenericResponse) GetDeleteBundleEntities() *deleteBundleGenericDeleteBundleEntitiesBundleEntitiesPayload { - return v.DeleteBundleEntities +func (v *installBundleGenericResponse) GetInstallBundleEntities() *installBundleGenericInstallBundleEntitiesBundleEntitiesPayload { + return v.InstallBundleEntities } // installBundleResponse is returned by installBundle on success. -type deleteBundleResponse struct { +type installBundleResponse struct { // Sets Server module files. Updating the existing server module file is unsupported. SetServerModuleFiles *installBundleSetServerModuleFilesServerModuleFilesPayload `json:"setServerModuleFiles"` // Create or update existing cluster properties. If a cluster property with the given name does not @@ -4318,6 +9383,165 @@ type deleteBundleResponse struct { SetKeys *installBundleSetKeysKeysPayload `json:"setKeys"` } +// deleteBundleGenericDeleteBundleEntitiesBundleEntitiesPayload includes the requested fields of the GraphQL type BundleEntitiesPayload. +type deleteBundleGenericDeleteBundleEntitiesBundleEntitiesPayload struct { + Summary bool `json:"summary"` +} + +// GetSummary returns deleteBundleGenericDeleteBundleEntitiesBundleEntitiesPayload.Summary, and is useful for accessing the field via an interface. +func (v *deleteBundleGenericDeleteBundleEntitiesBundleEntitiesPayload) GetDeleteSummary() bool { + return v.Summary +} + +// deleteBundleGenericResponse is returned by installBundleGeneric on success. +type deleteBundleGenericResponse struct { + // Installs bundle of entities using set-based mutation operations + DeleteBundleEntities *deleteBundleGenericDeleteBundleEntitiesBundleEntitiesPayload `json:"deleteBundleEntities"` +} + +// GetInstallBundleEntities returns installBundleGenericResponse.InstallBundleEntities, and is useful for accessing the field via an interface. +func (v *deleteBundleGenericResponse) GetDeleteBundleEntities() *deleteBundleGenericDeleteBundleEntitiesBundleEntitiesPayload { + return v.DeleteBundleEntities +} + +// // installBundleResponse is returned by installBundle on success. +// type deleteBundleResponse struct { +// // Sets Server module files. Updating the existing server module file is unsupported. +// SetServerModuleFiles *installBundleSetServerModuleFilesServerModuleFilesPayload `json:"setServerModuleFiles"` +// // Create or update existing cluster properties. If a cluster property with the given name does not +// // exist, one will be created, otherwise the existing one will be updated. This returns the list of +// // entities created and/or updated +// SetClusterProperties *installBundleSetClusterPropertiesClusterPropertiesPayload `json:"setClusterProperties"` +// // Update Service Resolution Configs +// SetServiceResolutionConfigs *installBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoad `json:"setServiceResolutionConfigs"` +// // Set/Update the Password Policies +// SetPasswordPolicies *installBundleSetPasswordPoliciesPasswordPoliciesPayLoad `json:"setPasswordPolicies"` +// // Create or update existing Administrative User Account Minimum cluster properties. +// // If Administrative User Account Minimum cluster property with the given name +// // does not exist, one will be created, otherwise the existing one will be updated. +// // This returns the list of entities created and/or updated. +// // Below are the allowed Administrative User Account Minimum properties +// // logonMaxAllowableAttempts : Logon attempts must be between 1 and 20 +// // logonLockoutTime : Lockout period must be between 1 and 86400 seconds +// // logonSessionExpiry : Expiry period must be between 1 and 86400 seconds +// // logonInactivityPeriod : Inactivity period must be between 1 and 365 days +// SetAdministrativeUserAccountProperties *installBundleSetAdministrativeUserAccountPropertiesAdministrativeUserAccountPropertiesPayload `json:"setAdministrativeUserAccountProperties"` +// // Set the Folders +// SetFolders *installBundleSetFoldersFoldersPayload `json:"setFolders"` +// // Create or update existing revocation check policies. +// // Match is carried by name. If match is found, it will be updated. Otherwise, it will be created. +// SetRevocationCheckPolicies *installBundleSetRevocationCheckPoliciesRevocationCheckPoliciesPayload `json:"setRevocationCheckPolicies"` +// // Create or update trusted certificates. +// // If a certificate with the same sha1 thumbprint already exist, it will be updated. +// SetTrustedCerts *installBundleSetTrustedCertsTrustedCertsPayload `json:"setTrustedCerts"` +// // Creates or updates one or more secrets +// SetSecrets *installBundleSetSecretsSecretsPayload `json:"setSecrets"` +// // Create or update existing http configuration. +// SetHttpConfigurations *installBundleSetHttpConfigurationsHttpConfigurationsPayload `json:"setHttpConfigurations"` +// // Create or update existing custom key values data. If a custom key value with the given key does not +// // exist, one will be created, otherwise the existing one will be updated. This returns the list of +// // entities created and/or updated +// SetCustomKeyValues *installBundleSetCustomKeyValuesCustomKeyValuePayload `json:"setCustomKeyValues"` +// // Create or Update multiple XML schemas +// SetSchemas *installBundleSetSchemasSchemasPayload `json:"setSchemas"` +// // Create or Update multiple DTD resources +// SetDtds *installBundleSetDtdsDtdsPayload `json:"setDtds"` +// // Create or update JDBC connections. +// // If JDBC connection with the same name exist, the JDBC connection will be updated. +// // If no JDBC connection with the name exist, a new JDBC connection will be created. +// SetJdbcConnections *installBundleSetJdbcConnectionsJdbcConnectionsPayload `json:"setJdbcConnections"` +// // Creates or updates one ore more internal IDP configurations +// SetInternalIdps *installBundleSetInternalIdpsInternalIdpsPayload `json:"setInternalIdps"` +// // Creates or updates one or more fips +// SetFederatedIdps *installBundleSetFederatedIdpsFederatedIdpsPayload `json:"setFederatedIdps"` +// // Creates or updates one or more ldaps +// SetLdapIdps *installBundleSetLdapIdpsLdapIdpsPayload `json:"setLdapIdps"` +// // Creates or updates one or more simple ldaps +// SetSimpleLdapIdps *installBundleSetSimpleLdapIdpsSimpleLdapIdpsPayload `json:"setSimpleLdapIdps"` +// // Creates or updates one or more fips +// SetFips *installBundleSetFipsFipsPayload `json:"setFips"` +// // Creates or updates one or more ldaps +// SetLdaps *installBundleSetLdapsLdapsPayload `json:"setLdaps"` +// // Creates or updates one or more fip groups +// SetFederatedGroups *installBundleSetFederatedGroupsFederatedGroupsPayload `json:"setFederatedGroups"` +// // Creates or updates one or more fip groups +// SetFipGroups *installBundleSetFipGroupsFipGroupsPayload `json:"setFipGroups"` +// // Creates or updates one or more internal groups +// SetInternalGroups *installBundleSetInternalGroupsInternalGroupsPayload `json:"setInternalGroups"` +// // Creates or updates one or more fip users. +// // NOTE: Existing user will be found by either login or subjectDn or name. +// SetFederatedUsers *installBundleSetFederatedUsersFederatedUsersPayload `json:"setFederatedUsers"` +// // Creates or updates one or more fip users. +// // NOTE: Existing user will be found by either login or subjectDn or name. +// SetFipUsers *installBundleSetFipUsersFipUsersPayload `json:"setFipUsers"` +// // Creates or updates one or more internal users +// SetInternalUsers *installBundleSetInternalUsersInternalUsersPayload `json:"setInternalUsers"` +// // Create or update Cassandra connections. +// // If Cassandra connection with the same name exist, the Cassandra connection will be updated. +// // If no Cassandra connection with the name exist, a new Cassandra connection will be created. +// SetCassandraConnections *installBundleSetCassandraConnectionsCassandraConnectionsPayload `json:"setCassandraConnections"` +// // Create or update existing siteminder configurations. +// // Match is carried by name. If match is found, it will be updated. Otherwise, it will be created +// SetSMConfigs *installBundleSetSMConfigsSMConfigsPayload `json:"setSMConfigs"` +// // Create or update policies +// SetPolicies *installBundleSetPoliciesL7PoliciesPayload `json:"setPolicies"` +// // Create or update policy fragments +// SetPolicyFragments *installBundleSetPolicyFragmentsPolicyFragmentsPayload `json:"setPolicyFragments"` +// // Create or update Encapsulated Assertion Configurations +// SetEncassConfigs *installBundleSetEncassConfigsEncassConfigsPayload `json:"setEncassConfigs"` +// // Create or update global policies +// SetGlobalPolicies *installBundleSetGlobalPoliciesGlobalPoliciesPayload `json:"setGlobalPolicies"` +// // Creates or updates one or more background task policies +// SetBackgroundTaskPolicies *installBundleSetBackgroundTaskPoliciesBackgroundTaskPoliciesPayload `json:"setBackgroundTaskPolicies"` +// // Create or update services +// SetServices *installBundleSetServicesL7ServicesPayload `json:"setServices"` +// // Create or update web api services +// SetWebApiServices *installBundleSetWebApiServicesWebApiServicesPayload `json:"setWebApiServices"` +// // Create or update soap services +// SetSoapServices *installBundleSetSoapServicesSoapServicesPayload `json:"setSoapServices"` +// // Create or update Internal web api services +// SetInternalWebApiServices *installBundleSetInternalWebApiServicesInternalWebApiServicesPayload `json:"setInternalWebApiServices"` +// // Create or update Internal soap services +// SetInternalSoapServices *installBundleSetInternalSoapServicesInternalSoapServicesPayload `json:"setInternalSoapServices"` +// // Creates or updates one or more policy backed ldaps +// SetPolicyBackedIdps *installBundleSetPolicyBackedIdpsPolicyBackedIdpsPayload `json:"setPolicyBackedIdps"` +// // Create or update JMS destinations. +// // If JMS destination exists, the JMS destination will be updated. +// // If no JMS destination with given name, direction, providerType exist, a new JMS destination will be created. +// SetJmsDestinations *installBundleSetJmsDestinationsJmsDestinationsPayload `json:"setJmsDestinations"` +// // Create or update existing email listeners. +// // Match is carried by name. If match is found, it will be updated. Otherwise, it will be created. +// SetEmailListeners *installBundleSetEmailListenersEmailListenersPayload `json:"setEmailListeners"` +// // Create or update Listen Ports. +// // If Listen Port with the same name exist, the Listen Port will be updated. +// // If no Listen Port with the name exist, a new Listen Port will be created. +// SetListenPorts *installBundleSetListenPortsListenPortsPayload `json:"setListenPorts"` +// // Create or update existing active connector. +// // Match is carried by name. If match is found, it will be updated. Otherwise, it will be created. +// SetActiveConnectors *installBundleSetActiveConnectorsActiveConnectorsPayload `json:"setActiveConnectors"` +// // Creates or updates one or more scheduled tasks +// SetScheduledTasks *installBundleSetScheduledTasksScheduledTasksPayload `json:"setScheduledTasks"` +// // Create or update Log Sinks. +// // If Log Sink with the same name exist, the Log Sink will be updated. +// // If no Log Sink with the name exist, a new Log Sink will be created. +// SetLogSinks *installBundleSetLogSinksLogSinksPayload `json:"setLogSinks"` +// // Create or update existing generic entities. +// // Match is carried by name. If match is found, it will be updated. Otherwise, it will be created. +// SetGenericEntities *installBundleSetGenericEntitiesGenericEntitiesPayload `json:"setGenericEntities"` +// // Update Roles with user/group assignees. +// // Note: Creating a role is unsupported. +// SetRoles *installBundleSetRolesRolesPayload `json:"setRoles"` +// SetAuditConfigurations *installBundleSetAuditConfigurationsAuditConfigurationsPayload `json:"setAuditConfigurations"` +// // (Experimental) +// // Create/update the Kerberos configurations. +// // Automatically generates the Kerberos login config file, "login.config", and +// // Kerberos config file, "krb5.conf" (unless the cluster-wide property +// // kerberos.krb5Config.overwrite=false and it is set in the mutation). +// SetKerberosConfigs *installBundleSetKerberosConfigsKerberosConfigPayload `json:"setKerberosConfigs"` +// // Creates or updates one or more keys +// SetKeys *installBundleSetKeysKeysPayload `json:"setKeys"` +// } + // GetSetServerModuleFiles returns installBundleResponse.SetServerModuleFiles, and is useful for accessing the field via an interface. func (v *installBundleResponse) GetSetServerModuleFiles() *installBundleSetServerModuleFilesServerModuleFilesPayload { return v.SetServerModuleFiles @@ -8078,6 +13302,86 @@ func (v *installBundleSetServerModuleFilesServerModuleFilesPayloadDetailedStatus return v.Value } +// installBundleSetServiceAliasesL7ServiceAliasesPayload includes the requested fields of the GraphQL type L7ServiceAliasesPayload. +type installBundleSetServiceAliasesL7ServiceAliasesPayload struct { + DetailedStatus []*installBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` +} + +// GetDetailedStatus returns installBundleSetServiceAliasesL7ServiceAliasesPayload.DetailedStatus, and is useful for accessing the field via an interface. +func (v *installBundleSetServiceAliasesL7ServiceAliasesPayload) GetDetailedStatus() []*installBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatus { + return v.DetailedStatus +} + +// installBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatus includes the requested fields of the GraphQL type EntityMutationDetailedStatus. +type installBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatus struct { + Action EntityMutationAction `json:"action"` + Status EntityMutationStatus `json:"status"` + Description string `json:"description"` + Source []*installBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty `json:"source"` + Target []*installBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty `json:"target"` +} + +// GetAction returns installBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatus.Action, and is useful for accessing the field via an interface. +func (v *installBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatus) GetAction() EntityMutationAction { + return v.Action +} + +// GetStatus returns installBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatus.Status, and is useful for accessing the field via an interface. +func (v *installBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatus) GetStatus() EntityMutationStatus { + return v.Status +} + +// GetDescription returns installBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatus.Description, and is useful for accessing the field via an interface. +func (v *installBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatus) GetDescription() string { + return v.Description +} + +// GetSource returns installBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatus.Source, and is useful for accessing the field via an interface. +func (v *installBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatus) GetSource() []*installBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty { + return v.Source +} + +// GetTarget returns installBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatus.Target, and is useful for accessing the field via an interface. +func (v *installBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatus) GetTarget() []*installBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty { + return v.Target +} + +// installBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type installBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns installBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *installBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns installBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *installBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatusSourceAnyProperty) GetValue() interface{} { + return v.Value +} + +// installBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty includes the requested fields of the GraphQL type AnyProperty. +type installBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty struct { + // The name of property + Name string `json:"name"` + // The value of the property + Value interface{} `json:"value"` +} + +// GetName returns installBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Name, and is useful for accessing the field via an interface. +func (v *installBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetName() string { + return v.Name +} + +// GetValue returns installBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty.Value, and is useful for accessing the field via an interface. +func (v *installBundleSetServiceAliasesL7ServiceAliasesPayloadDetailedStatusEntityMutationDetailedStatusTargetAnyProperty) GetValue() interface{} { + return v.Value +} + // installBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoad includes the requested fields of the GraphQL type ServiceResolutionConfigsPayLoad. type installBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoad struct { DetailedStatus []*installBundleSetServiceResolutionConfigsServiceResolutionConfigsPayLoadDetailedStatusEntityMutationDetailedStatus `json:"detailedStatus"` @@ -9194,6 +14498,21 @@ mutation installBundle ($activeConnectors: [ActiveConnectorInput!]! = [], $admin } } } + setPolicyAliases(input: $policyAliases) { + detailedStatus { + action + status + description + source { + name + value + } + target { + name + value + } + } + } setServices(input: $services) { detailedStatus { action @@ -9269,6 +14588,51 @@ mutation installBundle ($activeConnectors: [ActiveConnectorInput!]! = [], $admin } } } + setServiceAliases(input: $serviceAliases) { + detailedStatus { + action + status + description + source { + name + value + } + target { + name + value + } + } + } + setSampleMessages(input: $sampleMessages) { + detailedStatus { + action + status + description + source { + name + value + } + target { + name + value + } + } + } + setPolicyBackedServices(input: $policyBackedServices) { + detailedStatus { + action + status + description + source { + name + value + } + target { + name + value + } + } + } setPolicyBackedIdps(input: $policyBackedIdps) { detailedStatus { action @@ -9480,6 +14844,7 @@ func installBundle( internalWebApiServices []*WebApiServiceInput, jdbcConnections []*JdbcConnectionInput, jmsDestinations []*JmsDestinationInput, + kerberosAttrName []*KerberosConfigInput, keys []*KeyInput, ldaps []*LdapInput, roles []*RoleInput, @@ -9504,6 +14869,11 @@ func installBundle( webApiServices []*WebApiServiceInput, genericEntities []*GenericEntityInput, auditConfigurations []*AuditConfigurationInput, + policyBackedServices []*PolicyBackedServiceInput, + policyAliases []*L7PolicyAliasInput, + serviceAliases []*L7ServiceAliasInput, + sampleMessages []*SampleMessageInput, + kerberosConfigs []*KerberosConfigInput, ) (*installBundleResponse, error) { req_ := &graphql.Request{ @@ -9535,6 +14905,7 @@ func installBundle( InternalWebApiServices: internalWebApiServices, JdbcConnections: jdbcConnections, JmsDestinations: jmsDestinations, + KerberosConfigs: kerberosConfigs, Keys: keys, Ldaps: ldaps, Roles: roles, @@ -9559,7 +14930,10 @@ func installBundle( WebApiServices: webApiServices, GenericEntities: genericEntities, AuditConfigurations: auditConfigurations, - KerberosConfigs: kerberosConfigs, + PolicyBackedServices: policyBackedServices, + PolicyAliases: policyAliases, + ServiceAliases: serviceAliases, + SampleMessages: sampleMessages, }, } var err_ error @@ -9575,65 +14949,3 @@ func installBundle( return &data_, err_ } - -// The query or mutation executed by installBundleGeneric. -const installBundleGeneric_Operation = ` -mutation installBundleGeneric { - installBundleEntities { - summary - } -} -` - -func installBundleGeneric( - ctx_ context.Context, - client_ graphql.Client, -) (*installBundleGenericResponse, error) { - req_ := &graphql.Request{ - OpName: "installBundleGeneric", - Query: installBundleGeneric_Operation, - } - var err_ error - - var data_ installBundleGenericResponse - resp_ := &graphql.Response{Data: &data_} - - err_ = client_.MakeRequest( - ctx_, - req_, - resp_, - ) - - return &data_, err_ -} - -// The query or mutation executed by deleteBundleGeneric. -const deleteBundleGeneric_Operation = ` -mutation deleteBundleGeneric { - deleteBundleEntities { - summary - } -} -` - -func deleteBundleGeneric( - ctx_ context.Context, - client_ graphql.Client, -) (*deleteBundleGenericResponse, error) { - req_ := &graphql.Request{ - OpName: "deleteBundleGeneric", - Query: deleteBundleGeneric_Operation, - } - var err_ error - - var data_ deleteBundleGenericResponse - resp_ := &graphql.Response{Data: &data_} - - err_ = client_.MakeRequest( - ctx_, - req_, - resp_, - ) - - return &data_, err_ -} diff --git a/internal/graphman/genqlient.graphql b/internal/graphman/genqlient.graphql index 29e157a4..fc240b04 100644 --- a/internal/graphman/genqlient.graphql +++ b/internal/graphman/genqlient.graphql @@ -65,6 +65,7 @@ mutation installBundle ( $internalWebApiServices: [WebApiServiceInput!]!=[], $jdbcConnections:[JdbcConnectionInput!]!=[], $jmsDestinations:[JmsDestinationInput!]!=[], + $kerberosConfigs:[KerberosConfigInput!]!=[], $keys: [KeyInput!]!=[], $ldaps:[LdapInput!]!=[], $roles: [RoleInput!]!=[], @@ -87,15 +88,19 @@ mutation installBundle ( $soapServices:[SoapServiceInput!]!=[], $trustedCerts:[TrustedCertInput!]!=[], $webApiServices: [WebApiServiceInput!]!=[], - $genericEntities: [GenericEntityInput!]!=[] - $auditConfigurations: [AuditConfigurationInput!]!=[] - $kerberosConfigs:[KerberosConfigInput!]!=[] + $genericEntities: [GenericEntityInput!]!=[], + $auditConfigurations: [AuditConfigurationInput!]!=[], + $policyBackedServices: [PolicyBackedServiceInput!]!=[], + $policyAliases: [L7PolicyAliasInput!]!=[], + $serviceAliases: [L7ServiceAliasInput!]!=[], + $sampleMessages: [SampleMessageInput!]!=[] ) { setServerModuleFiles(input: $serverModuleFiles){detailedStatus {action status description source {name value} target {name value}}} setClusterProperties (input: $clusterProperties){detailedStatus {action status description source {name value} target {name value}}} setServiceResolutionConfigs (input: $serviceResolutionConfigs){detailedStatus {action status description source {name value} target {name value}}} setPasswordPolicies (input: $passwordPolicies){detailedStatus {action status description source {name value} target {name value}}} setAdministrativeUserAccountProperties (input: $administrativeUserAccountProperties){detailedStatus {action status description source {name value} target {name value}}} + setFolders(input: $folders){detailedStatus {action status description source {name value} target {name value}}} setRevocationCheckPolicies (input: $revocationCheckPolicies){detailedStatus {action status description source {name value} target {name value}}} setTrustedCerts (input: $trustedCerts){detailedStatus {action status description source {name value} target {name value}}} @@ -109,6 +114,7 @@ mutation installBundle ( setFederatedIdps (input: $federatedIdps){detailedStatus {action status description source {name value} target {name value}}} setLdapIdps (input: $ldapIdps){detailedStatus {action status description source {name value} target {name value}}} setSimpleLdapIdps (input: $simpleLdapIdps){detailedStatus {action status description source {name value} target {name value}}} + setFips (input: $fips){detailedStatus {action status description source {name value} target {name value}}} setLdaps (input: $ldaps){detailedStatus {action status description source {name value} target {name value}}} setFederatedGroups (input: $federatedGroups){detailedStatus {action status description source {name value} target {name value}}} @@ -119,18 +125,25 @@ mutation installBundle ( setInternalUsers (input: $internalUsers){detailedStatus {action status description source {name value} target {name value}}} setCassandraConnections (input: $cassandraConnections){detailedStatus {action status description source {name value} target {name value}}} setSMConfigs (input: $smConfigs){detailedStatus {action status description source {name value} target {name value}}} + setPolicies (input: $policies){detailedStatus {action status description source {name value} target {name value}}} setPolicyFragments (input: $policyFragments){detailedStatus {action status description source {name value} target {name value}}} setEncassConfigs (input: $encassConfigs){detailedStatus {action status description source {name value} target {name value}}} setGlobalPolicies (input: $globalPolicies){detailedStatus {action status description source {name value} target {name value}}} setBackgroundTaskPolicies (input: $backgroundTaskPolicies){detailedStatus {action status description source {name value} target {name value}}} + setPolicyAliases (input: $policyAliases){detailedStatus {action status description source {name value} target {name value}}} setServices(input: $services){detailedStatus {action status description source {name value} target {name value}}} setWebApiServices (input: $webApiServices){detailedStatus {action status description source {name value} target {name value}}} setSoapServices (input: $soapServices){detailedStatus {action status description source {name value} target {name value}}} setInternalWebApiServices (input: $internalWebApiServices){detailedStatus {action status description source {name value} target {name value}}} setInternalSoapServices (input: $internalSoapServices){detailedStatus {action status description source {name value} target {name value}}} + setServiceAliases (input: $serviceAliases){detailedStatus {action status description source {name value} target {name value}}} + setSampleMessages (input: $sampleMessages){detailedStatus {action status description source {name value} target {name value}}} + + setPolicyBackedServices(input: $policyBackedServices){detailedStatus {action status description source {name value} target {name value}}} setPolicyBackedIdps (input: $policyBackedIdps){detailedStatus {action status description source {name value} target {name value}}} setJmsDestinations (input: $jmsDestinations){detailedStatus {action status description source {name value} target {name value}}} + setKerberosConfigs (input: $kerberosConfigs){detailedStatus {action status description source {name value} target {name value}}} setEmailListeners (input: $emailListeners){detailedStatus {action status description source {name value} target {name value}}} setListenPorts (input: $listenPorts){detailedStatus {action status description source {name value} target {name value}}} setActiveConnectors (input: $activeConnectors){detailedStatus {action status description source {name value} target {name value}}} @@ -139,7 +152,126 @@ mutation installBundle ( setGenericEntities(input: $genericEntities){detailedStatus {action status description source {name value} target {name value}}} setRoles (input: $roles) {detailedStatus {action status description source {name value} target {name value}}} setAuditConfigurations(input: $auditConfigurations){detailedStatus {action status description source {name value} target {name value}}} - setKerberosConfigs(input: $kerberosConfigs){detailedStatus {action status description source {name value} target {name value}}} + + # Keys must be mutated at the end + setKeys (input: $keys) {detailedStatus {action status description source {name value} target {name value}}} +} + + +mutation deleteBundle ( + $activeConnectors: [ActiveConnectorInput!]!=[], + $administrativeUserAccountProperties: [AdministrativeUserAccountPropertyInput!]!=[], + $backgroundTaskPolicies:[BackgroundTaskPolicyInput!]!=[], + $cassandraConnections:[CassandraConnectionInput!]!=[], + $clusterProperties: [ClusterPropertyInput!]!=[], + $dtds:[DtdInput!]!=[], + $emailListeners: [EmailListenerInput!]!=[], + $encassConfigs:[EncassConfigInput!]!=[], + $fipGroups:[FipGroupInput!]!=[], + $fipUsers:[FipUserInput!]!=[], + $fips:[FipInput!]!=[], + $federatedGroups:[FederatedGroupInput!]!=[], + $federatedUsers:[FederatedUserInput!]!=[], + $internalIdps:[InternalIdpInput!]=[], + $federatedIdps:[FederatedIdpInput!]!=[], + $ldapIdps:[LdapIdpInput!]=[], + $simpleLdapIdps:[SimpleLdapIdpInput!]=[], + $policyBackedIdps:[PolicyBackedIdpInput!]=[], + $globalPolicies:[GlobalPolicyInput!]!=[], + $internalGroups:[InternalGroupInput!]!=[], + $internalSoapServices:[SoapServiceInput!]!=[], + $internalUsers:[InternalUserInput!]!=[], + $internalWebApiServices: [WebApiServiceInput!]!=[], + $jdbcConnections:[JdbcConnectionInput!]!=[], + $jmsDestinations:[JmsDestinationInput!]!=[], + $kerberosConfigs:[KerberosConfigInput!]!=[], + $keys: [KeyInput!]!=[], + $ldaps:[LdapInput!]!=[], + $roles: [RoleInput!]!=[], + $listenPorts: [ListenPortInput!]!=[], + $passwordPolicies:[PasswordPolicyInput!]!=[], + $policies: [L7PolicyInput!]!=[], + $policyFragments: [PolicyFragmentInput!]!=[], + $revocationCheckPolicies:[RevocationCheckPolicyInput!]!=[], + $logSinks: [LogSinkInput!]!=[], + $scheduledTasks:[ScheduledTaskInput!]!=[], + $schemas:[SchemaInput!]!=[], + $httpConfigurations:[HttpConfigurationInput!]!=[], + $customKeyValues: [CustomKeyValueInput!]!=[], + $secrets: [SecretInput!]!=[], + $serverModuleFiles:[ServerModuleFileInput!]!=[], + $serviceResolutionConfigs:[ServiceResolutionConfigInput!]!=[], + $folders: [FolderInput!]!=[], + $smConfigs: [SMConfigInput!]!=[], + $services: [L7ServiceInput!]!=[], + $soapServices:[SoapServiceInput!]!=[], + $trustedCerts:[TrustedCertInput!]!=[], + $webApiServices: [WebApiServiceInput!]!=[], + $genericEntities: [GenericEntityInput!]!=[], + $auditConfigurations: [AuditConfigurationInput!]!=[], + $policyBackedServices: [PolicyBackedServiceInput!]!=[], + $policyAliases: [L7PolicyAliasInput!]!=[], + $serviceAliases: [L7ServiceAliasInput!]!=[], + $sampleMessages: [SampleMessageInput!]!=[] + ) { + setAuditConfigurations(input: $auditConfigurations){detailedStatus {action status description source {name value} target {name value}}} + setRoles (input: $roles) {detailedStatus {action status description source {name value} target {name value}}} + setLogSinks(input: $logSinks){detailedStatus {action status description source {name value} target {name value}}} + setScheduledTasks (input: $scheduledTasks){detailedStatus {action status description source {name value} target {name value}}} + setActiveConnectors (input: $activeConnectors){detailedStatus {action status description source {name value} target {name value}}} + setListenPorts (input: $listenPorts){detailedStatus {action status description source {name value} target {name value}}} + setEmailListeners (input: $emailListeners){detailedStatus {action status description source {name value} target {name value}}} + setKerberosConfigs (input: $kerberosConfigs){detailedStatus {action status description source {name value} target {name value}}} + setJmsDestinations (input: $jmsDestinations){detailedStatus {action status description source {name value} target {name value}}} + setPolicyBackedIdps (input: $policyBackedIdps){detailedStatus {action status description source {name value} target {name value}}} + setGenericEntities (input: $genericEntities){detailedStatus {action status description source {name value} target {name value}}} + setPolicyBackedServices(input: $policyBackedServices){detailedStatus {action status description source {name value} target {name value}}} + + setSampleMessages (input: $sampleMessages){detailedStatus {action status description source {name value} target {name value}}} + setServiceAliases (input: $serviceAliases){detailedStatus {action status description source {name value} target {name value}}} + setServices(input: $services){detailedStatus {action status description source {name value} target {name value}}} + setInternalSoapServices (input: $internalSoapServices){detailedStatus {action status description source {name value} target {name value}}} + setInternalWebApiServices (input: $internalWebApiServices){detailedStatus {action status description source {name value} target {name value}}} + setSoapServices (input: $soapServices){detailedStatus {action status description source {name value} target {name value}}} + setWebApiServices (input: $webApiServices){detailedStatus {action status description source {name value} target {name value}}} + setEncassConfigs (input: $encassConfigs){detailedStatus {action status description source {name value} target {name value}}} + setPolicyAliases (input: $policyAliases){detailedStatus {action status description source {name value} target {name value}}} + setPolicies (input: $policies){detailedStatus {action status description source {name value} target {name value}}} + setBackgroundTaskPolicies (input: $backgroundTaskPolicies){detailedStatus {action status description source {name value} target {name value}}} + setGlobalPolicies (input: $globalPolicies){detailedStatus {action status description source {name value} target {name value}}} + setPolicyFragments (input: $policyFragments){detailedStatus {action status description source {name value} target {name value}}} + setSMConfigs (input: $smConfigs){detailedStatus {action status description source {name value} target {name value}}} + + setCassandraConnections (input: $cassandraConnections){detailedStatus {action status description source {name value} target {name value}}} + setInternalUsers (input: $internalUsers){detailedStatus {action status description source {name value} target {name value}}} + setFederatedUsers (input: $federatedUsers){detailedStatus {action status description source {name value} target {name value}}} + setFipUsers (input: $fipUsers){detailedStatus {action status description source {name value} target {name value}}} + setInternalGroups (input: $internalGroups){detailedStatus {action status description source {name value} target {name value}}} + setFederatedGroups (input: $federatedGroups){detailedStatus {action status description source {name value} target {name value}}} + setFipGroups (input: $fipGroups){detailedStatus {action status description source {name value} target {name value}}} + + setSimpleLdapIdps (input: $simpleLdapIdps){detailedStatus {action status description source {name value} target {name value}}} + setLdapIdps (input: $ldapIdps){detailedStatus {action status description source {name value} target {name value}}} + setFederatedIdps (input: $federatedIdps){detailedStatus {action status description source {name value} target {name value}}} + setInternalIdps (input: $internalIdps){detailedStatus {action status description source {name value} target {name value}}} + setLdaps (input: $ldaps){detailedStatus {action status description source {name value} target {name value}}} + setFips (input: $fips){detailedStatus {action status description source {name value} target {name value}}} + setJdbcConnections (input: $jdbcConnections){detailedStatus {action status description source {name value} target {name value}}} + setDtds (input: $dtds){detailedStatus {action status description source {name value} target {name value}}} + setSchemas (input: $schemas){detailedStatus {action status description source {name value} target {name value}}} + setCustomKeyValues(input: $customKeyValues){detailedStatus {action status description source {name value} target {name value}}} + setHttpConfigurations(input: $httpConfigurations){detailedStatus {action status description source {name value} target {name value}}} + setSecrets (input: $secrets){detailedStatus {action status description source {name value} target {name value}}} + setTrustedCerts (input: $trustedCerts){detailedStatus {action status description source {name value} target {name value}}} + setRevocationCheckPolicies (input: $revocationCheckPolicies){detailedStatus {action status description source {name value} target {name value}}} + setFolders(input: $folders){detailedStatus {action status description source {name value} target {name value}}} + + setAdministrativeUserAccountProperties (input: $administrativeUserAccountProperties){detailedStatus {action status description source {name value} target {name value}}} + setPasswordPolicies (input: $passwordPolicies){detailedStatus {action status description source {name value} target {name value}}} + setServiceResolutionConfigs (input: $serviceResolutionConfigs){detailedStatus {action status description source {name value} target {name value}}} + setClusterProperties (input: $clusterProperties){detailedStatus {action status description source {name value} target {name value}}} + setServerModuleFiles(input: $serverModuleFiles){detailedStatus {action status description source {name value} target {name value}}} + # Keys must be mutated at the end setKeys (input: $keys) {detailedStatus {action status description source {name value} target {name value}}} } \ No newline at end of file diff --git a/internal/graphman/schema.graphql b/internal/graphman/schema.graphql index 9be51251..f8fb09e7 100644 --- a/internal/graphman/schema.graphql +++ b/internal/graphman/schema.graphql @@ -10,6 +10,9 @@ An active connector retrieves messages from external systems, perhaps by polling > @l7-identity-fields name > @l7-summary-fields goid,name,connectorType,checksum > @l7-excluded-fields hardwiredService +> @l7-name-fields name +> @l7-display-summary-fields name,connectorType,enabled +> @l7-foreign-fields hardwiredServiceName|name|L7Service """ type ActiveConnector { """The goid for the active connector""" @@ -92,7 +95,8 @@ Supported properties are logonMaxAllowableAttempts, logonLockoutTime, logonSessi > @l7-entity > @l7-identity-fields name > @l7-summary-fields goid,name,checksum -> @l7-excluded-fields +> @l7-name-fields name +> @l7-display-summary-fields name,value """ type AdministrativeUserAccountProperty { """The administrative user account property unique identifier""" @@ -138,12 +142,162 @@ type AnyProperty { value: AnyObject } +enum AssertionCategory { + ACCESS_CONTROL + TRANSPORT_LAYER_SECURITY + XML_SECURITY + MESSAGE_VALIDATION_TRANSFORMATION + MESSAGE_ROUTING + SERVICE_AVAILABILITY + LOGGING_AUDITING_ALERTS + POLICY_LOGIC + THREAT_PROTECTION + INTERNAL_ASSERTIONS + CUSTOM_ASSERTIONS +} + +type AssertionDisplayNameFormat { + format: String! + condition: String! + children: [AssertionDisplayNameSubFormat!]! +} + +type AssertionDisplayNameSubFormat { + format: String! + condition: String! +} + +"""Assertion metadata.""" +type AssertionMetadata { + name: String! + configName: String! + className: String + assertionType: AssertionType! + checksum: String! + description: String + displayNameFormats: [AssertionDisplayNameFormat!]! + categories: [AssertionCategory!]! + composite: Boolean! + annotations: [String!]! + routing: Boolean! + needsInitializedRequest: Boolean! + initializesRequest: Boolean! + needsInitializedResponse: Boolean! + initializesResponse: Boolean! + messageTargetable: Boolean! + messageTargetSubjectedToChange: Boolean! + securityHeaderAddressable: Boolean! + identityTagable: Boolean! + identityTargetable: Boolean! + requestIdentityTargetable: Boolean! + privateKeyable: Boolean! + saml: Boolean! + xml: Boolean! + soap: Boolean! + wss: Boolean! + + """Array of configuration schemas""" + configSchemas: [JSON!]! + + """Array of configuration schema patches""" + configSchemaPatches: [JsonResourcePatch!]! + + """Array of configuration data patches""" + configDataPatches: [JsonResourcePatch!]! + + """Array of JSON Form schemas""" + uiSchemas: [JSON!]! + + """i18n Resources""" + i18nResources: [I18NResource!]! + + """Metadata about referenced entities""" + refEntities: [AssertionRefEntity!]! + + """Metadata about referenced variables""" + refVariables: [AssertionRefVariable!]! + + """Assertion prototype""" + prototype: JSON +} + +type AssertionRefEntity { + fieldPath: String! + secondaryFieldPath: String + refType: AssertionRefEntityType! + entityType: String! +} + +enum AssertionRefEntityType { + GOID + GUID + NAME +} + +type AssertionRefVariable { + fieldPath: String! + secondaryFieldPath: String + + """The prefix of the variable""" + prefix: String + + """The suffix of the variable""" + suffix: String + refType: AssertionRefVariableType! + + """ + Variable Data type + Supported data types are string, int, dateTime, message, boolean, xml, cert, decimal, float, binary, blob, clob, other." + """ + dataType: String! + + """ + True if this variable is really a prefixed meta-variable, Ex: 'request.http.header.host' + """ + prefixed: Boolean! + + """True if this variable returns multiple values, false otherwise.""" + multivalued: Boolean! + + """True if this variable is settable, false otherwise.""" + settable: Boolean! + + """ + Decoration flags + Ist bit - show it as single variable expression + 2nd bit - store it as single variable expression + """ + decorationFlags: Int! + + """condition""" + condition: String +} + +enum AssertionRefVariableType { + IN + OUT + BOTH +} + +enum AssertionType { + CORE + MODULAR + CUSTOM + ENCAPSULATED + + """CORE or MODULAR""" + NATIVE +} + """ An Audit Configuration. > @l7-entity > @l7-identity-fields name > @l7-summary-fields goid,name,checksum -> @l7-excluded-fields +> @l7-name-fields name +> @l7-display-summary-fields name, +> @l7-encrypted-fields ftpConfig.password +> @l7-foreign-fields lookupPolicyName|name|L7Policy,sinkPolicyName|name|L7Policy """ type AuditConfiguration { """The internal entity unique identifier""" @@ -197,6 +351,10 @@ type AuditConfigurationsPayload implements EntityMutationsPayload { auditConfigurations: [AuditConfiguration]! } +""" +Audit FTP Configuration +> @l7-encrypted-fields password +""" type AuditFtpConfiguration { """Host of FTP Server""" host: String! @@ -262,6 +420,36 @@ enum AuditFtpSecurityType { FTPS_IMPLICIT } +"""IDP User Reference""" +type AuthenticatedUser { + """The name of user""" + name: String + + """The first name of user""" + firstName: String + + """The last name of user""" + lastName: String + + """The email of user""" + email: String + + """The login identity of user""" + login: String + + """The DN of user""" + subjectDn: String + + """The name of identity provider that the user belongs to""" + providerName: String! + + """The type of identity provider that the user belongs to""" + providerType: IdpType! + + """The roles assigned for this user""" + roles: [Role] +} + type BackgroundTaskPoliciesPayload implements EntityMutationsPayload { status: [EntityMutationStatus!]! detailedStatus: [EntityMutationDetailedStatus!]! @@ -291,6 +479,8 @@ type BackgroundTaskPolicy { """The folder path of the background task policy""" folderPath: String! + + """Is soap""" soap: Boolean """The background task policy""" @@ -409,6 +599,9 @@ A Cassandra connection. > @l7-identity-fields name > @l7-summary-fields goid,name,checksum > @l7-excluded-fields +> @l7-name-fields name +> @l7-display-summary-fields name,contactPoints,keyspace,port,enabled +> @l7-foreign-fields securePasswordName|name|Secret """ type CassandraConnection { """The goid for the Cassandra Connection""" @@ -508,6 +701,10 @@ A trusted certificate in the gateway truststore. > @l7-identity-fields thumbprintSha1 > @l7-summary-fields goid,name,subjectDn,thumbprintSha1,checksum > @l7-excluded-fields revocationCheckPolicy +> @l7-name-fields name,subjectDn +> @l7-display-summary-fields name,notAfter,thumbprintSha1,trustedFor,subjectDn +> @l7-foreign-fields revocationCheckPolicyName|name|RevocationCheckPolicy +> @l7-alternative-fields """ type Certificate implements TrustedCertRef { """The goid for this certificate""" @@ -587,10 +784,13 @@ enum CertValidationType { } type ClusterInfo { - """cluster Name""" + """Name of the cluster""" name: String - """cluster Nodes Info""" + """checksum""" + checksum: String + + """Cluster nodes""" nodes: [ClusterNodeInfo!]! } @@ -606,6 +806,46 @@ type ClusterNodeInfo { """cluster node uptime""" uptime: Long! + + """cluster node boot time""" + bootTime: DateTime! + + """cluster node lastUpdatedTime""" + lastUpdatedTime: DateTime! + + """cluster node status""" + nodeStatus: String + + """checksum""" + checksum: String + operatingSystem: OSInfo + + """JVM Info""" + jvm: JVMInfo + + """java command line arguments""" + jvmArguments: [EntityProperty!] + + """Product name""" + productName: String + + """Product Version""" + productVersion: ProductVersion + + """license information""" + licenses: [LicenseInfo] + + """Patches Info""" + patches: [PatchInfo] + + """Configured System Properties""" + systemProperties: [EntityProperty!] + + """Configured Telemetry Properties""" + telemetryProperties: [EntityProperty!] + + """Configured Node Properties""" + nodeProperties: [EntityProperty!] } type ClusterPropertiesPayload implements EntityMutationsPayload { @@ -620,6 +860,8 @@ Cluster properties are used to set global properties. > @l7-identity-fields name > @l7-summary-fields goid,name,checksum > @l7-excluded-fields +> @l7-name-fields name +> @l7-display-summary-fields name,value """ type ClusterProperty { """The goid for the cluster property""" @@ -717,6 +959,7 @@ A custom key value pair. > @l7-identity-fields key > @l7-summary-fields goid,key,checksum > @l7-excluded-fields +> @l7-name-fields key """ type CustomKeyValue { """The goid for the custom key value""" @@ -802,7 +1045,8 @@ A Document Type Definition (DTD) which can be referred to in policy. > @l7-entity > @l7-identity-fields systemId > @l7-summary-fields goid,systemId,checksum -> @l7-excluded-fields +> @l7-display-summary-fields systemId,publicId +> @l7-name-fields systemId """ type Dtd { """Internal goid for this DTD""" @@ -880,6 +1124,10 @@ An email listener. > @l7-identity-fields name > @l7-summary-fields goid,name,checksum > @l7-excluded-fields hardwiredService +> @l7-name-fields name +> @l7-display-summary-fields name,serverType,enabled +> @l7-encrypted-fields password +> @l7-foreign-fields hardwiredServiceName|name|L7Service """ type EmailListener { """The goid for the email listener Connection""" @@ -1064,7 +1312,9 @@ An encapsulated assertion configuration. > @l7-entity > @l7-identity-fields name > @l7-summary-fields goid,guid,name,checksum -> @l7-excluded-fields +> @l7-name-fields name +> @l7-display-summary-fields name,policyName +> @l7-foreign-fields policyName|name|L7Policy """ type EncassConfig { """The goid for this encass config""" @@ -1078,6 +1328,8 @@ type EncassConfig { """The configuration checksum of this encass""" checksum: String! + + """The description of the encass config""" description: String """The policy it points to and its dependencies""" @@ -1088,6 +1340,8 @@ type EncassConfig { """the output descriptions""" encassResults: [EncassResult!] + + """Encass properties""" properties: [EntityProperty!] } @@ -1149,12 +1403,99 @@ input EncassResultInput { type: DataType! } +type EntityFieldMetadata { + name: String! + graphQLType: String! + alternativeFields: [String!]! + foreignField: ForeignEntityFieldMetadata +} + enum EntityFieldOption { DEFAULT NONE CUSTOM } +""" +Input for filtering criteria. +NOTE: Only one of the criteria needs to be specified at a time. +""" +input EntityFilterConditionInput { + """Equals""" + eq: String + + """Matches by Regular Expression""" + regex: String + + """Greater Than""" + gt: Long + + """Less Than""" + lt: Long + + """Greater Than or Equals To""" + gte: Long + + """Less Than or Equals To""" + lte: Long + + """Has (i.e., list has the item)""" + has: String + + """In (i.e., item in the list)""" + in: [String!] + + """Extended Equals (Object-level)""" + xeq: JSON + + """Extended Has (Object-level)""" + xhas: JSON + + """Extended In (Object-level)""" + xin: [JSON!] +} + +""" +Input for filtering the entities. +NOTE: Supported composite filters are $and, $or, $not. +NOTE: When children are specified, field is expected to be one of the supported composite identifier. +""" +input EntityFilterInput { + field: String! + condition: EntityFilterConditionInput + children: [EntityFilterInput!] +} + +"""Entity metadata.""" +type EntityMetadata { + name: String! + singularName: String! + pluralName: String! + checksum: String! + deprecated: Boolean! + mutationOrder: Int! + fields: [EntityFieldMetadata!]! + subFields: [EntitySubFieldMetadata!]! + subEntities: [SubEntityMetadata!]! + nameFields: [String!]! + identityFields: [String!]! + summaryFields: [String!]! + excludedFields: [String!]! + displaySummaryFields: [String!]! + encryptedFields: [String!]! + foreignFields: [String!]! + alternativeFields: [String!]! + + """Array of configuration schemas""" + configSchemas: [JSON!]! + + """Array of JSON Form schemas""" + uiSchemas: [JSON!]! + + """i18n Resources""" + i18nResources: [I18NResource!]! +} + enum EntityMutationAction { NEW_OR_UPDATE NEW_OR_EXISTING @@ -1210,6 +1551,12 @@ input EntityPropertyPartialInput { value: String } +type EntitySubFieldMetadata { + name: String! + graphQLType: String! + entitySubType: String! +} + """ A group defined in a federated identity provider. > @l7-entity @@ -1218,7 +1565,10 @@ A group defined in a federated identity provider. > @l7-excluded-fields members """ type FederatedGroup { + """The goid of the federated group""" goid: ID! + + """The name of the federated group""" name: String! """ The name of the FiP this group is defined in """ @@ -1228,6 +1578,8 @@ type FederatedGroup { A checksum of the name, description and member names properties of the group """ checksum: String! + + """The description of the federated group""" description: String """ Federated users that member of this group """ @@ -1277,14 +1629,27 @@ A federated identity provider. > @l7-entity > @l7-identity-fields name > @l7-summary-fields goid,name,checksum -> @l7-excluded-fields +> @l7-name-fields name +> @l7-display-summary-fields name,supportsSAML,supportsX509 +> @l7-foreign-fields trustedCerts.thumbprintSha1|thumbprintSha1|Certificate """ type FederatedIdp { + """The goid of the federated identity provider""" goid: ID! + + """The name of the FIP""" name: String! + + """A checksum of properties""" checksum: String! + + """Supports SAML credential""" supportsSAML: Boolean! + + """Supports X509 credential""" supportsX509: Boolean! + + """Certificate validation""" certValidation: CertValidationType! """ The certificates in the trusted certificate table that establish the trust for this FIP @@ -1331,23 +1696,41 @@ A user defined in a federated identity provider.. > @l7-included-fields memberOf.providerName,memberOf.name """ type FederatedUser { + """The goid of the federated user""" goid: ID! + + """The name of the federated user""" name: String! + + """The login of the federated user""" login: String """ The name of the FiP this user is defined as part of """ providerName: String! + + """A checksum of properties""" checksum: String! + + """The subjectDn""" subjectDn: String """ A client-side certificate associated with this user to use for pki type authentication """ certBase64: String + + """The first name of the federated user""" firstName: String + + """The last name of the federated user""" lastName: String + + """The email of the federated user""" email: String + """The description of the federated user""" + description: String + """Whether to replace existing group memberships or not""" replaceGroupMemberships: Boolean @@ -1383,6 +1766,9 @@ input FederatedUserInput { firstName: String lastName: String email: String + + """The description of the federated user""" + description: String checksum: String } @@ -1420,11 +1806,22 @@ A federated identity provider. > @l7-deprecated Use 'FederatedIdp' instead. """ type Fip { + """The goid of the federated identity provider""" goid: ID! + + """The name of the FIP""" name: String! + + """A checksum of properties""" checksum: String! + + """Enable SAML credential""" enableCredentialTypeSaml: Boolean! + + """Enable X509 credential""" enableCredentialTypeX509: Boolean! + + """Certificate validation""" certificateValidation: CertificateValidationType """ The certificates in the trusted certificate table that establish the trust for this FIP @@ -1508,7 +1905,10 @@ A group defined in a federated identity provider. > @l7-deprecated Use 'FederatedGroup' instead. """ type FipGroup { + """The goid of the group""" goid: ID! + + """The name of the group""" name: String! """ The name of the FiP this group is defined in """ @@ -1518,6 +1918,8 @@ type FipGroup { A checksum of the name, description and member names properties of the group """ checksum: String! + + """The description of the group""" description: String """ Fip users that member of this group """ @@ -1604,21 +2006,36 @@ A user defined in a federated identity provider.. > @l7-deprecated Use 'FederatedUser' instead. """ type FipUser { + """The goid of the user""" goid: ID! + + """The name of the user""" name: String! + + """The login of the user""" login: String """ The name of the FiP this user is defined as part of """ providerName: String! + + """A checksum of properties""" checksum: String! + + """The subjectDn""" subjectDn: String """ A client-side certificate associated with this user to use for pki type authentication """ certBase64: String + + """The first name of the uer""" firstName: String + + """The last name of the uer""" lastName: String + + """The email of the uer""" email: String """ The list of Fip groups this user belongs to """ @@ -1688,7 +2105,8 @@ A folder that is used to group services, policies, and other folders. > @l7-entity > @l7-identity-fields path > @l7-summary-fields goid,name,path,checksum -> @l7-excluded-fields +> @l7-name-fields path +> @l7-display-summary-fields name,path """ type Folder { """The goid for the folder""" @@ -1729,6 +2147,28 @@ input FolderMappingInstructionInput { source: FolderRefInput } +input FolderPartialInput { + """The goid for the folder""" + goid: ID + + """The folder name""" + name: String + + """The folder Path""" + path: String + + """The configuration checksum of this folder""" + checksum: String +} + +type FolderPayload implements EntityMutationPayload { + status: EntityMutationStatus! + detailedStatus: EntityMutationDetailedStatus! + + """The created/updated Folder.""" + folder: Folder +} + input FolderRefInput { """The folder Path""" path: String! @@ -1740,6 +2180,11 @@ type FoldersPayload { folders: [Folder]! } +type ForeignEntityFieldMetadata { + name: String! + entityType: String! +} + type GenericEntitiesPayload implements EntityMutationsPayload { status: [EntityMutationStatus!]! detailedStatus: [EntityMutationDetailedStatus!]! @@ -1753,9 +2198,11 @@ Generic entity details. > @l7-entity > @l7-identity-fields name > @l7-summary-fields goid,name,checksum -> @l7-excluded-fields +> @l7-name-fields name +> @l7-display-summary-fields name,entityClassName,enabled """ type GenericEntity { + """The goid of the entity""" goid: ID! """ unique name""" @@ -1764,7 +2211,7 @@ type GenericEntity { """The configuration checksum""" checksum: String! - """description""" + """The description of the entity""" description: String """Whether this Generic entity is enabled""" @@ -1775,6 +2222,9 @@ type GenericEntity { """XML representation of underlying entity details""" valueXml: String + + """Json representation of underlying entity details""" + valueJson: String } input GenericEntityInput { @@ -1930,6 +2380,9 @@ input GroupMappingInput { """IDP Group Reference""" type GroupRef { + """The goid of group""" + goid: ID + """The name of group""" name: String @@ -1941,16 +2394,25 @@ type GroupRef { """The type of identity provider that the group belongs to""" providerType: IdpType! + + """The description of the Group""" + description: String } """IDP Group Reference input""" input GroupRefInput { + """The goid of user""" + goid: ID + """The name of group""" name: String """The subjectDn of group""" subjectDn: String + """The description of group""" + description: String + """The name of identity provider that the group belongs to""" providerName: String! @@ -1964,7 +2426,7 @@ type GroupRefPayload implements EntityMutationPayload { group: GroupRef } -union HardwiredService = SoapService | WebApiService | L7Service +union HardwiredService = L7Service enum HashAlgorithm { """SHA1 hash algorithm""" @@ -1985,7 +2447,9 @@ An HTTP configuration. > @l7-entity > @l7-identity-fields host,port,protocol,path > @l7-summary-fields goid,host,port,protocol,path,checksum -> @l7-excluded-fields +> @l7-name-fields host +> @l7-display-summary-fields host,port,protocol,path +> @l7-foreign-fields securePasswordName|name|Secret,proxyConfiguration.securePasswordName|name|Secret """ type HttpConfiguration { """The goid for the http configuration""" @@ -2175,6 +2639,10 @@ enum HttpMethod { OTHER } +""" +HTTP Proxy Configuration +> @l7-foreign-fields securePasswordName|name|Secret +""" type HttpProxyConfiguration { """The proxyHost of the http proxy configuration""" host: String @@ -2209,6 +2677,12 @@ enum HttpScheme { ANY } +type I18NResource { + id: String! + locale: String! + content: JSON! +} + """ Indicate how to search for group or user. Provide either a name pattern, a subject dn and or a goid. """ input IdpFilter { @@ -2227,6 +2701,31 @@ input IdpFilter { goid: ID } +""" +A IDP reference. +> @l7-entity +> @l7-identity-fields name +> @l7-summary-fields goid,name,providerType,checksum +> @l7-display-summary-fields name,providerType +> @l7-name-fields name +""" +type IdpRef { + """The goid of identity provider""" + goid: ID! + + """The name of identity provider""" + name: String! + + """The type of identity provider""" + providerType: IdpType! + + """The configuration checksum""" + checksum: String + + """Whether identity provider is used for administration""" + adminEnabled: Boolean! +} + enum IdpType { INTERNAL FEDERATED @@ -2243,13 +2742,18 @@ A group of users defined in the internal identity provider. > @l7-excluded-fields members """ type InternalGroup { + """The goid of the Internal Group""" goid: ID! + + """The name of the Internal Group""" name: String! """ A checksum of the name, description and member names properties of the group """ checksum: String! + + """The description of the Internal Group""" description: String """ The list of internal users that are part of this group """ @@ -2280,12 +2784,20 @@ An internal identity provider. > @l7-entity > @l7-identity-fields name > @l7-summary-fields goid,name,checksum -> @l7-excluded-fields +> @l7-display-summary-fields name +> @l7-name-fields name """ type InternalIdp { + """The goid of the Internal IDP""" goid: ID! + + """The name of the Internal IDP""" name: String! + + """A checksum of properties""" checksum: String! + + """Certificate validation""" certValidation: CertValidationType! } @@ -2345,11 +2857,17 @@ type InternalSoapService implements PublishedService { """Which http methods are allowed if not just POST""" methodsAllowed: [HttpMethod!]! + + """Whether or not the tracing is enabled""" tracingEnabled: Boolean! + + """Whether or not the WSS processing is enabled""" wssProcessingEnabled: Boolean! """Allow requests intended for operations not supported by the WSDL""" laxResolution: Boolean + + """Service properties""" properties: [EntityProperty!] """The WSDL of the soap service""" @@ -2378,12 +2896,25 @@ A user in the internal identity provider. > @l7-summary-fields goid,name,login,checksum > @l7-excluded-fields memberOf.* > @l7-included-fields memberOf.name +> @l7-encrypted-fields password """ type InternalUser { + """The goid of the Internal User""" goid: ID! + + """The name of the Internal User""" name: String + + """The login of the Internal User""" login: String! + + """The description of the Internal User""" + description: String + + """A checksum of properties""" checksum: String! + + """User is enabled""" enabled: Boolean! """The hashed password of the user if defined""" @@ -2396,8 +2927,14 @@ type InternalUser { """SSH public key""" sshPublicKey: String + + """The first name of the Internal User""" firstName: String + + """The last name of the Internal User""" lastName: String + + """The email of the Internal User""" email: String """Whether to replace existing group memberships or not""" @@ -2440,6 +2977,9 @@ input InternalUserInput { lastName: String email: String + """The description of the Internal User""" + description: String + """Is user enabled or not!""" enabled: Boolean = true @@ -2504,8 +3044,14 @@ type InternalWebApiService implements PublishedService { """Which http methods are allowed""" methodsAllowed: [HttpMethod!]! + + """Whether or not the tracing is enabled""" tracingEnabled: Boolean! + + """Whether or not the WSS processing is enabled""" wssProcessingEnabled: Boolean! + + """Service properties""" properties: [EntityProperty!] """The policy and dependencies""" @@ -2523,7 +3069,11 @@ A JDBC connection. > @l7-entity > @l7-identity-fields name > @l7-summary-fields goid,name,checksum -> @l7-excluded-fields +> @l7-name-fields name +> @l7-display-summary-fields name,driverClass,jdbcUrl,username,enabled +> @l7-encrypted-fields password +> @l7-foreign-fields password|name|Secret +> @l7-alternative-fields """ type JdbcConnection { """The goid for the JDBC Connection""" @@ -2598,6 +3148,9 @@ input JdbcConnectionInput { } input JdbcConnectionPartialInput { + """The internal entity unique identifier""" + goid: ID + """The JDBC Connection name""" name: String @@ -2655,7 +3208,10 @@ A JMS destination (queue or topic). > @l7-entity > @l7-identity-fields name,direction,providerType > @l7-summary-fields goid,name,direction,providerType,checksum -> @l7-excluded-fields +> @l7-name-fields name,direction,providerType +> @l7-display-summary-fields name,direction,providerType,destinationName,jndiUrl,enabled +> @l7-encrypted-fields jndiPassword,destinationPassword +> @l7-foreign-fields jndiPassword|name|Secret,destinationPassword|name|Secret """ type JmsDestination { """The goid for the JMS Destination""" @@ -2870,6 +3426,29 @@ enum JobType { """A JSON object""" scalar JSON +type JsonResourcePatch { + id: String! + patches: [JsonResourcePatchOperation!]! +} + +type JsonResourcePatchOperation { + op: String! + path: String! + from: String + value: JSON +} + +type JVMInfo { + """Java Virtual Machine vendor""" + vendor: String + + """Java Virtual Machine name""" + name: String + + """Java Virtual Machine version""" + version: String +} + type KerberosConfig { """The encrypted Kerberos keytab.""" keytab: String @@ -2899,6 +3478,9 @@ key and associated certificate and are used for example by listener ports. > @l7-identity-fields alias,keystoreId > @l7-summary-fields goid,keystoreId,alias,checksum > @l7-excluded-fields pem +> @l7-encrypted-fields p12,pem +> @l7-alternative-fields p12|pem,pem|p12 +> @l7-name-fields alias """ type Key { """The internal entity unique identifier""" @@ -2980,6 +3562,26 @@ type KeyCSRPayload { csr: KeyCSR } +input KeyGenerateOptions { + """RSA Key Size""" + rsaKeyBits: Int = 2048 + + """EC Curve Name""" + ecName: String + + """Number of days before the initial self-signed certificate expires""" + certExpiry: Int = 1825 + + """Signature hash algorithm for signing a certificate""" + signatureHashAlg: String + + """Use RSASSA-PSS Signature Scheme""" + useRsaSsaPss: Boolean + + """The Certificate will be used to sign other certificates""" + certCACapable: Boolean +} + input KeyInput { keystoreId: ID = "00000000000000000000000000000002" alias: String! @@ -3001,7 +3603,7 @@ input KeyInput { """ subjectDn: String - """Key type. (Note that, this field has no effect on the mutation)""" + """Key type RSA/EC""" keyType: String """ @@ -3018,6 +3620,9 @@ input KeyInput { Ignored at entity creation time but declared here so you can embed checksums in graphman bundles """ checksum: String + + """Key Generate Options""" + keyGenerateOptions: KeyGenerateOptions } input KeyMappingInstructionInput { @@ -3070,7 +3675,10 @@ type L7PoliciesPayload implements EntityMutationsPayload { > @l7-entity policy|policies > @l7-identity-fields name,policyType > @l7-summary-fields goid,guid,name,policyType,tag,subTag,checksum -> @l7-excluded-fields policyRevision,policyRevisions +> @l7-excluded-fields policy.directDependencies,policy.allDependencies,policyRevision,policyRevisions +> @l7-name-fields name +> @l7-display-summary-fields name,policyType,enabled +> @l7-alternative-fields policy.xml|policy.json|policy.yaml|policy.code,policyRevision.xml|policyRevision.json|policyRevision.yaml|policyRevision.code,policyRevisions.xml|policyRevisions.json|policyRevisions.yaml|policyRevisions.code """ type L7Policy { """The goid for this policy""" @@ -3094,18 +3702,99 @@ type L7Policy { """The configuration checksum""" checksum: String! - """The folder path to the policy""" - folderPath: String! + """The policy version""" + version: Int + + """Is the policy enabled or not""" + enabled: Boolean! + + """The folder path to the policy""" + folderPath: String! + + """Is soap""" soap: Boolean """The actual policy and dependencies""" policy: Policy! """ - The policy revision. It can be either the active revision or the specific one when queried explicitly. + (Deprecated) The policy revision. It can be either the active revision or the specific one when queried explicitly. """ policyRevision: PolicyRevision - policyRevisions: [PolicyRevision!]! + + """ + The policy revisions. + When [selected] argument is not empty, selected revisions will be returned. + If not, all the revisions will be returned. + NOTE: Use 0 to select active revision. Use -1 to select latest revision. + """ + policyRevisions(selected: [Long!]): [PolicyRevision!]! +} + +""" + A Layer7 Policy alias +> @l7-entity policyAlias|policyAliases +> @l7-identity-fields name,folderPath +> @l7-summary-fields goid,name,folderPath,checksum +> @l7-name-fields name +> @l7-display-summary-fields name,folderPath +""" +type L7PolicyAlias { + """The goid for this alias""" + goid: ID! + + """Aliased entity name""" + name: String! + + """Aliased policy name""" + aliasedPolicyName: String + + """The folder path to the alias""" + folderPath: String! + + """The configuration checksum""" + checksum: String! +} + +type L7PolicyAliasesPayload implements EntityMutationsPayload { + status: [EntityMutationStatus!]! + detailedStatus: [EntityMutationDetailedStatus!]! + policyAliases: [L7PolicyAlias]! +} + +input L7PolicyAliasInput { + """The internal entity unique identifier""" + goid: ID + + """ + The folder path where to create this alias. If the path does not exist, it will be created + """ + folderPath: String! + + """The name of the aliased entity.""" + name: String! + + """ + Ignored at creation time but can be used to compare bundle with gw state + """ + checksum: String +} + +type L7PolicyAliasPayload implements EntityMutationPayload { + status: EntityMutationStatus! + detailedStatus: EntityMutationDetailedStatus! + policyAlias: L7PolicyAlias +} + +"""Reference input to identify the policy alias entity""" +input L7PolicyAliasRefInput { + """ + The folder path where to create this alias. If the path does not exist, it will be created + """ + folderPath: String! + + """The name of the aliased entity.""" + name: String! } input L7PolicyInput { @@ -3125,13 +3814,23 @@ input L7PolicyInput { """The policy""" policy: PolicyInput! + + """(Deprecated) The policy revision.""" policyRevision: PolicyRevisionInput + + """The policy revisions.""" policyRevisions: [PolicyRevisionInput!] soap: Boolean = false policyType: L7PolicyType! tag: String subTag: String + """The policy version""" + version: Int + + """Is the policy enabled or not""" + enabled: Boolean = true + """ Ignored at creation time but can be used to compare bundle with gw state """ @@ -3148,17 +3847,27 @@ input L7PolicyPartialInput { folderPath: String """The name of the policy. Policies are unique by name.""" - name: String! + name: String """The guid for this policy, if none provided, assigned at creation""" guid: ID """The policy""" policy: PolicyInput + + """(Deprecated) The policy revision.""" policyRevision: PolicyRevisionInput + + """The policy revisions.""" policyRevisions: [PolicyRevisionInput!] + + """The policy version""" + version: Int + + """Is the policy enabled or not""" + enabled: Boolean soap: Boolean = false - policyType: L7PolicyType! + policyType: L7PolicyType tag: String subTag: String @@ -3196,7 +3905,10 @@ A Layer7 service. > @l7-entity service|services > @l7-identity-fields resolutionPath,resolvers,serviceType > @l7-summary-fields goid,guid,name,resolutionPath,resolvers,serviceType,checksum -> @l7-excluded-fields policyRevision,policyRevisions +> @l7-excluded-fields policy.directDependencies,policy.allDependencies,policyRevision,policyRevisions +> @l7-name-fields name +> @l7-display-summary-fields name,resolutionPath,serviceType,enabled +> @l7-alternative-fields policy.xml|policy.json|policy.yaml|policy.code,policyRevision.xml|policyRevision.json|policyRevision.yaml|policyRevision.code,policyRevisions.xml|policyRevisions.json|policyRevisions.yaml|policyRevisions.code """ type L7Service implements PublishedService { """The goid for this service""" @@ -3220,6 +3932,9 @@ type L7Service implements PublishedService { """The configuration checksum""" checksum: String! + """The service version""" + version: Int + """Whether or not the published service is enabled""" enabled: Boolean! @@ -3231,11 +3946,17 @@ type L7Service implements PublishedService { """Which http methods are allowed""" methodsAllowed: [HttpMethod!]! + + """Whether or not the tracing is enabled""" tracingEnabled: Boolean! + + """Whether or not the WSS processing is enabled""" wssProcessingEnabled: Boolean! """Allow requests intended for operations not supported by the WSDL""" laxResolution: Boolean + + """Service properties""" properties: [EntityProperty!] """URL for the protected service WSDL document""" @@ -3251,10 +3972,84 @@ type L7Service implements PublishedService { policy: Policy! """ - The service policy revision. It can be either the active revision or the specific one when queried explicitly. + (Deprecated) The service policy revision. It can be either the active revision + or the specific one when queried explicitly. """ policyRevision: PolicyRevision - policyRevisions: [PolicyRevision!]! + + """ + The policy revisions. + When [selected] argument is not empty, selected revisions will be returned. + If not, all the revisions will be returned. + NOTE: Use 0 to select active revision. Use -1 to select latest revision. + """ + policyRevisions(selected: [Long!]): [PolicyRevision!]! +} + +""" + A Layer7 Service alias +> @l7-entity serviceAlias|serviceAliases +> @l7-identity-fields name,folderPath +> @l7-summary-fields goid,name,folderPath,checksum +> @l7-name-fields name +> @l7-display-summary-fields name,folderPath +""" +type L7ServiceAlias { + """The goid for this alias""" + goid: ID! + + """Aliased entity name""" + name: String! + + """The name of the aliased entity.""" + aliasedServiceName: String + + """The folder path to the alias""" + folderPath: String! + + """The configuration checksum""" + checksum: String! +} + +type L7ServiceAliasesPayload implements EntityMutationsPayload { + status: [EntityMutationStatus!]! + detailedStatus: [EntityMutationDetailedStatus!]! + serviceAliases: [L7ServiceAlias]! +} + +input L7ServiceAliasInput { + """The internal entity unique identifier""" + goid: ID + + """ + The folder path where to create this alias. If the path does not exist, it will be created + """ + folderPath: String! + + """The name of the aliased entity.""" + name: String! + + """ + Ignored at creation time but can be used to compare bundle with gw state + """ + checksum: String +} + +type L7ServiceAliasPayload implements EntityMutationPayload { + status: EntityMutationStatus! + detailedStatus: EntityMutationDetailedStatus! + serviceAlias: L7ServiceAlias +} + +"""Reference input to identify the service alias entity""" +input L7ServiceAliasRefInput { + """ + The folder path where to create this alias. If the path does not exist, it will be created + """ + folderPath: String! + + """The name of the aliased entity.""" + name: String! } input L7ServiceInput { @@ -3279,6 +4074,9 @@ input L7ServiceInput { """The configuration checksum""" checksum: String + """The service version""" + version: Int + """Whether or not the published service is enabled""" enabled: Boolean = true @@ -3311,7 +4109,7 @@ input L7ServiceInput { """The service policy""" policy: PolicyInput! - """This will be ignored during the mutation""" + """(Deprecated) This will be ignored during the mutation""" policyRevision: PolicyRevisionInput """This will be ignored during the mutation""" @@ -3340,6 +4138,9 @@ input L7ServicePartialInput { """The configuration checksum""" checksum: String + """The service version""" + version: Int + """Whether or not the published service is enabled""" enabled: Boolean @@ -3372,7 +4173,7 @@ input L7ServicePartialInput { """The service policy""" policy: PolicyInput - """This will be ignored during the mutation""" + """(Deprecated) This will be ignored during the mutation""" policyRevision: PolicyRevisionInput """This will be ignored during the mutation""" @@ -3411,9 +4212,16 @@ interpreted by the ldap directory itself. > @l7-deprecated Use 'LdapIdp' instead. """ type Ldap { + """The goid of the LDAP identity provider""" goid: ID! + + """The name of the LDAP identity provider""" name: String! + + """A checksum of properties""" checksum: String! + + """LDAP URLs""" ldapUrls: [String!]! """ @@ -3428,11 +4236,23 @@ type Ldap { The alias of the key in the gateway keystore that is used when doing ldaps client cert authentication """ ldapsClientKeyAlias: String + + """Search base""" searchBase: String! + + """Writable""" writable: Boolean! + + """Bind DN""" bindDn: String! + + """Bind password""" bindPassword: String! + + """User mappings""" userMappings: [UserMapping!]! + + """Group mappings""" groupMappings: [GroupMapping!]! } @@ -3445,14 +4265,22 @@ interpreted by the ldap directory itself. > @l7-entity > @l7-identity-fields name > @l7-summary-fields goid,name,ldapType,checksum -> @l7-excluded-fields +> @l7-name-fields name +> @l7-display-summary-fields name,ldapType,properties[name=adminEnabled].value +> @l7-encrypted-fields bindPassword +> @l7-foreign-fields sslClientKeyAlias|alias|Key """ type LdapIdp { + """The goid of the LDAP IDP""" goid: ID! + + """The name of the LDAP IDP""" name: String! """Ldap type""" ldapType: String! + + """A checksum of properties""" checksum: String! """Ldap server urls""" @@ -3467,14 +4295,32 @@ type LdapIdp { The alias of the key in the gateway keystore that is used when doing ldaps client cert authentication """ sslClientKeyAlias: String + + """Search base""" searchBase: String! + + """Bind DN""" bindDn: String + + """Bind password""" bindPassword: String + + """Is writable""" writable: Boolean! + + """Write base""" writeBase: String + + """Specified attributes""" specifiedAttributes: [String!] + + """User mappings""" userMappings: [UserMapping!]! + + """Group mappings""" groupMappings: [GroupMapping!]! + + """NTLM properties""" ntlmProperties: [EntityProperty!] """Additional properties""" @@ -3559,12 +4405,87 @@ type LdapsPayload implements EntityMutationsPayload { ldaps: [Ldap]! } +type Licensee { + """Licensee Name""" + name: String + + """Licensee Contact Email""" + contactEmail: String +} + +type LicenseGrants { + """License HostName""" + hostname: String + + """License IP""" + ip: String + + """License product Name""" + productName: String + + """License FeatureSets""" + featureSets: [String] + + """license Product Information""" + productVersion: LicenseProductVersion +} + +"""license information""" +type LicenseInfo { + """License Id""" + licenseId: String + + """License Status""" + licenseStatus: String + + """The start date of the validity period""" + startDate: DateTime + + """The expiry date of the validity period""" + expiryDate: DateTime + + """License Description""" + description: String + + """licensee Information""" + licensee: Licensee + + """License EULA Text""" + eulaText: String + + """License Feature Label""" + featureLabel: String + + """License Attributes""" + attributes: [String] + + """License Contents""" + contents: String + + """license Grants Information""" + grants: LicenseGrants +} + +type LicenseProductVersion { + """License Major Version""" + major: String + + """License Minor Version""" + minor: String + + """License Trusted Issuer""" + issuer: String +} + """ A listen port (Layer7 Gateway connector). > @l7-entity > @l7-identity-fields name > @l7-summary-fields goid,name,protocol,port,checksum > @l7-excluded-fields hardwiredService +> @l7-name-fields name +> @l7-display-summary-fields name,protocol,port,properties[name=bindAddress].value +> @l7-foreign-fields hardwiredServiceName|name|L7Service,tlsSettings.keystoreId|keystoreId|Key,tlsSettings.keyAlias|alias|Key """ type ListenPort { """The internal entity unique identifier""" @@ -3757,6 +4678,10 @@ type ListenPortsPayload implements EntityMutationsPayload { listenPorts: [ListenPort]! } +""" +Listen Port TLS Settings +> @l7-foreign-fields keystoreId|keystoreId|Key,keyAlias|alias|Key +""" type ListenPortTlsSettings { """ Specify whether the client must present a certificate to authenticate: NONE/OPTIONAL/REQUIRED @@ -3818,7 +4743,8 @@ A Log sink. > @l7-entity > @l7-identity-fields name > @l7-summary-fields goid,name,checksum -> @l7-excluded-fields +> @l7-name-fields name +> @l7-display-summary-fields name,type,description,enabled """ type LogSink { """The internal entity unique identifier""" @@ -3988,15 +4914,27 @@ type Mutation { """Create or update policies""" setPolicies(input: [L7PolicyInput!]!): L7PoliciesPayload! + """ + " + Set active revision for the policies. + By default, it chooses the latest revision as active. If the latest revision available is already active, does nothing. + """ + setPolicyRevisions(input: [L7PolicyPartialInput!]!): L7PoliciesPayload! + """Delete policies""" deletePolicies(names: [String!]!): L7PoliciesPayload! + """Update an existing policy. Match is carried by refInput""" + updatePolicy(refInput: PolicyRefInput!, input: L7PolicyPartialInput!): L7PolicyPayload! + """ Update existing revision (comment and/or active) for the specified policy """ - updatePolicyRevision(input: L7PolicyPartialInput!, revision: Long!, activate: Boolean!, comment: String): L7PolicyPayload! + updatePolicyRevision(refInput: PolicyRefInput!, revision: Long!, activate: Boolean, comment: String): L7PolicyPayload! - """Update existing revision (comment and/or active) for the policies""" + """ + (Deprecated) Update existing revision (comment and/or active) for the policies + """ updatePoliciesRevision(input: [L7PolicyPartialInput!]!, activate: Boolean!, comment: String): L7PoliciesPayload! """Create or update policy fragments""" @@ -4014,7 +4952,14 @@ type Mutation { """Create or update services""" setServices(input: [L7ServiceInput!]!): L7ServicesPayload! - """Update an existing service.Match is carried by refInput""" + """ + " + Set active revision for the services. + By default, it chooses the latest revision as active. If the latest revision available is already active, does nothing. + """ + setServiceRevisions(input: [L7ServicePartialInput!]!): L7ServicesPayload! + + """Update an existing service. Match is carried by refInput""" updateService(refInput: ServiceRefInput!, input: L7ServicePartialInput!): L7ServicePayload! """ @@ -4031,9 +4976,11 @@ type Mutation { """ Update existing revision (comment and/or active) for the specified service """ - updateServiceRevision(input: L7ServicePartialInput!, revision: Long!, activate: Boolean!, comment: String): L7ServicePayload! + updateServiceRevision(refInput: ServiceRefInput!, revision: Long!, activate: Boolean, comment: String): L7ServicePayload! - """Update existing revision (comment and/or active) for the services""" + """ + (Deprecated) Update existing revision (comment and/or active) for the services + """ updateServicesRevision(input: [L7ServicePartialInput!]!, activate: Boolean!, comment: String): L7ServicesPayload! """Create or update web api services""" @@ -4253,6 +5200,9 @@ type Mutation { """Creates or updates one or more secrets""" setSecrets(input: [SecretInput!]!): SecretsPayload + """Updating the secret""" + updateSecret(refInput: SecretRefInput!, input: SecretPartialInput!): SecretPayload + """Creates or updates one or more keys""" setKeys(input: [KeyInput!]!): KeysPayload @@ -4339,6 +5289,15 @@ type Mutation { """Set/Update the Password Policies""" setPasswordPolicies(input: [PasswordPolicyInput!]!): PasswordPoliciesPayLoad! + """ + Create or update existing policy-backed service. + Match is carried by name. If match is found, it will be updated. Otherwise, it will be created. + """ + setPolicyBackedServices(input: [PolicyBackedServiceInput!]!): PolicyBackedServicesPayload! + + """Delete existing policy-backed service. Match is carried by name.""" + deletePolicyBackedServices(names: [String!]!): PolicyBackedServicesPayload! + """ Create or update existing revocation check policies. Match is carried by name. If match is found, it will be updated. Otherwise, it will be created. @@ -4370,6 +5329,9 @@ type Mutation { """Set the Folders""" setFolders(input: [FolderInput!]!): FoldersPayload! + """Update the folder""" + updateFolder(refInput: FolderRefInput!, input: FolderPartialInput!): FolderPayload! + """Delete the Folders by Path""" deleteFolders(paths: [String!]!): FoldersPayload! @@ -4418,6 +5380,12 @@ type Mutation { """Removes user to the group""" removeUserFromGroup(group: String!, user: UserRefInput!): GroupRefPayload + + """Create/Update Sample Messages.""" + setSampleMessages(input: [SampleMessageInput!]!): SampleMessagesPayload + + """Deletes Sample Messages""" + deleteSampleMessages(sampleMessages: [String!]!): SampleMessagesPayload setAuditConfigurations(input: [AuditConfigurationInput!]!): AuditConfigurationsPayload! """ @@ -4443,6 +5411,18 @@ type Mutation { Delete the Kerberos keytab. The config files "krb5.conf" and "login.config" are not deleted. """ deleteKerberosConfigs(names: [String]): KerberosConfigPayload + + """Create or update policy aliases""" + setPolicyAliases(input: [L7PolicyAliasInput!]!): L7PolicyAliasesPayload! + + """Create or update service aliases""" + setServiceAliases(input: [L7ServiceAliasInput!]!): L7ServiceAliasesPayload! + + """Delete policy alias""" + deletePolicyAlias(refInput: L7PolicyAliasRefInput!): L7PolicyAliasPayload! + + """Delete service alias""" + deleteServiceAlias(refInput: L7ServiceAliasRefInput!): L7ServiceAliasPayload! } input NamedEntityMappingInstructionInput { @@ -4524,6 +5504,17 @@ enum OcspNonceUsage { USE_NONCE_CONDITIONALLY } +type OSInfo { + """Operating System Name""" + name: String + + """Operating System architecture""" + architecture: String + + """Operating System version""" + version: String +} + type PasswdStrategy { """Possible values are 0 for CLEAR, 1 for HASHED""" val: Int! @@ -4545,7 +5536,7 @@ An identity provider's password policy. > @l7-entity > @l7-identity-fields goid > @l7-summary-fields goid,checksum -> @l7-excluded-fields +> @l7-display-summary-fields goid """ type PasswordPolicy { """The internal entity unique identifier""" @@ -4697,9 +5688,21 @@ input PasswordPolicyRefInput { goid: ID! } +type PatchInfo { + """Patch ID""" + patchId: String + + """Patch Description""" + description: String + + """Patch status""" + status: String +} + """ Wrapper for the policy XML and the dependencies they include > @l7-excluded-fields json,yaml,code,directDependencies,allDependencies +> @l7-alternative-fields xml|json|yaml|code,json|xml|yaml|code,yaml|xml|json|code,code|xml|json|yaml """ type Policy { """The policy XML""" @@ -4730,7 +5733,9 @@ A policy backed identity provider. > @l7-entity > @l7-identity-fields name > @l7-summary-fields goid,name,checksum -> @l7-excluded-fields +> @l7-name-fields name +> @l7-display-summary-fields name,properties[name=adminEnabled].value +> @l7-foreign-fields authPolicyName|name|L7Policy """ type PolicyBackedIdp { """The internal entity unique identifier""" @@ -4778,8 +5783,82 @@ type PolicyBackedIdpsPayload implements EntityMutationsPayload { policyBackedIdps: [PolicyBackedIdp]! } +""" +A policy-backed service that represents one or more operations backed by a designated policy. +> @l7-entity +> @l7-identity-fields name +> @l7-summary-fields goid,name,interfaceName,checksum +> @l7-name-fields name +> @l7-display-summary-fields name,interfaceName +> @l7-foreign-fields operations.policyName|name|L7Policy +""" +type PolicyBackedService { + """The goid for the policy-backed service""" + goid: ID! + + """The policy-backed service name""" + name: String! + + """The policy-backed service interface name""" + interfaceName: String! + + """The configuration checksum of this policy-backed service""" + checksum: String! + + """The policy-backed service operations""" + operations: [PolicyBackedServiceOperation!]! +} + +input PolicyBackedServiceInput { + """The internal entity unique identifier""" + goid: ID + + """The policy-backed service name""" + name: String! + + """The policy-backed service interface name""" + interfaceName: String! + + """The policy-backed service operations""" + operations: [PolicyBackedServiceOperationInput!]! + + """ + Ignored at creation time but can be used to compare bundle with gw state + """ + checksum: String +} + +""" +A policy-backed service operation +> @l7-foreign-fields policyName|name|L7Policy +""" +type PolicyBackedServiceOperation { + """An operation associated with a policy-backed service""" + operationName: String! + + """A backed policy defining the operation""" + policyName: String! +} + +input PolicyBackedServiceOperationInput { + """An operation associated with a policy-backed service""" + operationName: String! + + """A backed policy defining the operation""" + policyName: String! +} + +type PolicyBackedServicesPayload implements EntityMutationsPayload { + status: [EntityMutationStatus!]! + detailedStatus: [EntityMutationDetailedStatus!]! + + """The mutated policy-backed services""" + policyBackedServices: [PolicyBackedService]! +} + """ Policy Dependency contains all dependencies that may be referred to from the policy XML this is associated with +> @l7-excluded-fields fips,fipUsers,fipGroups,ldaps,policyFragments """ type PolicyDependency { """Active Connectors (SFTP, MQ Native, Kafka)""" @@ -4903,6 +5982,8 @@ type PolicyFragment { """The folder path to the policy""" folderPath: String! + + """Is soap""" soap: Boolean """The actual policy and dependencies""" @@ -4976,6 +6057,7 @@ input PolicyRefInput { """ Wrapper for the policy revision > @l7-excluded-fields json,yaml,code +> @l7-alternative-fields xml|json|yaml|code,json|xml|yaml|code,yaml|xml|json|code,code|xml|json|yaml """ type PolicyRevision { goid: ID! @@ -5033,6 +6115,29 @@ enum PolicyUsageType { """An Integer that MUST be greater than zero""" scalar PositiveInt +type ProductVersion { + """Major version of the product""" + major: String! + + """Minor version of the product""" + minor: String! + + """Sub minor version of the product""" + subMinor: String! + + """Build number of the GW""" + buildNumber: String! + + """formal string of the GW, complete version""" + formalString: String! + + """GW Long build number""" + longString: String! + + """GW Short Build number""" + shortString: String! +} + interface PublishedService { """The name of the published service""" name: String! @@ -5054,6 +6159,36 @@ interface PublishedService { Copyright (c) 2025. Broadcom Inc. and its subsidiaries. All Rights Reserved. """ type Query { + """Get all the assertions metadata""" + assertionsMetadata: [AssertionMetadata!]! + + """Get the assertion metadata by configName""" + assertionMetadataByConfigName(configName: String!): AssertionMetadata + + """Get the assertions metadata by type""" + assertionsMetadataByType(assertionType: AssertionType!): [AssertionMetadata!] + + """Get the filtered assertions metadata""" + assertionsMetadataByFilters(filters: [EntityFilterInput!]!): [AssertionMetadata!] + + """Get the meta data of Built in Variables""" + builtinPolicyVariables: [VariableMetadata!] + + """Get the meta data of Built in Variables""" + builtinPolicyVariablesByFilters(filters: [EntityFilterInput!]!): [VariableMetadata!] + + """Get all the entities metadata""" + entitiesMetadata: [EntityMetadata!]! + + """Get the entity metadata by name""" + entityMetadataByName(name: String!): EntityMetadata + + """Get the entity metadata by pluralName""" + entityMetadataByPluralName(pluralName: String!): EntityMetadata + + """Get the filtered entities metadata""" + entitiesMetadataByFilters(filters: [EntityFilterInput!]!): [EntityMetadata!] + """Get all policies""" policies: [L7Policy!]! @@ -5075,9 +6210,12 @@ type Query { """Get policy by guid""" policyByGuid(guid: ID!): L7Policy - """Get policy and it's revision by name and revision ordinal""" + """(Deprecated) Get policy and it's revision by name and revision ordinal""" policyByNameAndRevision(name: String!, revision: Long!): L7Policy + """Get filtered policies""" + policiesByFilters(filters: [EntityFilterInput!]!): [L7Policy!]! + """Get all policy fragments""" policyFragments: [PolicyFragment!]! @deprecated(reason: "Use 'policies' instead.") @@ -5137,9 +6275,14 @@ type Query { """Get services by resolvers""" servicesByResolvers(resolvers: ServiceResolversInput!): [L7Service!]! - """Get service and it's revision by resolvers and revision ordinal""" + """ + (Deprecated) Get service and it's revision by resolvers and revision ordinal + """ serviceByResolversAndRevision(resolvers: ServiceResolversInput!, revision: Long!): L7Service + """Get filtered services""" + servicesByFilters(filters: [EntityFilterInput!]!): [L7Service!]! + """Get all webApi services""" webApiServices: [WebApiService]! @deprecated(reason: "Use 'services' instead.") internalWebApiServices: [InternalWebApiService]! @deprecated(reason: "Use 'services' instead.") @@ -5216,6 +6359,11 @@ type Query { """Get Encapsulated Assertion Configuration by guid""" encassConfigByGuid(guid: ID!): EncassConfig + + """Get filtered Encapsulated Assertion Configurations""" + encassConfigsByFilters(filters: [EntityFilterInput!]!): [EncassConfig!]! + + """Get all Custom Key values""" customKeyValues: [CustomKeyValue!]! """Get the Custom Key value by goid""" @@ -5224,6 +6372,9 @@ type Query { """Get the Custom Key value with the given key name""" customKeyValueByKey(key: String!): CustomKeyValue + """Get filtered Custom Key values""" + customKeyValuesByFilters(filters: [EntityFilterInput!]!): [CustomKeyValue!]! + """Get all cluster properties""" clusterProperties: [ClusterProperty!]! @@ -5233,6 +6384,9 @@ type Query { """Get the cluster property with the given name""" clusterPropertyByName(name: String!): ClusterProperty + """Get filtered cluster properties""" + clusterPropertiesByFilters(filters: [EntityFilterInput!]!): [ClusterProperty!]! + """Retrieves all trusted certificates""" trustedCerts: [Certificate!]! @@ -5245,6 +6399,9 @@ type Query { """The trusted certificate associated with this unique thumbprint""" trustedCertByThumbprint(thumbprintSha1: String!): Certificate + """Get filtered trusted certificates""" + trustedCertsByFilters(filters: [EntityFilterInput!]!): [Certificate!]! + """Get all JDBC Connections""" jdbcConnections: [JdbcConnection!]! @@ -5254,6 +6411,9 @@ type Query { """Get JDBC Connection by goid""" jdbcConnectionByGoid(goid: ID!): JdbcConnection + """Get filtered JDBC Connections""" + jdbcConnectionsByFilters(filters: [EntityFilterInput!]!): [JdbcConnection!]! + """Get all Cassandra Connections""" cassandraConnections: [CassandraConnection!]! @@ -5263,6 +6423,9 @@ type Query { """Get Cassandra Connection by goid""" cassandraConnectionByGoid(goid: ID!): CassandraConnection + """Get filtered Cassandra Connections""" + cassandraConnectionsByFilters(filters: [EntityFilterInput!]!): [CassandraConnection!]! + """Get all JMS Destinations""" jmsDestinations: [JmsDestination!]! @@ -5283,6 +6446,9 @@ type Query { """ jmsDestinationsByName(name: String!): [JmsDestination!]! + """Get filtered JMS Destinations""" + jmsDestinationsByFilters(filters: [EntityFilterInput!]!): [JmsDestination!]! + """Get xml schemas configured on this gateway""" schemas: [Schema!]! @@ -5307,6 +6473,12 @@ type Query { """Get internal dtds, for reference only""" internalDtds: [Dtd!]! + """Get filtered schemas configured on this gateway""" + schemasByFilters(filters: [EntityFilterInput!]!): [Schema!]! + + """The filtered dtds configured on this gateway""" + dtdsByFilters(filters: [EntityFilterInput!]!): [Dtd!]! + """Get internal IDPs.""" internalIdps: [InternalIdp!]! @@ -5325,6 +6497,15 @@ type Query { """Get internal users and groups""" searchInternalIdp(filter: IdpFilter!): InternalSearchResult! + """Get filtered internal IDPs.""" + internalIdpsByFilters(filters: [EntityFilterInput!]!): [InternalIdp!]! + + """Get filtered internal users""" + internalUsersByFilters(filters: [EntityFilterInput!]!): [InternalUser!]! + + """Get filtered internal groups""" + internalGroupsByFilters(filters: [EntityFilterInput!]!): [InternalGroup!]! + """Get all federated IDP configurations""" federatedIdps: [FederatedIdp!]! @@ -5349,6 +6530,15 @@ type Query { """Get federated users and groups""" searchFederatedIdp(filter: IdpFilter!): FederatedSearchResult! + """Get filtered federated IDP configurations""" + federatedIdpsByFilters(filters: [EntityFilterInput!]!): [FederatedIdp!]! + + """Get filtered federated users""" + federatedUsersByFilters(filters: [EntityFilterInput!]!): [FederatedUser!]! + + """Get filtered federated groups""" + federatedGroupsByFilters(filters: [EntityFilterInput!]!): [FederatedGroup!]! + """Get all simple simple ldap configurations""" simpleLdapIdps: [SimpleLdapIdp!]! @@ -5358,6 +6548,9 @@ type Query { """Get simple ldap configuration by name""" simpleLdapIdpByName(name: String!): SimpleLdapIdp + """Get filtered simple simple ldap configurations""" + simpleLdapIdpsByFilters(filters: [EntityFilterInput!]!): [SimpleLdapIdp!]! + """Get all policy backed ldap configurations""" policyBackedIdps: [PolicyBackedIdp!]! @@ -5367,6 +6560,9 @@ type Query { """Get policy backed ldap configuration by name""" policyBackedIdpByName(name: String!): PolicyBackedIdp + """Get filtered policy backed ldap configurations""" + policyBackedIdpsByFilters(filters: [EntityFilterInput!]!): [PolicyBackedIdp!]! + """Get all ldap configurations""" ldapIdps: [LdapIdp!]! @@ -5376,6 +6572,9 @@ type Query { """Get ldap configuration by name""" ldapIdpByName(name: String!): LdapIdp + """Get filtered ldap configurations""" + ldapIdpsByFilters(filters: [EntityFilterInput!]!): [LdapIdp!]! + """Get all fips configurations""" fips: [Fip!]! @deprecated(reason: "Use 'federatedIdps' instead.") @@ -5422,6 +6621,12 @@ type Query { """Retrieves a key by name""" keyByAlias(alias: String!): Key + """Get filtered secrets""" + secretsByFilters(filters: [EntityFilterInput!]!): [Secret!]! + + """Get filtered keys""" + keysByFilters(filters: [EntityFilterInput!]!): [Key!]! + """Get all Server module files""" serverModuleFiles: [ServerModuleFile!]! @@ -5431,6 +6636,9 @@ type Query { """Get Server module file by name""" serverModuleFileByName(name: String!): ServerModuleFile + """Get filtered Server module files""" + serverModuleFilesByFilters(filters: [EntityFilterInput!]!): [ServerModuleFile!]! + """Retrieves all scheduled tasks""" scheduledTasks: [ScheduledTask!]! @@ -5443,6 +6651,9 @@ type Query { """Retrieves a scheduled task by name""" scheduledTaskByName(name: String!): ScheduledTask + """Get filtered scheduled tasks""" + scheduledTasksByFilters(filters: [EntityFilterInput!]!): [ScheduledTask!]! + """Retrieves a background task policy by name""" backgroundTaskPolicyByName(name: String!): BackgroundTaskPolicy @deprecated(reason: "Use 'policyByName' instead.") @@ -5458,6 +6669,9 @@ type Query { """Get the email listener by name""" emailListenerByName(name: String!): EmailListener + """Get filtered email listeners""" + emailListenersByFilters(filters: [EntityFilterInput!]!): [EmailListener!]! + """Get all listen ports""" listenPorts: [ListenPort!]! @@ -5470,6 +6684,9 @@ type Query { """Get the listen ports by protocol""" listenPortsByProtocol(protocol: String!): [ListenPort!]! + """Get filtered listen ports""" + listenPortsByFilters(filters: [EntityFilterInput!]!): [ListenPort!]! + """Get all active connectors""" activeConnectors: [ActiveConnector!]! @@ -5482,6 +6699,9 @@ type Query { """Get the active connectors by type""" activeConnectorsByType(connectorType: String!): [ActiveConnector!]! + """Get filtered active connectors""" + activeConnectorsByFilters(filters: [EntityFilterInput!]!): [ActiveConnector!]! + """Get all siteminder configurations""" smConfigs: [SMConfig!]! @@ -5491,14 +6711,23 @@ type Query { """Get the siteminder configuration by name""" smConfigByName(name: String!): SMConfig + """Get filtered siteminder configurations""" + smConfigsByFilters(filters: [EntityFilterInput!]!): [SMConfig!]! + """Get Service Resolution Config""" serviceResolutionConfig: ServiceResolutionConfig! """Get Service Resolution Configs""" serviceResolutionConfigs: [ServiceResolutionConfig!]! + """Get filtered Service Resolution Configs""" + serviceResolutionConfigsByFilters(filters: [EntityFilterInput!]!): [ServiceResolutionConfig!]! + """Get all cluster nodes information""" - clusterInfo: ClusterInfo! + clusterInfo: ClusterInfo + + """Get cluster node info""" + nodeInfo: ClusterNodeInfo """Get Password Policy""" passwordPolicy: PasswordPolicy! @@ -5506,6 +6735,21 @@ type Query { """Get Password Policies""" passwordPolicies: [PasswordPolicy!]! + """Get filtered Password Policies""" + passwordPoliciesByFilters(filters: [EntityFilterInput!]!): [PasswordPolicy!]! + + """Get all policy-backed services""" + policyBackedServices: [PolicyBackedService!]! + + """Get the policy-backed service by goid""" + policyBackedServiceByGoid(goid: ID!): PolicyBackedService + + """Get the policy-backed service by name""" + policyBackedServiceByName(name: String!): PolicyBackedService + + """Get filtered policy-backed services""" + policyBackedServicesByFilters(filters: [EntityFilterInput!]!): [PolicyBackedService!]! + """Get all RevocationCheckPolicies""" revocationCheckPolicies: [RevocationCheckPolicy!]! @@ -5515,12 +6759,18 @@ type Query { """Get the RevocationCheckPolicy by name""" revocationCheckPolicyByName(name: String!): RevocationCheckPolicy + """Get filtered RevocationCheckPolicies""" + revocationCheckPoliciesByFilters(filters: [EntityFilterInput!]!): [RevocationCheckPolicy!]! + """ Get all administrative user account properties : logonMaxAllowableAttempts, logonLockoutTime, logonSessionExpiry, logonInactivityPeriod """ administrativeUserAccountProperties: [AdministrativeUserAccountProperty!]! + """Get filtered administrative user account properties""" + administrativeUserAccountPropertiesByFilters(filters: [EntityFilterInput!]!): [AdministrativeUserAccountProperty!]! + """Get all http configuration""" httpConfigurations: [HttpConfiguration!]! @@ -5530,6 +6780,9 @@ type Query { """Get the http configurations with the given host""" httpConfigurationsByHost(host: String!): [HttpConfiguration!]! + """Get filtered http configuration""" + httpConfigurationsByFilters(filters: [EntityFilterInput!]!): [HttpConfiguration!]! + """Get all Folders""" folders: [Folder!]! @@ -5544,6 +6797,9 @@ type Query { """ foldersByPath(path: String!): [Folder!]! + """Get filtered Folders""" + foldersByFilters(filters: [EntityFilterInput!]!): [Folder!]! + """Get All LogSinks""" logSinks: [LogSink!]! @@ -5553,17 +6809,32 @@ type Query { """Get the LogSink with the given name""" logSinkByName(name: String!): LogSink + """Get filtered LogSinks""" + logSinksByFilters(filters: [EntityFilterInput!]!): [LogSink!]! + """Get all roles""" roles: [Role!]! """Retrieves a role by goid""" - roleByGoid(goid: String!): Role + roleByGoid(goid: ID!): Role """Retrieves a role by name""" roleByName(name: String!): Role + """Get filtered roles""" + rolesByFilters(filters: [EntityFilterInput!]!): [Role!]! + + """Get all identity providers""" + idps: [IdpRef!]! + + """Get multiple identity providers by name""" + idpsByName(name: String!): [IdpRef!]! + + """Get identity provider by goid""" + idpByGoid(goid: ID!): IdpRef + """Get all users""" - idpUsers(providerType: IdpType!, providerName: String!): [UserRef] + idpUsers(providerType: IdpType!, providerName: String!): [UserRef!]! """Get user by login id""" idpUserByLogin(providerType: IdpType!, providerName: String!, login: String!): UserRef @@ -5571,6 +6842,9 @@ type Query { """Get user by SubjectDn""" idpUserBySubjectDn(providerType: IdpType!, providerName: String!, subjectDn: String!): UserRef + """Get filtered users""" + idpUsersByFilters(providerType: IdpType!, providerName: String!, filters: [EntityFilterInput!]!): [UserRef!]! + """Get all groups""" idpGroups(providerType: IdpType!, providerName: String!): [GroupRef] @@ -5580,23 +6854,89 @@ type Query { """Get group by subjectDn""" idpGroupBySubjectDn(providerType: IdpType!, providerName: String!, subjectDn: String!): GroupRef + """Get filtered groups""" + idpGroupsByFilters(providerType: IdpType!, providerName: String!, filters: [EntityFilterInput!]!): [GroupRef!]! + + """Get all sample messages""" + sampleMessages: [SampleMessage!]! + + """Retrieves a sample message by goid""" + sampleMessageByGoid(goid: String!): SampleMessage + + """Retrieves a sample message by name""" + sampleMessageByName(name: String!): SampleMessage + + """Get filtered sample messages""" + sampleMessagesByFilters(filters: [EntityFilterInput!]!): [SampleMessage!]! + """Get All AuditConfigurations""" auditConfigurations: [AuditConfiguration!]! + """Get filtered AuditConfigurations""" + auditConfigurationsByFilters(filters: [EntityFilterInput!]!): [AuditConfiguration!]! + """Get all generic entities""" genericEntities: [GenericEntity!]! """Retrieves a role by goid""" - genericEntityByGoid(goid: String!): GenericEntity + genericEntityByGoid(goid: ID!): GenericEntity """Retrieves a generic entity by name""" genericEntityByName(name: String!): GenericEntity + """Get filtered generic entities""" + genericEntitiesByFilters(filters: [EntityFilterInput!]!): [GenericEntity!]! + """ (Experimental) Get the Kerberos configurations. """ kerberosConfigs: [KerberosConfig!]! + + """ + (Experimental) + Get filtered Kerberos configurations. + """ + kerberosConfigsByFilters(filters: [EntityFilterInput!]!): [KerberosConfig!]! + + """Get authenticated user details""" + authenticatedUser: AuthenticatedUser + + """Get policy aliases""" + policyAliases: [L7PolicyAlias!]! + + """Get policy aliases inside a folder""" + policyAliasesByFolderPath(folderPath: String!): [L7PolicyAlias!]! + + """Get aliases for a given policy""" + policyAliasesByName(name: String!): [L7PolicyAlias!]! + + """Get policy alias by folder and name""" + policyAliasByFolderPathAndName(folderPath: String!, name: String!): L7PolicyAlias + + """Get policy alias by goid""" + policyAliasByGoid(goid: ID!): L7PolicyAlias + + """Get filtered policy aliases""" + policyAliasesByFilters(filters: [EntityFilterInput!]!): [L7PolicyAlias!]! + + """Get service aliases""" + serviceAliases: [L7ServiceAlias!]! + + """Get service aliases inside a folder""" + serviceAliasesByFolderPath(folderPath: String!): [L7ServiceAlias!]! + + """Get aliases for a given service""" + serviceAliasesByName(name: String!): [L7ServiceAlias!]! + + """Get service alias by folder and name""" + serviceAliasByFolderPathAndName(folderPath: String!, name: String!): L7ServiceAlias + + """Get service alias by goid""" + serviceAliasByGoid(goid: ID!): L7ServiceAlias + + """Get filtered service aliases""" + serviceAliasesByFilters(filters: [EntityFilterInput!]!): [L7ServiceAlias!]! } type ReplaceCertChainPayload { @@ -5615,7 +6955,8 @@ A trusted certificate revocation check policy. > @l7-entity > @l7-identity-fields name > @l7-summary-fields goid,name,checksum -> @l7-excluded-fields +> @l7-name-fields name +> @l7-display-summary-fields name """ type RevocationCheckPolicy { """The goid for this revocation check policy""" @@ -5713,7 +7054,7 @@ A Role Configuration. > @l7-entity > @l7-identity-fields name > @l7-summary-fields goid,name,checksum -> @l7-excluded-fields +> @l7-display-summary-fields name,roleType """ type Role { """The goid for the Role""" @@ -5796,12 +7137,74 @@ enum RoleType { } """ -A scheduled task. +A SampleMessage Configuration. +> @l7-entity +> @l7-identity-fields name +> @l7-summary-fields goid,name,checksum +> @l7-display-summary-fields name +""" +type SampleMessage { + """The goid for the SampleMessage""" + goid: ID! + + """Name of a SampleMessage""" + name: String! + + """The configuration checksum""" + checksum: String! + + """sample message content""" + content: String! + + """Operation name""" + operationName: String + + """The name of the service belongs to the sample message""" + serviceName: String +} + +""" +A SampleMessage Configuration. > @l7-entity > @l7-identity-fields name > @l7-summary-fields goid,name,checksum > @l7-excluded-fields """ +input SampleMessageInput { + """The goid for the SampleMessage""" + goid: ID + + """Name of a SampleMessage""" + name: String! + + """The configuration checksum""" + checksum: String + + """sample message content""" + content: String! + + """Operation name""" + operationName: String + + """The name of the service belongs to the sample message""" + serviceName: String +} + +type SampleMessagesPayload implements EntityMutationsPayload { + status: [EntityMutationStatus!]! + detailedStatus: [EntityMutationDetailedStatus!]! + sampleMessages: [SampleMessage]! +} + +""" +A scheduled task. +> @l7-entity +> @l7-identity-fields name +> @l7-summary-fields goid,name,checksum +> @l7-name-fields name +> @l7-display-summary-fields name,jobType,policyName,cronExpression,status +> @l7-foreign-fields policyName|name|L7Policy,runAsUser|login|UserRef,runAsUserProviderName|name|IdpRef +""" type ScheduledTask { """The internal entity unique identifier""" goid: ID! @@ -5832,7 +7235,11 @@ type ScheduledTask { """The scheduled task status""" status: JobStatus! + + """Run as user""" runAsUser: String + + """Run as provider name""" runAsUserProviderName: String } @@ -5879,7 +7286,8 @@ An XML Schema which can be referred to in policy, for example in the validate xm > @l7-entity > @l7-identity-fields systemId > @l7-summary-fields goid,systemId,checksum -> @l7-excluded-fields +> @l7-display-summary-fields systemId,targetNs +> @l7-name-fields systemId """ type Schema { """Internal goid for this schema""" @@ -5956,7 +7364,9 @@ A secret (password or private key) which is used by gateway policies and other c > @l7-entity > @l7-identity-fields name > @l7-summary-fields goid,name,checksum -> @l7-excluded-fields +> @l7-name-fields name +> @l7-display-summary-fields name,secretType,description,lastModifiedDate +> @l7-encrypted-fields secret """ type Secret { """The goid for the Secret""" @@ -5991,6 +7401,12 @@ type Secret { Whether this secret can be referred to in policy via context variable ${secpass... """ variableReferencable: Boolean! + + """Public key of secret""" + publicKey: String + + """Last modified date of secret""" + lastModifiedDate: DateTime } input SecretInput { @@ -6023,12 +7439,62 @@ input SecretInput { using cypher AES/CBC/PKCS5Padding. You can create this value at command line: > echo -n "" | openssl enc -aes-256-cbc -md sha256 -pass pass: -a """ - secret: String! + secret: String + + """Description of the password. This is optional""" + description: String + + """PEM RSA Private Key Size in bits. Default: 2048 bits""" + keySize: Int = 2048 + + """Public key of the secret. This can be ignored for set operation""" + publicKey: String + + """ + Last modified date of the secret. This can be ignored for set operation + """ + lastModifiedDate: DateTime +} + +input SecretPartialInput { + """ + Identify the password being stored. You may use letters, numbers, dashes, and underscores. + Names that contain spaces or periods are valid, but the resulting stored + password cannot be referenced via context variable. + Names that contain @ or $ are valid, but the resulting stored password cannot be referenced via context variable. + """ + name: String + + """ + Whether this secret can be referred to in policy via context variable ${secpass... + """ + variableReferencable: Boolean + + """ + Base64 encrypted secret. The encryption is compatible with openssl secret encryption + using cypher AES/CBC/PKCS5Padding. You can create this value at command line: + > echo -n "" | openssl enc -aes-256-cbc -md sha256 -pass pass: -a + """ + secret: String """Description of the password. This is optional""" description: String } +type SecretPayload implements EntityMutationPayload { + status: EntityMutationStatus! + detailedStatus: EntityMutationDetailedStatus! + + """The updated secret.""" + secret: Secret +} + +"""Reference input to identify the entity""" +input SecretRefInput { + """The name of the secret""" + name: String! +} + type SecretsPayload implements EntityMutationsPayload { status: [EntityMutationStatus!]! detailedStatus: [EntityMutationDetailedStatus!]! @@ -6049,6 +7515,11 @@ A Server module file. > @l7-identity-fields name > @l7-summary-fields goid,name,checksum > @l7-excluded-fields filePartName, moduleStates, moduleStateSummary +> @l7-name-fields name +> @l7-display-summary-fields name,moduleType,moduleStateSummary +> @l7-encrypted-fields +> @l7-foreign-fields +> @l7-alternative-fields """ type ServerModuleFile { """The goid for the Server module file""" @@ -6077,6 +7548,8 @@ type ServerModuleFile { """The Server module file state per node in the cluster""" moduleStates: [ServerModuleFileState!]! + + """The Server module file state summary""" moduleStateSummary: ServerModuleFileStateSummary! """ @@ -6145,6 +7618,9 @@ input ServiceMappingInstructionInput { } input ServiceRefInput { + """The goid for this service""" + goid: ID + """The resolution path to the service""" resolutionPath: String! @@ -6160,7 +7636,7 @@ A Layer7 service resolution configuration. > @l7-entity > @l7-identity-fields goid > @l7-summary-fields goid,checksum -> @l7-excluded-fields +> @l7-display-summary-fields goid """ type ServiceResolutionConfig { """The internal entity unique identifier""" @@ -6295,7 +7771,9 @@ A simple LDAP based identity provider. > @l7-entity > @l7-identity-fields name > @l7-summary-fields goid,name,checksum -> @l7-excluded-fields +> @l7-name-fields name +> @l7-display-summary-fields name +> @l7-foreign-fields sslClientKeyAlias|alias|Key """ type SimpleLdapIdp { """The internal entity unique identifier""" @@ -6366,7 +7844,10 @@ A siteminder configuration. > @l7-entity smConfig|smConfigs > @l7-identity-fields name > @l7-summary-fields goid,name,checksum -> @l7-excluded-fields +> @l7-name-fields name +> @l7-display-summary-fields name,agentIP,agentHost,enabled +> @l7-encrypted-fields agentSecret +> @l7-foreign-fields securePasswordName|name|Secret """ type SMConfig { """The goid for the CA SSO connection""" @@ -6418,6 +7899,8 @@ type SMConfig { The percentage of servers within a cluster that must be available for Policy Server requests """ clusterFailoverThreshold: PositiveInt! + + """Is non cluster failover""" nonClusterFailover: Boolean! """User name of the CA SSO administrator""" @@ -6557,11 +8040,17 @@ type SoapService implements PublishedService { """Which http methods are allowed if not just POST""" methodsAllowed: [HttpMethod!]! + + """Whether or not the tracing is enabled""" tracingEnabled: Boolean! + + """Whether or not the WSS processing is enabled""" wssProcessingEnabled: Boolean! """Allow requests intended for operations not supported by the WSDL""" laxResolution: Boolean + + """Service properties""" properties: [EntityProperty!] """The WSDL of the soap service""" @@ -6691,6 +8180,13 @@ enum SoapVersion { UNKNOWN } +type SubEntityMetadata { + name: String! + fields: [EntityFieldMetadata!]! + encryptedFields: [String!]! + excludedFields: [String!]! +} + enum Tag { ADMIN } @@ -6803,6 +8299,10 @@ input TrustedCertPartialInput { checksum: String } +""" +Trusted Cert Reference +> @l7-foreign-fields thumbprintSha1|thumbprintSha1|Certificate +""" interface TrustedCertRef { """The name""" name: String @@ -6886,6 +8386,9 @@ input UserMappingInput { """IDP User Reference""" type UserRef { + """The goid of user""" + goid: ID + """The name of user""" name: String @@ -6900,10 +8403,16 @@ type UserRef { """The type of identity provider that the user belongs to""" providerType: IdpType! + + """The description of the User""" + description: String } """IDP User Reference input""" input UserRefInput { + """The goid of user""" + goid: ID + """The name of user""" name: String @@ -6913,6 +8422,9 @@ input UserRefInput { """The DN of user""" subjectDn: String + """The description of user""" + description: String + """The name of identity provider that the user belongs to""" providerName: String! @@ -6920,6 +8432,35 @@ input UserRefInput { providerType: IdpType! } +"""Variable metadata.""" +type VariableMetadata { + """The name of the variable""" + name: String! + + """ + Variable Data type + Supported data types are string, int, dateTime, message, boolean, xml, cert, decimal, float, binary, blob, clob, other." + """ + dataType: String! + + """The configuration checksum""" + checksum: String! + + """ + True if this variable is really a prefixed meta-variable, Ex: 'request.http.header.host' + """ + prefixed: Boolean! + + """True if this variable returns multiple values, false otherwise.""" + multivalued: Boolean! + + """True if this variable is settable, false otherwise.""" + settable: Boolean + + """The name of the new variable that deprecates this variable""" + replacedBy: String +} + """ A Web API service published on the Layer7 Gateway > @l7-entity @@ -6952,8 +8493,14 @@ type WebApiService implements PublishedService { """Which http methods are allowed""" methodsAllowed: [HttpMethod!]! + + """Whether or not the tracing is enabled""" tracingEnabled: Boolean! + + """Whether or not the WSS processing is enabled""" wssProcessingEnabled: Boolean! + + """Service properties""" properties: [EntityProperty!] """The policy and dependencies""" diff --git a/pkg/gateway/config_test.go b/pkg/gateway/config_test.go index 97aa78e7..9706a8c8 100755 --- a/pkg/gateway/config_test.go +++ b/pkg/gateway/config_test.go @@ -356,3 +356,67 @@ func TestRepositoryConfigWithAuthentication(t *testing.T) { t.Errorf("repository config authType %s should be %s", initContainerStaticConfig.Repositories[0].AuthType, "basic") } } + +func TestRepositoryConfigOmitWhenStorageSecretNameEmpty(t *testing.T) { + gateway := securityv1.Gateway{ + ObjectMeta: v1.ObjectMeta{ + Name: "test", + }, + Spec: securityv1.GatewaySpec{ + App: securityv1.App{ + RepositoryReferenceBootstrap: securityv1.RepositoryReferenceBootstrap{Enabled: true}, + }, + }, + Status: securityv1.GatewayStatus{ + RepositoryStatus: []securityv1.GatewayRepositoryStatus{{ + Enabled: true, + Name: "empty-repo", + Type: "static", + StorageSecretName: "", + Branch: "main", + Endpoint: "https://example.com/git", + }}, + }, + } + + configMap := NewConfigMap(&gateway, gateway.Name+"-repository-init-config") + initContainerStaticConfig := InitContainerStaticConfig{} + if err := json.Unmarshal([]byte(configMap.Data["config.json"]), &initContainerStaticConfig); err != nil { + t.Fatalf("failed to unmarshal repository config: %v", err) + } + if len(initContainerStaticConfig.Repositories) != 0 { + t.Errorf("expected no repositories when StorageSecretName is empty, got %d", len(initContainerStaticConfig.Repositories)) + } +} + +func TestRepositoryConfigNamedSecretOmittedWhenCheckerSaysMissing(t *testing.T) { + gateway := securityv1.Gateway{ + ObjectMeta: v1.ObjectMeta{ + Name: "test", + }, + Spec: securityv1.GatewaySpec{ + App: securityv1.App{ + RepositoryReferenceBootstrap: securityv1.RepositoryReferenceBootstrap{Enabled: true}, + }, + }, + Status: securityv1.GatewayStatus{ + RepositoryStatus: []securityv1.GatewayRepositoryStatus{{ + Enabled: true, + Name: "r1", + Type: "static", + StorageSecretName: "missing-secret", + }}, + }, + } + opts := ConfigMapOpts{ + StorageSecretExists: func(string) bool { return false }, + } + configMap := NewConfigMap(&gateway, gateway.Name+"-repository-init-config", opts) + initContainerStaticConfig := InitContainerStaticConfig{} + if err := json.Unmarshal([]byte(configMap.Data["config.json"]), &initContainerStaticConfig); err != nil { + t.Fatalf("failed to unmarshal: %v", err) + } + if len(initContainerStaticConfig.Repositories) != 0 { + t.Errorf("expected checker to omit repository, got %d entries", len(initContainerStaticConfig.Repositories)) + } +} diff --git a/pkg/gateway/configmap.go b/pkg/gateway/configmap.go index a60578ba..4018c18d 100644 --- a/pkg/gateway/configmap.go +++ b/pkg/gateway/configmap.go @@ -22,6 +22,7 @@ * LOST DATA, EVEN IF BROADCOM IS EXPRESSLY ADVISED IN ADVANCE OF THE * POSSIBILITY OF SUCH LOSS OR DAMAGE. * +* AI assistance has been used to generate some or all contents of this file. That includes, but is not limited to, new code, modifying existing code, stylistic edits. */ package gateway @@ -65,8 +66,20 @@ type RepositoryConfig struct { Directories []string `json:"directories,omitempty"` } +// ConfigMapOpts configures optional behavior for NewConfigMap. +type ConfigMapOpts struct { + // StorageSecretExists reports whether the named bundle-cache Secret exists in the cluster. + // When nil, a non-empty StorageSecretName (other than "_") is treated as present for localReference. + // When non-nil and returns false, the repository entry is omitted (aligns with omitted volume mounts). + StorageSecretExists func(secretName string) bool +} + // NewConfigMap -func NewConfigMap(gw *securityv1.Gateway, name string) *corev1.ConfigMap { +func NewConfigMap(gw *securityv1.Gateway, name string, opts ...ConfigMapOpts) *corev1.ConfigMap { + var opt ConfigMapOpts + if len(opts) > 0 { + opt = opts[0] + } javaArgs := strings.Join(gw.Spec.App.Java.ExtraArgs, " ") data := make(map[string]string) jvmHeap := setJVMHeapSize(gw, "", gw.Spec.App.Java.JVMHeap.Percentage) @@ -147,37 +160,45 @@ func NewConfigMap(gw *securityv1.Gateway, name string) *corev1.ConfigMap { initContainerStaticConfig.Version = "2.0" initContainerStaticConfig.PreferGit = gw.Spec.App.RepositoryReferenceBootstrap.PreferGit for i := range gw.Status.RepositoryStatus { - var localRef string if gw.Status.RepositoryStatus[i].Enabled && (gw.Status.RepositoryStatus[i].Type == "static" || gw.Spec.App.RepositoryReferenceBootstrap.Enabled) { /// always default to storage secret if it exists if !gw.Spec.App.Management.Database.Enabled || gw.Status.RepositoryStatus[i].Type == "static" { - if gw.Status.RepositoryStatus[i].StorageSecretName != "_" { - localRef = "/graphman/localref/" + gw.Status.RepositoryStatus[i].StorageSecretName - initContainerStaticConfig.Repositories = append(initContainerStaticConfig.Repositories, RepositoryConfig{ - Name: gw.Status.RepositoryStatus[i].Name, - LocalReference: localRef, - SingletonExtraction: gw.Spec.App.SingletonExtraction, - Directories: gw.Status.RepositoryStatus[i].Directories, - }) - } else { + rs := gw.Status.RepositoryStatus[i] + storageName := rs.StorageSecretName + if storageName == "" { + // Empty git/http repository (no artifacts): omit from graphman-static-init config. + continue + } + if storageName == "_" { // only bootstrap if the Gateway is running in ephemeral mode // bootstrapping large policy sets to database backed gateways causes start up delay initContainerStaticConfig.Repositories = append(initContainerStaticConfig.Repositories, RepositoryConfig{ - Name: gw.Status.RepositoryStatus[i].Name, - Endpoint: gw.Status.RepositoryStatus[i].Endpoint, - Branch: gw.Status.RepositoryStatus[i].Branch, - RemoteName: gw.Status.RepositoryStatus[i].RemoteName, - Type: gw.Status.RepositoryStatus[i].RepoType, - Vendor: gw.Status.RepositoryStatus[i].Vendor, - AuthType: gw.Status.RepositoryStatus[i].AuthType, - Tag: gw.Status.RepositoryStatus[i].Tag, - Auth: "/graphman/secrets/" + gw.Status.RepositoryStatus[i].Name, + Name: rs.Name, + Endpoint: rs.Endpoint, + Branch: rs.Branch, + RemoteName: rs.RemoteName, + Type: rs.RepoType, + Vendor: rs.Vendor, + AuthType: rs.AuthType, + Tag: rs.Tag, + Auth: "/graphman/secrets/" + rs.Name, SingletonExtraction: gw.Spec.App.SingletonExtraction, - StateStoreReference: gw.Status.RepositoryStatus[i].StateStoreReference, - StateStoreKey: gw.Status.RepositoryStatus[i].StateStoreKey, - Directories: gw.Status.RepositoryStatus[i].Directories, + StateStoreReference: rs.StateStoreReference, + StateStoreKey: rs.StateStoreKey, + Directories: rs.Directories, }) + continue + } + if opt.StorageSecretExists != nil && !opt.StorageSecretExists(storageName) { + continue } + localRef := "/graphman/localref/" + storageName + initContainerStaticConfig.Repositories = append(initContainerStaticConfig.Repositories, RepositoryConfig{ + Name: rs.Name, + LocalReference: localRef, + SingletonExtraction: gw.Spec.App.SingletonExtraction, + Directories: rs.Directories, + }) } } } diff --git a/pkg/gateway/deployment.go b/pkg/gateway/deployment.go index 4a4709ba..1cfe7ac0 100644 --- a/pkg/gateway/deployment.go +++ b/pkg/gateway/deployment.go @@ -99,6 +99,12 @@ func NewDeployment(gw *securityv1.Gateway, platform string) *appsv1.Deployment { readinessProbe = gw.Spec.App.ReadinessProbe } + var startupProbe *corev1.Probe + if gw.Spec.App.StartupProbe != (corev1.Probe{}) { + sp := gw.Spec.App.StartupProbe + startupProbe = &sp + } + terminationGracePeriodSeconds := int64(30) if gw.Spec.App.TerminationGracePeriodSeconds != 0 { terminationGracePeriodSeconds = gw.Spec.App.TerminationGracePeriodSeconds @@ -881,12 +887,12 @@ func NewDeployment(gw *securityv1.Gateway, platform string) *appsv1.Deployment { }) } initContainers = append(initContainers, corev1.Container{ - Name: "otk-install-init", - Image: otkInitContainerImage, - ImagePullPolicy: otkInitContainerImagePullPolicy, - SecurityContext: &otkInitContainerSecurityContext, - VolumeMounts: otkInitContainerVolumeMounts, - EnvFrom: otkInstallEnvFrom, + Name: "otk-install-init", + Image: otkInitContainerImage, + ImagePullPolicy: otkInitContainerImagePullPolicy, + SecurityContext: &otkInitContainerSecurityContext, + VolumeMounts: otkInitContainerVolumeMounts, + EnvFrom: otkInstallEnvFrom, TerminationMessagePath: corev1.TerminationMessagePathDefault, TerminationMessagePolicy: corev1.TerminationMessageReadFile, }) @@ -966,6 +972,7 @@ func NewDeployment(gw *securityv1.Gateway, platform string) *appsv1.Deployment { Ports: ports, LivenessProbe: &livenessProbe, ReadinessProbe: &readinessProbe, + StartupProbe: startupProbe, Resources: resources, Lifecycle: &lifecycleHooks, } diff --git a/pkg/gateway/deployment_test.go b/pkg/gateway/deployment_test.go index 3d9dd4f6..949d4b69 100755 --- a/pkg/gateway/deployment_test.go +++ b/pkg/gateway/deployment_test.go @@ -1,12 +1,66 @@ package gateway import ( + "reflect" "testing" securityv1 "github.com/caapim/layer7-operator/api/v1" corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/util/intstr" ) +func gatewayForDeploymentProbeTest() securityv1.Gateway { + gw := getGatewayWitApp() + gw.Name = "test" + gw.Namespace = "testNamespace" + gw.Spec.App.Image = "gateway:test" + gw.Spec.App.Replicas = 1 + gw.Spec.App.ServiceAccount.Name = "testServiceAccount" + gw.Spec.App.ServiceAccount.Create = true + gw.Spec.App.PodSecurityContext = corev1.PodSecurityContext{} + gw.Spec.License.SecretName = "license-secret" + ports := securityv1.Ports{} + ports.Name = "https" + ports.Port = 8443 + ports.TargetPort = 8443 + ports.Protocol = "TCP" + gw.Spec.App.Service = securityv1.Service{} + gw.Spec.App.Service.Ports = []securityv1.Ports{ports} + return gw +} + +func TestDeploymentStartupProbe(t *testing.T) { + t.Run("omitted leaves StartupProbe nil", func(t *testing.T) { + gw := gatewayForDeploymentProbeTest() + dep := NewDeployment(&gw, "kubernetes") + c := dep.Spec.Template.Spec.Containers[0] + if c.StartupProbe != nil { + t.Fatalf("StartupProbe: want nil, got %+v", c.StartupProbe) + } + }) + t.Run("set when spec defines StartupProbe", func(t *testing.T) { + gw := gatewayForDeploymentProbeTest() + want := corev1.Probe{ + ProbeHandler: corev1.ProbeHandler{ + HTTPGet: &corev1.HTTPGetAction{ + Path: "/health", + Port: intstr.FromInt32(8443), + }, + }, + FailureThreshold: 18, + } + gw.Spec.App.StartupProbe = want + dep := NewDeployment(&gw, "kubernetes") + c := dep.Spec.Template.Spec.Containers[0] + if c.StartupProbe == nil { + t.Fatal("StartupProbe: want non-nil") + } + if !reflect.DeepEqual(*c.StartupProbe, want) { + t.Errorf("StartupProbe mismatch\nwant: %+v\ngot: %+v", want, *c.StartupProbe) + } + }) +} + func TestDeploymentWithPorts(t *testing.T) { gateway := getGatewayWitApp() gateway.Name = "test" diff --git a/pkg/gateway/ingress.go b/pkg/gateway/ingress.go index cb3c35f1..680db185 100644 --- a/pkg/gateway/ingress.go +++ b/pkg/gateway/ingress.go @@ -84,6 +84,14 @@ func NewIngress(gw *securityv1.Gateway) *networkingv1.Ingress { } ls := util.DefaultLabels(gw.Name, gw.Spec.App.Labels) + spec := networkingv1.IngressSpec{ + TLS: tls, + Rules: rules, + } + if ingressClassName != "" { + name := ingressClassName + spec.IngressClassName = &name + } ingress := &networkingv1.Ingress{ ObjectMeta: metav1.ObjectMeta{ Name: gw.Name, @@ -95,11 +103,7 @@ func NewIngress(gw *securityv1.Gateway) *networkingv1.Ingress { APIVersion: "networking.k8s.io/v1", Kind: "Ingress", }, - Spec: networkingv1.IngressSpec{ - IngressClassName: &ingressClassName, - TLS: tls, - Rules: rules, - }, + Spec: spec, } return ingress } diff --git a/pkg/gateway/ingress_test.go b/pkg/gateway/ingress_test.go index 864b6a3a..dc8ba1b9 100755 --- a/pkg/gateway/ingress_test.go +++ b/pkg/gateway/ingress_test.go @@ -31,3 +31,23 @@ func TestNewIngress(t *testing.T) { } } + +func TestNewIngress_emptyIngressClassNameIsNil(t *testing.T) { + gw := securityv1.Gateway{} + gw.Name = "test" + gw.Namespace = "default" + gw.Spec.App.Ingress = securityv1.Ingress{ + Enabled: true, + IngressClassName: "", + Rules: []networkingv1.IngressRule{{Host: "example.com"}}, + } + gw.Spec.App.Service = securityv1.Service{ + Enabled: true, + Type: "ClusterIP", + Ports: []securityv1.Ports{{Port: 8443, TargetPort: 8443, Protocol: "TCP", Name: "https"}}, + } + ing := NewIngress(&gw) + if ing.Spec.IngressClassName != nil { + t.Fatalf("expected nil IngressClassName when empty, got %#v", ing.Spec.IngressClassName) + } +} diff --git a/pkg/gateway/reconcile/configmap.go b/pkg/gateway/reconcile/configmap.go index 46ecacd7..01cf16dd 100644 --- a/pkg/gateway/reconcile/configmap.go +++ b/pkg/gateway/reconcile/configmap.go @@ -14,10 +14,20 @@ import ( ) func ConfigMaps(ctx context.Context, params Params) error { + repositoryInitOpts := gateway.ConfigMapOpts{ + StorageSecretExists: func(name string) bool { + ok, err := storageSecretAvailable(ctx, params, name) + if err != nil { + params.Log.V(2).Info("storage secret check failed for repository init config", "secret", name, "error", err.Error()) + return false + } + return ok + }, + } desiredConfigMaps := []*corev1.ConfigMap{ gateway.NewConfigMap(params.Instance, params.Instance.Name), gateway.NewConfigMap(params.Instance, params.Instance.Name+"-system"), - gateway.NewConfigMap(params.Instance, params.Instance.Name+"-repository-init-config"), + gateway.NewConfigMap(params.Instance, params.Instance.Name+"-repository-init-config", repositoryInitOpts), gateway.NewConfigMap(params.Instance, params.Instance.Name+"-gateway-files"), } diff --git a/pkg/gateway/reconcile/deployment.go b/pkg/gateway/reconcile/deployment.go index bd1166e5..81d6ea17 100644 --- a/pkg/gateway/reconcile/deployment.go +++ b/pkg/gateway/reconcile/deployment.go @@ -448,6 +448,25 @@ func setStateStoreConfig(ctx context.Context, params Params, dep *appsv1.Deploym return dep, nil } +// storageSecretAvailable returns whether the repository bundle-cache Secret exists in the namespace. +// When it does not exist yet, omit the volume so the pod does not fail mounting a missing Secret. +func storageSecretAvailable(ctx context.Context, params Params, name string) (bool, error) { + if name == "" || name == "_" { + return false, nil + } + var secret corev1.Secret + err := params.Client.Get(ctx, types.NamespacedName{Name: name, Namespace: params.Instance.Namespace}, &secret) + if k8serrors.IsNotFound(err) { + params.Log.V(2).Info("storage secret not found, omitting volume mount until it exists", + "secret", name, "namespace", params.Instance.Namespace) + return false, nil + } + if err != nil { + return false, fmt.Errorf("get storage secret %s/%s: %w", params.Instance.Namespace, name, err) + } + return true, nil +} + func setGmanInitContainerVolumeMounts(ctx context.Context, params Params, dep *appsv1.Deployment) (*appsv1.Deployment, error) { var ( @@ -466,29 +485,35 @@ func setGmanInitContainerVolumeMounts(ctx context.Context, params Params, dep *a // these secrets are managed by the Repository controller. // if the storageSecret is available we don't need to mount the secrets. if repoRef.StorageSecretName != "" && repoRef.StorageSecretName != "_" { - gmanInitContainerVolumeMounts = append(gmanInitContainerVolumeMounts, corev1.VolumeMount{ - Name: repoRef.StorageSecretName, - MountPath: "/graphman/localref/" + repoRef.StorageSecretName, - }) - - existingVolume := false - for _, v := range dep.Spec.Template.Spec.Volumes { - if v.Name == repoRef.StorageSecretName { - existingVolume = true - } + ok, err := storageSecretAvailable(ctx, params, repoRef.StorageSecretName) + if err != nil { + return nil, err } - - if !existingVolume { - dep.Spec.Template.Spec.Volumes = append(dep.Spec.Template.Spec.Volumes, corev1.Volume{ - Name: repoRef.StorageSecretName, - VolumeSource: corev1.VolumeSource{Secret: &corev1.SecretVolumeSource{ - SecretName: repoRef.StorageSecretName, - DefaultMode: &defaultMode, - Optional: &optional, - }}, + if ok { + gmanInitContainerVolumeMounts = append(gmanInitContainerVolumeMounts, corev1.VolumeMount{ + Name: repoRef.StorageSecretName, + MountPath: "/graphman/localref/" + repoRef.StorageSecretName, }) + + existingVolume := false + for _, v := range dep.Spec.Template.Spec.Volumes { + if v.Name == repoRef.StorageSecretName { + existingVolume = true + } + } + + if !existingVolume { + dep.Spec.Template.Spec.Volumes = append(dep.Spec.Template.Spec.Volumes, corev1.Volume{ + Name: repoRef.StorageSecretName, + VolumeSource: corev1.VolumeSource{Secret: &corev1.SecretVolumeSource{ + SecretName: repoRef.StorageSecretName, + DefaultMode: &defaultMode, + Optional: &optional, + }}, + }) + } } - } else { + } else if repoRef.StorageSecretName == "_" { if repoRef.SecretName != "" { gmanInitContainerVolumeMounts = append(gmanInitContainerVolumeMounts, corev1.VolumeMount{ Name: repoRef.SecretName, @@ -513,6 +538,7 @@ func setGmanInitContainerVolumeMounts(ctx context.Context, params Params, dep *a } } } + // StorageSecretName == "": empty repository — nothing in config.json; skip mounts. } } @@ -538,30 +564,36 @@ func setGmanInitContainerVolumeMounts(ctx context.Context, params Params, dep *a // available as an existing Kubernetes secret which reduces reliance on an external Git repository for Gateway boot. // these secrets are managed by the Repository controller. // if the storageSecret is available we don't need to mount the secrets. - if repo.Status.StorageSecretName != "_" { - gmanInitContainerVolumeMounts = append(gmanInitContainerVolumeMounts, corev1.VolumeMount{ - Name: repo.Status.StorageSecretName, - MountPath: "/graphman/localref/" + repo.Status.StorageSecretName, - }) + if repo.Status.StorageSecretName != "" && repo.Status.StorageSecretName != "_" { + ok, err := storageSecretAvailable(ctx, params, repo.Status.StorageSecretName) + if err != nil { + return nil, err + } + if ok { + gmanInitContainerVolumeMounts = append(gmanInitContainerVolumeMounts, corev1.VolumeMount{ + Name: repo.Status.StorageSecretName, + MountPath: "/graphman/localref/" + repo.Status.StorageSecretName, + }) - existingVolume := false - for _, v := range dep.Spec.Template.Spec.Volumes { - if v.Name == repo.Status.StorageSecretName { - existingVolume = true + existingVolume := false + for _, v := range dep.Spec.Template.Spec.Volumes { + if v.Name == repo.Status.StorageSecretName { + existingVolume = true + } } - } - if !existingVolume { - dep.Spec.Template.Spec.Volumes = append(dep.Spec.Template.Spec.Volumes, corev1.Volume{ - Name: repo.Status.StorageSecretName, - VolumeSource: corev1.VolumeSource{Secret: &corev1.SecretVolumeSource{ - SecretName: repo.Status.StorageSecretName, - DefaultMode: &defaultMode, - Optional: &optional, - }}, - }) + if !existingVolume { + dep.Spec.Template.Spec.Volumes = append(dep.Spec.Template.Spec.Volumes, corev1.Volume{ + Name: repo.Status.StorageSecretName, + VolumeSource: corev1.VolumeSource{Secret: &corev1.SecretVolumeSource{ + SecretName: repo.Status.StorageSecretName, + DefaultMode: &defaultMode, + Optional: &optional, + }}, + }) + } } - } else { + } else if repo.Status.StorageSecretName == "_" { secretName := repo.Name if repo.Spec.Auth.ExistingSecretName != "" { diff --git a/pkg/gateway/reconcile/gateway.go b/pkg/gateway/reconcile/gateway.go index 28b9a6e2..71639df2 100644 --- a/pkg/gateway/reconcile/gateway.go +++ b/pkg/gateway/reconcile/gateway.go @@ -37,8 +37,10 @@ import ( "fmt" "net" "os" + "path/filepath" "reflect" "regexp" + "slices" "strconv" "strings" "time" @@ -236,6 +238,18 @@ func NewGwUpdateRequest(ctx context.Context, gateway *securityv1.Gateway, params } } + // Only skip when Ready: before sync completes, an empty bundle may mean "not materialized yet", not "empty repo". + if !gwUpdReq.delete && gwUpdReq.repository.Status.Ready && util.GraphmanBundleBytesHaveNoEntities(gwUpdReq.bundle) { + params.Log.Info("repository is ready but bundle has no graphman entities. skipping apply to gateway", + "gateway", gwUpdReq.gateway.Name, + "gatewayNamespace", gwUpdReq.gateway.Namespace, + "repository", gwUpdReq.repository.Name, + "repositoryNamespace", gwUpdReq.repository.Namespace, + "repositoryReference", gwUpdReq.repositoryReference.Name, + "commit", gwUpdReq.repository.Status.Commit) + return nil, nil + } + gwUpdReq.graphmanEncryptionPassphrase = graphmanEncryptionPassphrase gwUpdReq.cacheEntry = gwUpdReq.repositoryReference.Name + "-" + gwUpdReq.checksum @@ -296,8 +310,8 @@ func NewGwUpdateRequest(ctx context.Context, gateway *securityv1.Gateway, params gwUpdReq.bundleName = string(gwUpdReq.bundleType) case BundleTypeListenPort: refreshOnKeyChanges := false - checksum := "" var bundleBytes []byte + var checksum string if gateway.Spec.App.ListenPorts.Custom.Enabled { if gateway.Spec.App.ListenPorts.RefreshOnKeyChanges { @@ -321,17 +335,33 @@ func NewGwUpdateRequest(ctx context.Context, gateway *securityv1.Gateway, params return nil, err } + excludedFromDynamicSync := util.ListenPortNamesExcludedFromGraphmanSync(gateway, gwUpdReq.graphmanPort) + util.FilterListenPortBundleForGraphmanSync(&bundle, gwUpdReq.graphmanPort) + if len(excludedFromDynamicSync) > 0 { + omitted := make([]string, 0, len(excludedFromDynamicSync)) + for n := range excludedFromDynamicSync { + omitted = append(omitted, n) + } + slices.Sort(omitted) + params.Log.V(2).Info("stripped listen ports matching graphman dynamic sync port from dynamic listen-port bundle", + "gateway", gateway.Name, + "namespace", gateway.Namespace, + "graphmanPort", gwUpdReq.graphmanPort, + "omittedListenPorts", omitted, + ) + } + notFound := []string{} if !gwUpdReq.delete { for _, slistenPort := range params.Instance.Status.LastAppliedListenPorts { found := false + if _, excluded := excludedFromDynamicSync[slistenPort]; excluded { + found = true + } for _, listenPort := range bundle.ListenPorts { if listenPort.Name == slistenPort { found = true - } - // anti-lockout - if listenPort.Name == slistenPort && listenPort.Port == gwUpdReq.graphmanPort { - found = true + break } } if !found { @@ -368,6 +398,8 @@ func NewGwUpdateRequest(ctx context.Context, gateway *securityv1.Gateway, params gwUpdReq.graphmanEncryptionPassphrase = "" gwUpdReq.patchAnnotation = "security.brcmlabs.com/" + params.Instance.Name + "-listen-port-bundle" + // Checksum must match bootstrap/configmap (full bundle including Graphman port). The apply + // payload may omit that port dynamically; checksum still reflects the bootstrapped spec. gwUpdReq.checksum = checksum gwUpdReq.cacheEntry = gateway.Name + "-" + string(gwUpdReq.bundleType) + "-" + gwUpdReq.checksum gwUpdReq.bundleName = string(gwUpdReq.bundleType) @@ -408,31 +440,56 @@ func NewGwUpdateRequest(ctx context.Context, gateway *securityv1.Gateway, params certSecretMap := []util.GraphmanCert{} if externalCert.Enabled { - secret, err := getGatewaySecret(ctx, params, externalCert.Name) - if err != nil { - return nil, err - } - for _, v := range secret.Data { - if !strings.Contains(string(v), "-----BEGIN CERTIFICATE-----") { - continue - } + var certPEMData []string - trustedFor := []string{} - for i := range externalCert.TrustedFor { - trustedFor = append(trustedFor, string(externalCert.TrustedFor[i])) + switch strings.ToLower(externalCert.Type) { + case "configmap": + cm, err := getGatewayConfigMap(ctx, params, externalCert.Name) + if err != nil { + return nil, err } + for _, v := range cm.Data { + if strings.Contains(v, "-----BEGIN CERTIFICATE-----") { + certPEMData = append(certPEMData, v) + } + } + dataBytes, _ := json.Marshal(&cm.Data) + h := sha1.New() + h.Write(dataBytes) + sha1Sum = fmt.Sprintf("%x", h.Sum(nil)) + default: + secret, err := getGatewaySecret(ctx, params, externalCert.Name) + if err != nil { + return nil, err + } + for _, v := range secret.Data { + if strings.Contains(string(v), "-----BEGIN CERTIFICATE-----") { + certPEMData = append(certPEMData, string(v)) + } + } + dataBytes, _ := json.Marshal(&secret.Data) + h := sha1.New() + h.Write(dataBytes) + sha1Sum = fmt.Sprintf("%x", h.Sum(nil)) + } + + trustedFor := []string{} + for i := range externalCert.TrustedFor { + trustedFor = append(trustedFor, string(externalCert.TrustedFor[i])) + } - crtStrings := strings.SplitAfter(string(v), "-----END CERTIFICATE-----") + revocationCheckPolicyType := string(graphman.PolicyUsageTypeUseDefault) + if externalCert.RevocationCheckPolicyType != "" { + revocationCheckPolicyType = string(graphman.PolicyUsageType(externalCert.RevocationCheckPolicyType)) + } + + for _, pemStr := range certPEMData { + crtStrings := strings.SplitAfter(pemStr, "-----END CERTIFICATE-----") crtStrings = crtStrings[:len(crtStrings)-1] for crt := range crtStrings { b, _ := pem.Decode([]byte(crtStrings[crt])) crtX509, _ := x509.ParseCertificate(b.Bytes) - revocationCheckPolicyType := string(graphman.PolicyUsageTypeUseDefault) - if externalCert.RevocationCheckPolicyType == "" { - revocationCheckPolicyType = string(graphman.PolicyUsageType(externalCert.RevocationCheckPolicyType)) - } - gmanCert := util.GraphmanCert{ Name: crtX509.Subject.CommonName, Crt: crtStrings[crt], @@ -445,11 +502,6 @@ func NewGwUpdateRequest(ctx context.Context, gateway *securityv1.Gateway, params certSecretMap = append(certSecretMap, gmanCert) } } - - dataBytes, _ := json.Marshal(&secret.Data) - h := sha1.New() - h.Write(dataBytes) - sha1Sum = fmt.Sprintf("%x", h.Sum(nil)) } notFound := []string{} @@ -920,8 +972,24 @@ func buildDeleteBundle(repository *securityv1.Repository, repoRef *securityv1.Re return bundleBytes, nil } -// checkRetryScenario checks if we should retry the last applied bundle due to previous failure +// commitMarkerPresent reports whether tmpPath contains a commit marker file for the given SHA +// (.txt). The marker is written after a bundle for that commit is built and persisted +// (see writeBundlesToDisk). Used by checkRetryScenario. +func commitMarkerPresent(tmpPath, commit string) bool { + _, err := os.Stat(filepath.Join(tmpPath, commit+".txt")) + return err == nil +} + +// checkRetryScenario checks if we should retry the last applied bundle due to previous failure. +// Retrying requires a commit marker file (.txt): it is written only after a bundle for that +// SHA has been built and persisted under tmpPath (see writeBundlesToDisk). Without it—e.g. a new +// git commit whose bundle was never completed—do not short-circuit with last_applied JSON from an +// older build even if gateway status still shows failure and repoStatus.Commit matches the new SHA. func checkRetryScenario(gateway *securityv1.Gateway, repoRefName string, currentCommit string, tmpPath string, params Params) (shouldRetry bool, bundle []byte) { + if !commitMarkerPresent(tmpPath, currentCommit) { + return false, nil + } + // Check gateway status for apply failures for this repository for _, repoStatus := range gateway.Status.RepositoryStatus { if repoStatus.Name == repoRefName { @@ -930,10 +998,9 @@ func checkRetryScenario(gateway *securityv1.Gateway, repoRefName string, current // Look for failures in the reason field reasonLower := strings.ToLower(condition.Reason) if (strings.Contains(reasonLower, "failed") || strings.Contains(reasonLower, "error")) && condition.Status != "success" { - // Found a failure - check if commit has changed + // Same commit as current repository SHA and marker exists: may retry last_applied if repoStatus.Commit == currentCommit { - // Commit unchanged, this is a retry scenario - lastAppliedFile := tmpPath + "/last_applied_" + repoRefName + ".json" + lastAppliedFile := filepath.Join(tmpPath, "last_applied_"+repoRefName+".json") if bundleBytes, err := os.ReadFile(lastAppliedFile); err == nil { params.Log.V(2).Info("retry scenario detected - using last applied bundle", "repository", repoRefName, @@ -956,32 +1023,33 @@ func checkRetryScenario(gateway *securityv1.Gateway, repoRefName string, current // determineCacheLocation returns the cache path and filename based on repository and gateway configuration func determineCacheLocation(repository *securityv1.Repository, gateway *securityv1.Gateway) (cachePath string, cacheFileName string) { - // Local and HTTP repos always use vanilla bundles (no operator-generated delete mappings) + // Local and HTTP repos use per-commit snapshot JSON only (no operator-generated delete mappings on the gateway) if repository.Spec.Type == securityv1.RepositoryTypeLocal || repository.Spec.Type == securityv1.RepositoryTypeHttp { - cachePath = "/tmp/repo-cache/" + repository.Name + cachePath = util.RepoCacheDir(repository.Name, repository.Namespace) cacheFileName = repository.Status.Commit + ".json" return cachePath, cacheFileName } if repository.Spec.StateStoreReference != "" { // Statestore-backed repository - cachePath = "/tmp/statestore/" + repository.Name + cachePath = util.StateStoreCacheDir(repository.Name, repository.Namespace) cacheFileName = "latest.json" } else if gateway.Spec.App.RepositoryReferenceDelete.Enabled && gateway.Spec.App.RepositoryReferenceDelete.IncludeEfs { // Non-statestore with delete enabled - cachePath = "/tmp/repo-cache/" + repository.Name + cachePath = util.RepoCacheDir(repository.Name, repository.Namespace) cacheFileName = "combined.json" } else { - // Non-statestore with delete disabled (vanilla) - cachePath = "/tmp/repo-cache/" + repository.Name + // Non-statestore with delete disabled: per-commit snapshot JSON + cachePath = util.RepoCacheDir(repository.Name, repository.Namespace) cacheFileName = repository.Status.Commit + ".json" } return cachePath, cacheFileName } -// shouldSkipDeltaComparison determines if we should skip delta comparison and build a vanilla bundle +// shouldSkipDeltaComparison is true when the gateway should not compute inter-commit / inter-directory +// deltas (graphman.CalculateDelta); the bundle is taken from cache as-is instead. func shouldSkipDeltaComparison(gateway *securityv1.Gateway, repository *securityv1.Repository) bool { - // Local and HTTP repos are ALWAYS vanilla (no delta comparison) + // Local and HTTP repos never use gateway-side delta comparison if repository.Spec.Type == securityv1.RepositoryTypeLocal || repository.Spec.Type == securityv1.RepositoryTypeHttp { return true } @@ -999,12 +1067,12 @@ func shouldSkipDeltaComparison(gateway *securityv1.Gateway, repository *security return false } -// buildVanillaBundleAndCache builds a vanilla bundle from cache and stores it -func buildVanillaBundleAndCache(repository *securityv1.Repository, repoRef *securityv1.RepositoryReference, gateway *securityv1.Gateway, cachePath string, cacheFileName string, tmpPath string, fileName string, params Params) ([]byte, error) { +// buildAndPersistBundleFromCache loads the repository bundle from disk cache and writes it via writeBundlesToDisk. +func buildAndPersistBundleFromCache(repository *securityv1.Repository, repoRef *securityv1.RepositoryReference, gateway *securityv1.Gateway, cachePath string, cacheFileName string, tmpPath string, fileName string, params Params) ([]byte, error) { // Build bundle from cache bundleBytes, err := buildBundleFromCache(repository, repoRef, cachePath, cacheFileName) if err != nil { - return nil, fmt.Errorf("failed to build vanilla bundle: %w", err) + return nil, fmt.Errorf("failed to build bundle from cache: %w", err) } // Write to cache and last_applied @@ -1207,6 +1275,10 @@ func handleDirectoryChange(ctx context.Context, params Params, repository *secur combinedBundle.Properties.Mappings.Roles = append(combinedBundle.Properties.Mappings.Roles, repoDeleteMappings.Roles...) combinedBundle.Properties.Mappings.GenericEntities = append(combinedBundle.Properties.Mappings.GenericEntities, repoDeleteMappings.GenericEntities...) combinedBundle.Properties.Mappings.AuditConfigurations = append(combinedBundle.Properties.Mappings.AuditConfigurations, repoDeleteMappings.AuditConfigurations...) + combinedBundle.Properties.Mappings.PolicyBackedServices = append(combinedBundle.Properties.Mappings.PolicyBackedServices, repoDeleteMappings.PolicyBackedServices...) + combinedBundle.Properties.Mappings.PolicyAliases = append(combinedBundle.Properties.Mappings.PolicyAliases, repoDeleteMappings.PolicyAliases...) + combinedBundle.Properties.Mappings.ServiceAliases = append(combinedBundle.Properties.Mappings.ServiceAliases, repoDeleteMappings.ServiceAliases...) + combinedBundle.Properties.Mappings.SampleMessages = append(combinedBundle.Properties.Mappings.SampleMessages, repoDeleteMappings.SampleMessages...) params.Log.V(2).Info("merged repository DELETE mappings with directory delta", "repository", repoRef.Name, @@ -1285,9 +1357,9 @@ func handleCommitChange(ctx context.Context, params Params, repository *security return newBundleBytes, nil } - // Step 3: For {commit}.json (vanilla bundles), just write and return + // Step 3: For {commit}.json (commit snapshot, no gateway-side delta), write and return // User controls all mappings explicitly - no operator-generated deletes - params.Log.V(2).Info("commit change with vanilla bundle - no delta calculation", + params.Log.V(2).Info("commit change using commit snapshot without gateway-side delta", "repository", repoRef.Name, "commit", repository.Status.Commit) @@ -1370,7 +1442,7 @@ func writeBundlesToDisk(repository *securityv1.Repository, repoRef *securityv1.R } func buildBundle(ctx context.Context, params Params, repoRef *securityv1.RepositoryReference, repository *securityv1.Repository, gateway *securityv1.Gateway, delete bool) (bundleBytes []byte, err error) { - tmpPath := "/tmp/bundles/" + repository.Name + tmpPath := util.GatewayBundleWorkDir(repository.Name, repository.Namespace) fileName := calculateBundleFileName(params.Instance, repoRef.Name, repoRef.Directories) // Ensure temp directory exists @@ -1395,10 +1467,10 @@ func buildBundle(ctx context.Context, params Params, repoRef *securityv1.Reposit cachePath, cacheFileName := determineCacheLocation(repository, gateway) params.Log.V(5).Info("using cache", "cachePath", cachePath, "cacheFileName", cacheFileName, "repository", repoRef.Name) - // Step 4: Check if we should skip delta comparison (vanilla bundle) + // Step 4: When gateway-side delta comparison is disabled, load from cache and persist only if shouldSkipDeltaComparison(gateway, repository) { - params.Log.V(5).Info("skipping delta comparison, building vanilla bundle", "repository", repoRef.Name) - return buildVanillaBundleAndCache(repository, repoRef, gateway, cachePath, cacheFileName, tmpPath, fileName, params) + params.Log.V(5).Info("building bundle from cache without gateway-side delta comparison", "repository", repoRef.Name) + return buildAndPersistBundleFromCache(repository, repoRef, gateway, cachePath, cacheFileName, tmpPath, fileName, params) } // Step 5: Check if commit changed @@ -1445,16 +1517,16 @@ func buildBundle(ctx context.Context, params Params, repoRef *securityv1.Reposit params.Log.V(2).Info("handling directory change with reconciliation", "repository", repoRef.Name) return handleDirectoryChange(ctx, params, repository, repoRef, gateway, cachePath, cacheFileName, tmpPath, fileName, previousDirectories) } else if directoryChanged && !gateway.Spec.App.RepositoryReferenceDelete.ReconcileDirectoryChanges { - params.Log.V(5).Info("directory changed but reconciliation disabled, building vanilla bundle", "repository", repoRef.Name) - return buildVanillaBundleAndCache(repository, repoRef, gateway, cachePath, cacheFileName, tmpPath, fileName, params) + params.Log.V(5).Info("directory changed but reconciliation disabled; persisting bundle from cache without delta", "repository", repoRef.Name) + return buildAndPersistBundleFromCache(repository, repoRef, gateway, cachePath, cacheFileName, tmpPath, fileName, params) } else if newCommit { params.Log.V(2).Info("handling commit change", "repository", repoRef.Name, "commit", repository.Status.Commit) return handleCommitChange(ctx, params, repository, repoRef, gateway, cachePath, cacheFileName, tmpPath, fileName) } - // Fallback: build vanilla bundle - params.Log.V(5).Info("building vanilla bundle (fallback)", "repository", repoRef.Name) - return buildVanillaBundleAndCache(repository, repoRef, gateway, cachePath, cacheFileName, tmpPath, fileName, params) + // Fallback: persist bundle from cache without gateway-side delta + params.Log.V(5).Info("fallback: persisting repository bundle from cache", "repository", repoRef.Name) + return buildAndPersistBundleFromCache(repository, repoRef, gateway, cachePath, cacheFileName, tmpPath, fileName, params) } // calculateBundleFileName generates a unique filename based on directories and commit @@ -1563,24 +1635,6 @@ func buildBundleFromDirectories(directories []string, bundleMap map[string][]byt return bundleBytes, nil } -// buildBundleFromStorageSecret reads bundles from storage secret when cache is not available -func buildBundleFromStorageSecret(ctx context.Context, repository *securityv1.Repository, repoRef *securityv1.RepositoryReference, params Params) ([]byte, error) { - storageSecret, err := getGatewaySecret(ctx, params, repository.Status.StorageSecretName) - if err != nil { - return nil, fmt.Errorf("failed to read storage secret: %w", err) - } - - // Storage secret Data contains the same bundleMap structure as the cache - // If requesting all directories, concatenate everything - if len(repoRef.Directories) == 1 && repoRef.Directories[0] == "/" { - return util.ConcatBundles(storageSecret.Data) - } - - // Otherwise, filter by specific directories - // For storage secret, we preserve user-defined mappings (not repository-controlled) - return buildBundleFromDirectories(repoRef.Directories, storageSecret.Data, false) -} - // cleanupOldBundles removes bundles older than 10 days func cleanupOldBundles(tmpPath string) { existingBundles, err := os.ReadDir(tmpPath) @@ -1604,13 +1658,13 @@ func checkLocalRepoOnFs(params Params, repository *securityv1.Repository) (bool, // Check if pre-built bundle cache exists var cachePath string if repository.Spec.StateStoreReference != "" { - cachePath = "/tmp/statestore/" + repository.Name + cachePath = util.StateStoreCacheDir(repository.Name, repository.Namespace) fileName := "latest.json" if _, err := os.Stat(cachePath + "/" + fileName); err == nil { return true, nil } } else { - cachePath = "/tmp/repo-cache/" + repository.Name + cachePath = util.RepoCacheDir(repository.Name, repository.Namespace) fileName := repository.Status.Commit + ".json" if _, err := os.Stat(cachePath + "/" + fileName); err == nil { // Pre-built bundle cache exists, can use it @@ -1621,7 +1675,7 @@ func checkLocalRepoOnFs(params Params, repository *securityv1.Repository) (bool, // If no cache, check if raw repository exists on filesystem if repository.Spec.StateStoreReference != "" { // For state store repos, check if state store path exists - stateStorePath := "/tmp/statestore/" + repository.Name + stateStorePath := util.StateStoreCacheDir(repository.Name, repository.Namespace) if _, err := os.Stat(stateStorePath); err == nil { return true, nil } @@ -1727,42 +1781,33 @@ func updateGatewayDeployment(ctx context.Context, params Params, gwUpdReq *Gatew patch := string(patchBytes) if ready && update { + graphmanOp := "apply" + if gwUpdReq.delete { + graphmanOp = "remove" + } requestCacheEntry := gwUpdReq.deployment.Name + "-" + gwUpdReq.cacheEntry syncRequest, err := syncCache.Read(requestCacheEntry) if err != nil { - params.Log.V(5).Info("request has not been attempted or cache was flushed", "type", string(gwUpdReq.bundleType), "bundle", gwUpdReq.bundleName, "deployment", gwUpdReq.deployment.Name, "name", gwUpdReq.gateway.Name, "namespace", gwUpdReq.gateway.Namespace) + params.Log.V(5).Info("graphman sync cache miss or flushed", "bundleType", string(gwUpdReq.bundleType), "bundleName", gwUpdReq.bundleName, "deployment", gwUpdReq.deployment.Name, "gateway", gwUpdReq.gateway.Name, "gatewayNamespace", gwUpdReq.gateway.Namespace) } if syncRequest.Attempts > 0 { - params.Log.V(5).Info("request has been attempted in the last 3 seconds, backing off", "type", string(gwUpdReq.bundleType), "bundle", gwUpdReq.bundleName, "deployment", gwUpdReq.deployment.Name, "name", gwUpdReq.gateway.Name, "namespace", gwUpdReq.gateway.Namespace) + params.Log.V(5).Info("graphman request backing off", "bundleType", string(gwUpdReq.bundleType), "bundleName", gwUpdReq.bundleName, "deployment", gwUpdReq.deployment.Name, "gateway", gwUpdReq.gateway.Name, "gatewayNamespace", gwUpdReq.gateway.Namespace) return errors.New("request has been attempted in the last 3 seconds, backing off") } syncCache.Update(util.SyncRequest{RequestName: requestCacheEntry, Attempts: 1}, time.Now().Add(3*time.Second).Unix()) start := time.Now() - logAction := "applying latest" - if gwUpdReq.delete { - logAction = "removing" - } - - params.Log.V(5).Info(logAction+" "+string(gwUpdReq.bundleType)+" "+gwUpdReq.bundleName, "checksum", gwUpdReq.checksum, "deployment", gwUpdReq.deployment.Name, "name", gwUpdReq.gateway.Name, "namespace", gwUpdReq.gateway.Namespace) + params.Log.V(5).Info("graphman bundle reconcile", "stage", "starting", "operation", graphmanOp, "bundleType", string(gwUpdReq.bundleType), "bundleName", gwUpdReq.bundleName, "checksum", gwUpdReq.checksum, "deployment", gwUpdReq.deployment.Name, "gateway", gwUpdReq.gateway.Name, "gatewayNamespace", gwUpdReq.gateway.Namespace) err = util.ApplyToGraphmanTarget(gwUpdReq.bundle, true, gwUpdReq.username, gwUpdReq.password, endpoint, gwUpdReq.graphmanEncryptionPassphrase, gwUpdReq.delete) if err != nil { - failedAction := "failed to apply" - if gwUpdReq.delete { - failedAction = "failed to remove" - } - params.Log.Info(failedAction+" "+string(gwUpdReq.bundleType)+" "+gwUpdReq.bundleName, "checksum", gwUpdReq.checksum, "deployment", gwUpdReq.deployment.Name, "name", gwUpdReq.gateway.Name, "namespace", gwUpdReq.gateway.Namespace) + params.Log.Info("graphman bundle reconcile", "stage", "failed", "operation", graphmanOp, "bundleType", string(gwUpdReq.bundleType), "bundleName", gwUpdReq.bundleName, "checksum", gwUpdReq.checksum, "deployment", gwUpdReq.deployment.Name, "gateway", gwUpdReq.gateway.Name, "gatewayNamespace", gwUpdReq.gateway.Namespace) _ = captureGraphmanMetrics(ctx, params, start, gwUpdReq.deployment.Name, string(gwUpdReq.bundleType), gwUpdReq.bundleName, gwUpdReq.checksum, true) return err } - successAction := "applied latest" - if gwUpdReq.delete { - successAction = "removed" - } - params.Log.Info(successAction+" "+string(gwUpdReq.bundleType)+" "+gwUpdReq.bundleName, "hash", gwUpdReq.checksum, "deployment", gwUpdReq.deployment.Name, "name", gwUpdReq.gateway.Name, "namespace", gwUpdReq.gateway.Namespace) + params.Log.Info("graphman bundle reconcile", "stage", "succeeded", "operation", graphmanOp, "bundleType", string(gwUpdReq.bundleType), "bundleName", gwUpdReq.bundleName, "checksum", gwUpdReq.checksum, "deployment", gwUpdReq.deployment.Name, "gateway", gwUpdReq.gateway.Name, "gatewayNamespace", gwUpdReq.gateway.Namespace) _ = captureGraphmanMetrics(ctx, params, start, gwUpdReq.deployment.Name, string(gwUpdReq.bundleType), gwUpdReq.bundleName, gwUpdReq.checksum, false) err = updateEntityStatus(ctx, string(gwUpdReq.bundleType), gwUpdReq.bundleName, gwUpdReq.bundle, params) @@ -1772,14 +1817,14 @@ func updateGatewayDeployment(ctx context.Context, params Params, gwUpdReq *Gatew if err := params.Client.Patch(ctx, gwUpdReq.deployment, client.RawPatch(types.StrategicMergePatchType, []byte(patch))); err != nil { - params.Log.Error(err, "failed to update deployment annotations", "namespace", params.Instance.Namespace, "name", params.Instance.Name) + params.Log.Error(err, "failed to update deployment annotations", "gateway", params.Instance.Name, "gatewayNamespace", params.Instance.Namespace) return err } } else { if (!ready && gwUpdReq.bundleType == BundleTypeClusterProp) || (!ready && gwUpdReq.bundleType == BundleTypeListenPort) { if err := params.Client.Patch(ctx, gwUpdReq.deployment, client.RawPatch(types.StrategicMergePatchType, []byte(patch))); err != nil { - params.Log.Error(err, "failed to update deployment annotations", "namespace", params.Instance.Namespace, "name", params.Instance.Name) + params.Log.Error(err, "failed to update deployment annotations", "gateway", params.Instance.Name, "gatewayNamespace", params.Instance.Namespace) return err } } @@ -1943,17 +1988,21 @@ func updateGatewayPods(ctx context.Context, params Params, gwUpdReq *GatewayUpda } if update && ready { + graphmanOp := "apply" + if gwUpdReq.delete { + graphmanOp = "remove" + } updateStatus = true endpoint := podIP(pod.Status.PodIP) + ":" + strconv.Itoa(gwUpdReq.graphmanPort) + "/graphman" requestCacheEntry := pod.Name + "-" + gwUpdReq.cacheEntry syncRequest, err := syncCache.Read(requestCacheEntry) tryRequest := true if err != nil { - params.Log.V(5).Info("request has not been attempted or cache was flushed", "type", gwUpdReq.bundleType, "name", gwUpdReq.bundleName, "pod", pod.Name, "name", gwUpdReq.gateway.Name, "namespace", gwUpdReq.gateway.Namespace) + params.Log.V(5).Info("graphman sync cache miss or flushed", "bundleType", string(gwUpdReq.bundleType), "bundleName", gwUpdReq.bundleName, "pod", pod.Name, "gateway", gwUpdReq.gateway.Name, "gatewayNamespace", gwUpdReq.gateway.Namespace) } if syncRequest.Attempts > 0 { - params.Log.V(5).Info("request has been attempted in the last 3 seconds, backing off", "type", gwUpdReq.bundleType, "name", gwUpdReq.bundleName, "pod", pod.Name, "name", gwUpdReq.gateway.Name, "namespace", gwUpdReq.gateway.Namespace) + params.Log.V(5).Info("graphman request backing off", "bundleType", string(gwUpdReq.bundleType), "bundleName", gwUpdReq.bundleName, "pod", pod.Name, "gateway", gwUpdReq.gateway.Name, "gatewayNamespace", gwUpdReq.gateway.Namespace) tryRequest = false return errors.New("request has been attempted in the last 3 seconds, backing off") } @@ -1962,33 +2011,20 @@ func updateGatewayPods(ctx context.Context, params Params, gwUpdReq *GatewayUpda syncCache.Update(util.SyncRequest{RequestName: requestCacheEntry, Attempts: 1}, time.Now().Add(3*time.Second).Unix()) start := time.Now() - logAction := "applying latest" - if gwUpdReq.delete { - logAction = "removing" - } - - params.Log.V(5).Info(logAction+" "+string(gwUpdReq.bundleType)+" "+gwUpdReq.bundleName, "checksum", checksum, "pod", pod.Name, "name", gwUpdReq.gateway.Name, "namespace", gwUpdReq.gateway.Namespace) + params.Log.V(5).Info("graphman bundle reconcile", "stage", "starting", "operation", graphmanOp, "bundleType", string(gwUpdReq.bundleType), "bundleName", gwUpdReq.bundleName, "checksum", checksum, "pod", pod.Name, "gateway", gwUpdReq.gateway.Name, "gatewayNamespace", gwUpdReq.gateway.Namespace) err = util.ApplyToGraphmanTarget(gwUpdReq.bundle, singleton, gwUpdReq.username, gwUpdReq.password, endpoint, gwUpdReq.graphmanEncryptionPassphrase, gwUpdReq.delete) if err != nil { - failedAction := "failed to apply" - if gwUpdReq.delete { - failedAction = "failed to remove" - } - params.Log.Info(failedAction+" "+string(gwUpdReq.bundleType)+" "+gwUpdReq.bundleName, "checksum", checksum, "pod", pod.Name, "name", gwUpdReq.gateway.Name, "namespace", gwUpdReq.gateway.Namespace) + params.Log.Info("graphman bundle reconcile", "stage", "failed", "operation", graphmanOp, "bundleType", string(gwUpdReq.bundleType), "bundleName", gwUpdReq.bundleName, "checksum", checksum, "pod", pod.Name, "gateway", gwUpdReq.gateway.Name, "gatewayNamespace", gwUpdReq.gateway.Namespace) _ = captureGraphmanMetrics(ctx, params, start, pod.Name, string(gwUpdReq.bundleType), gwUpdReq.bundleName, checksum, true) return err } - successAction := "applied latest" - if gwUpdReq.delete { - successAction = "removed" - } - params.Log.Info(successAction+" "+string(gwUpdReq.bundleType)+" "+gwUpdReq.bundleName, "hash", checksum, "pod", pod.Name, "name", gwUpdReq.gateway.Name, "namespace", gwUpdReq.gateway.Namespace) + params.Log.Info("graphman bundle reconcile", "stage", "succeeded", "operation", graphmanOp, "bundleType", string(gwUpdReq.bundleType), "bundleName", gwUpdReq.bundleName, "checksum", checksum, "pod", pod.Name, "gateway", gwUpdReq.gateway.Name, "gatewayNamespace", gwUpdReq.gateway.Namespace) _ = captureGraphmanMetrics(ctx, params, start, pod.Name, string(gwUpdReq.bundleType), gwUpdReq.bundleName, checksum, false) if err := params.Client.Patch(ctx, &gwUpdReq.podList.Items[i], client.RawPatch(types.StrategicMergePatchType, []byte(patch))); err != nil { - params.Log.Error(err, "failed to update pod label", "Name", gwUpdReq.gateway.Name, "namespace", gwUpdReq.gateway.Namespace) + params.Log.Error(err, "failed to update pod label", "gateway", gwUpdReq.gateway.Name, "gatewayNamespace", gwUpdReq.gateway.Namespace) return err } } @@ -1999,7 +2035,7 @@ func updateGatewayPods(ctx context.Context, params Params, gwUpdReq *GatewayUpda (!ready && gwUpdReq.bundleType == BundleTypeRepository && gwUpdReq.gateway.Spec.App.RepositoryReferenceBootstrap.Enabled && pod.ObjectMeta.Labels["management-access"] != "leader" && !singleton) { if err := params.Client.Patch(ctx, &gwUpdReq.podList.Items[i], client.RawPatch(types.StrategicMergePatchType, []byte(patch))); err != nil { - params.Log.Error(err, "failed to update pod label", "Name", gwUpdReq.gateway.Name, "namespace", gwUpdReq.gateway.Namespace) + params.Log.Error(err, "failed to update pod label", "gateway", gwUpdReq.gateway.Name, "gatewayNamespace", gwUpdReq.gateway.Namespace) return err } } @@ -2034,25 +2070,6 @@ func readLocalReference(ctx context.Context, repository *securityv1.Repository, return bundleBytes, nil } -func readStorageSecret(ctx context.Context, repository *securityv1.Repository, params Params) ([]byte, error) { - if repository.Status.StorageSecretName == "_" { - return nil, fmt.Errorf("%s storage secret does not exist", repository.Name) - } - - storageSecret := &corev1.Secret{} - err := params.Client.Get(ctx, types.NamespacedName{Name: repository.Status.StorageSecretName, Namespace: repository.Namespace}, storageSecret) - if err != nil { - return nil, err - } - - bundleBytes, err := util.ConcatBundles(storageSecret.Data) - if err != nil { - return nil, err - } - - return bundleBytes, nil -} - // GetGatewayPods returns the pods in a Gateway Deployment func getGatewayPods(ctx context.Context, params Params) (*corev1.PodList, error) { podList := &corev1.PodList{} @@ -2119,16 +2136,6 @@ func parseGatewaySecret(gwSecret *corev1.Secret) (string, string) { return username, password } -func getStateStoreSecret(ctx context.Context, name string, statestore securityv1alpha1.L7StateStore, params Params) (*corev1.Secret, error) { - statestoreSecret := &corev1.Secret{} - - err := params.Client.Get(ctx, types.NamespacedName{Name: name, Namespace: statestore.Namespace}, statestoreSecret) - if err != nil { - return statestoreSecret, err - } - return statestoreSecret, nil -} - // HardenGraphmanService adds required mutual TLS to the Gateway's GraphQL Management API (Graphman) // This process also creates a user (PKI) and restricts Graphman to that user effectively locking remote Gateway management to // the Layer7 Operator only. @@ -2182,172 +2189,6 @@ func ManagementPod(ctx context.Context, params Params) error { return nil } -func ReconcileEphemeralGateway(ctx context.Context, params Params, kind string, podList corev1.PodList, gateway *securityv1.Gateway, gwSecret *corev1.Secret, graphmanEncryptionPassphrase string, annotation string, sha1Sum string, otkCerts bool, name string, bundle []byte) error { - graphmanPort := 9443 - - if gateway.Spec.App.Management.Graphman.DynamicSyncPort != 0 { - graphmanPort = gateway.Spec.App.Management.Graphman.DynamicSyncPort - } - - username, password := parseGatewaySecret(gwSecret) - - if username == "" || password == "" { - return fmt.Errorf("could not retrieve gateway credentials for %s", name) - } - - updateStatus := false - - for i, pod := range podList.Items { - currentSha1Sum := pod.ObjectMeta.Annotations[annotation] - - update := false - ready := false - - for _, containerStatus := range pod.Status.ContainerStatuses { - if containerStatus.Name == "gateway" { - ready = containerStatus.Ready - } - } - - if otkCerts { - if pod.ObjectMeta.Annotations["security.brcmlabs.com/"+gateway.Name+"-"+string(gateway.Spec.App.Otk.Type)+"-policies"] == "" { - ready = false - } - } - - patch := fmt.Sprintf("{\"metadata\": {\"annotations\": {\"%s\": \"%s\"}}}", annotation, sha1Sum) - - if currentSha1Sum != sha1Sum || currentSha1Sum == "" { - update = true - } - - if update && ready { - updateStatus = true - endpoint := podIP(pod.Status.PodIP) + ":" + strconv.Itoa(graphmanPort) + "/graphman" - - requestCacheEntry := pod.Name + "-" + gateway.Name + "-" + name + "-" + sha1Sum - syncRequest, err := syncCache.Read(requestCacheEntry) - tryRequest := true - if err != nil { - params.Log.V(2).Info("request has not been attempted or cache was flushed", "action", "sync "+kind, "pod", pod.Name, "name", gateway.Name, "namespace", gateway.Namespace) - } - - if syncRequest.Attempts > 0 { - params.Log.V(2).Info("request has been attempted in the last 3 seconds, backing off", "hash", sha1Sum, "pod", pod.Name, "name", gateway.Name, "namespace", gateway.Namespace) - tryRequest = false - } - - if tryRequest { - syncCache.Update(util.SyncRequest{RequestName: requestCacheEntry, Attempts: 1}, time.Now().Add(3*time.Second).Unix()) - start := time.Now() - params.Log.V(2).Info("applying latest "+kind, "hash", sha1Sum, "pod", pod.Name, "name", gateway.Name, "namespace", gateway.Namespace) - err = util.ApplyGraphmanBundle(username, password, endpoint, graphmanEncryptionPassphrase, bundle) - if err != nil { - params.Log.Info("failed to apply "+kind, "hash", sha1Sum, "pod", pod.Name, "name", gateway.Name, "namespace", gateway.Namespace) - _ = captureGraphmanMetrics(ctx, params, start, pod.Name, kind, name, sha1Sum, true) - return err - } - _ = captureGraphmanMetrics(ctx, params, start, pod.Name, kind, name, sha1Sum, false) - params.Log.Info("applied latest "+kind, "hash", sha1Sum, "pod", pod.Name, "name", gateway.Name, "namespace", gateway.Namespace) - - if err := params.Client.Patch(ctx, &podList.Items[i], - client.RawPatch(types.StrategicMergePatchType, []byte(patch))); err != nil { - params.Log.Error(err, "failed to update pod label", "Name", gateway.Name, "namespace", gateway.Namespace) - return err - } - - } - } - - // if the Gateway is not ready then cluster properties and listenPorts have already been applied via bootsrap - if (!ready && kind == "cluster properties") || (!ready && kind == "listen ports") { - if err := params.Client.Patch(ctx, &podList.Items[i], - client.RawPatch(types.StrategicMergePatchType, []byte(patch))); err != nil { - params.Log.Error(err, "failed to update pod label", "Name", gateway.Name, "namespace", gateway.Namespace) - return err - } - } - } - - if updateStatus || (!updateStatus && kind == "cluster properties") || (!updateStatus && kind == "listen ports") { - err := updateEntityStatus(ctx, kind, name, bundle, params) - if err != nil { - return err - } - } - - return nil -} - -func ReconcileDBGateway(ctx context.Context, params Params, kind string, gatewayDeployment appsv1.Deployment, gateway *securityv1.Gateway, gwSecret *corev1.Secret, graphmanEncryptionPassphrase string, annotation string, sha1Sum string, otkCerts bool, name string, bundle []byte) error { - graphmanPort := 9443 - - if gateway.Spec.App.Management.Graphman.DynamicSyncPort != 0 { - graphmanPort = gateway.Spec.App.Management.Graphman.DynamicSyncPort - } - - username, password := parseGatewaySecret(gwSecret) - if username == "" || password == "" { - return fmt.Errorf("could not retrieve gateway credentials for %s", name) - } - - patch := fmt.Sprintf("{\"metadata\": {\"annotations\": {\"%s\": \"%s\"}}}", annotation, sha1Sum) - - ready := false - - if gatewayDeployment.ObjectMeta.Annotations[annotation] == sha1Sum { - return nil - } - - if gatewayDeployment.Status.ReadyReplicas == gatewayDeployment.Status.Replicas { - ready = true - } - - if ready { - requestCacheEntry := gatewayDeployment.Name + "-" + name + "-" + sha1Sum - syncRequest, err := syncCache.Read(requestCacheEntry) - if err != nil { - params.Log.V(2).Info("request has not been attempted or cache was flushed", "action", "sync "+kind, "Name", gateway.Name, "Namespace", gateway.Namespace) - } - - if syncRequest.Attempts > 0 { - params.Log.V(2).Info("request has been attempted in the last 3 seconds, backing off", "hash", sha1Sum, "Name", gateway.Name, "Namespace", gateway.Namespace) - return errors.New("request has been attempted in the last 3 seconds, backing off") - - } - syncCache.Update(util.SyncRequest{RequestName: requestCacheEntry, Attempts: 1}, time.Now().Add(3*time.Second).Unix()) - - endpoint := gateway.Name + "." + gateway.Namespace + ".svc.cluster.local:" + strconv.Itoa(graphmanPort) + "/graphman" - if gateway.Spec.App.Management.Service.Enabled { - endpoint = gateway.Name + "-management-service." + gateway.Namespace + ".svc.cluster.local:" + strconv.Itoa(graphmanPort) + "/graphman" - } - start := time.Now() - params.Log.V(2).Info("applying latest "+kind, "sha1Sum", sha1Sum, "name", gateway.Name, "namespace", gateway.Namespace) - - err = util.ApplyGraphmanBundle(username, password, endpoint, graphmanEncryptionPassphrase, bundle) - if err != nil { - params.Log.Info("failed to apply "+kind, "sha1Sum", sha1Sum, "name", gateway.Name, "namespace", gateway.Namespace) - _ = captureGraphmanMetrics(ctx, params, start, gateway.Name, kind, name, sha1Sum, true) - return err - } - - params.Log.Info("applied latest "+kind, "sha1Sum", sha1Sum, "name", gateway.Name, "namespace", gateway.Namespace) - _ = captureGraphmanMetrics(ctx, params, start, gateway.Name, kind, name, sha1Sum, false) - - err = updateEntityStatus(ctx, kind, name, bundle, params) - if err != nil { - return err - } - - if err := params.Client.Patch(ctx, &gatewayDeployment, - client.RawPatch(types.StrategicMergePatchType, []byte(patch))); err != nil { - params.Log.Error(err, "Failed to update deployment annotations", "Namespace", params.Instance.Namespace, "Name", params.Instance.Name) - return err - } - } - return nil -} - func updateRepoRefStatus(ctx context.Context, params Params, repository securityv1.Repository, repoRef securityv1.RepositoryReference, commit string, applyError error, delete bool) (err error) { gatewayStatus := params.Instance.Status @@ -2541,6 +2382,10 @@ func updateEntityStatus(ctx context.Context, kind string, name string, bundleByt if err != nil { return err } + graphmanPort := 9443 + if params.Instance.Spec.App.Management.Graphman.DynamicSyncPort != 0 { + graphmanPort = params.Instance.Spec.App.Management.Graphman.DynamicSyncPort + } listenPorts := []string{} if params.Instance.Status.LastAppliedListenPorts == nil { for _, listenPort := range params.Instance.Spec.App.ListenPorts.Ports { @@ -2572,6 +2417,13 @@ func updateEntityStatus(ctx context.Context, kind string, name string, bundleByt } } } + // Ports that match the Graphman sync port are omitted from the dynamic bundle but remain + // applied (bootstrap); keep them in status so reconcile does not treat them as removed. + for _, lp := range params.Instance.Spec.App.ListenPorts.Ports { + if lp.Port == graphmanPort && !slices.Contains(listenPorts, lp.Name) { + listenPorts = append(listenPorts, lp.Name) + } + } params.Instance.Status.LastAppliedListenPorts = listenPorts if err := params.Client.Status().Update(ctx, params.Instance); err != nil { return fmt.Errorf("failed to update listenPort status: %w", err) @@ -2760,15 +2612,6 @@ func updateEntityStatus(ctx context.Context, kind string, name string, bundleByt return nil } -func getStateStore(ctx context.Context, params Params, stateStoreName string) (securityv1alpha1.L7StateStore, error) { - statestore := securityv1alpha1.L7StateStore{} - err := params.Client.Get(ctx, types.NamespacedName{Name: stateStoreName, Namespace: params.Instance.Namespace}, &statestore) - if err != nil { - return statestore, err - } - return statestore, nil -} - func isIPv6(str string) bool { ip := net.ParseIP(str) return ip != nil && strings.Contains(str, ":") diff --git a/pkg/gateway/reconcile/gateway_test.go b/pkg/gateway/reconcile/gateway_test.go new file mode 100644 index 00000000..0851be16 --- /dev/null +++ b/pkg/gateway/reconcile/gateway_test.go @@ -0,0 +1,32 @@ +/* +* Copyright (c) 2025 Broadcom. All rights reserved. +* The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries. +* All trademarks, trade names, service marks, and logos referenced +* herein belong to their respective companies. +* +* AI assistance has been used to generate some or all contents of this file. + */ +package reconcile + +import ( + "os" + "path/filepath" + "testing" +) + +func TestCommitMarkerPresent(t *testing.T) { + tmp := t.TempDir() + commit := "commit" + + if commitMarkerPresent(tmp, commit) { + t.Fatal("missing marker should be false") + } + + path := filepath.Join(tmp, commit+".txt") + if err := os.WriteFile(path, []byte{}, 0o600); err != nil { + t.Fatal(err) + } + if !commitMarkerPresent(tmp, commit) { + t.Fatal("existing marker should be true") + } +} diff --git a/pkg/gateway/reconcile/ingress.go b/pkg/gateway/reconcile/ingress.go index 4482fc2e..bb62177e 100644 --- a/pkg/gateway/reconcile/ingress.go +++ b/pkg/gateway/reconcile/ingress.go @@ -3,11 +3,11 @@ package reconcile import ( "context" "fmt" - "reflect" "strings" "github.com/caapim/layer7-operator/pkg/gateway" networkingv1 "k8s.io/api/networking/v1" + apiequality "k8s.io/apimachinery/pkg/api/equality" k8serrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/types" "sigs.k8s.io/controller-runtime/pkg/client" @@ -52,7 +52,11 @@ func Ingress(ctx context.Context, params Params) error { return err } - if reflect.DeepEqual(currentIngress.Spec, desiredIngress.Spec) && reflect.DeepEqual(currentIngress.ObjectMeta.Annotations, desiredIngress.ObjectMeta.Annotations) { + // Ingress controllers often add annotations (e.g. Contour); require full spec match but only + // that Gateway-owned label/annotation keys match—do not replace all metadata or we thrash. + if apiequality.Semantic.DeepEqual(currentIngress.Spec, desiredIngress.Spec) && + apiequality.Semantic.DeepEqual(currentIngress.ObjectMeta.OwnerReferences, desiredIngress.ObjectMeta.OwnerReferences) && + metadataKeysMatch(currentIngress.ObjectMeta, desiredIngress.ObjectMeta) { params.Log.V(2).Info("no ingress updates needed", "name", desiredIngress.Name, "namespace", desiredIngress.Namespace) return nil } @@ -64,8 +68,19 @@ func Ingress(ctx context.Context, params Params) error { updatedIngress.Spec.TLS = desiredIngress.Spec.TLS updatedIngress.Spec.DefaultBackend = desiredIngress.Spec.DefaultBackend updatedIngress.Spec.IngressClassName = desiredIngress.Spec.IngressClassName - updatedIngress.ObjectMeta.Annotations = desiredIngress.ObjectMeta.Annotations - updatedIngress.ObjectMeta.Labels = desiredIngress.ObjectMeta.Labels + + if updatedIngress.Labels == nil { + updatedIngress.Labels = make(map[string]string) + } + for k, v := range desiredIngress.Labels { + updatedIngress.Labels[k] = v + } + if updatedIngress.Annotations == nil { + updatedIngress.Annotations = make(map[string]string) + } + for k, v := range desiredIngress.Annotations { + updatedIngress.Annotations[k] = v + } patch := client.MergeFrom(currentIngress) if err := params.Client.Patch(ctx, updatedIngress, patch); err != nil { diff --git a/pkg/gateway/reconcile/retry_scenario_test.go b/pkg/gateway/reconcile/retry_scenario_test.go new file mode 100644 index 00000000..c34bc113 --- /dev/null +++ b/pkg/gateway/reconcile/retry_scenario_test.go @@ -0,0 +1,131 @@ +/* +* +* Copyright (c) 2025 Broadcom. All rights reserved. +* The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries. +* All trademarks, trade names, service marks, and logos referenced +* herein belong to their respective companies. +* +* This software and all information contained therein is confidential +* and proprietary and shall not be duplicated, used, disclosed or +* disseminated in any way except as authorized by the applicable +* license agreement, without the express written permission of Broadcom. +* All authorized reproductions must be marked with this language. +* +* EXCEPT AS SET FORTH IN THE APPLICABLE LICENSE AGREEMENT, TO THE +* EXTENT PERMITTED BY APPLICABLE LAW OR AS AGREED BY BROADCOM IN ITS +* APPLICABLE LICENSE AGREEMENT, BROADCOM PROVIDES THIS DOCUMENTATION +* "AS IS" WITHOUT WARRANTY OF ANY KIND, INCLUDING WITHOUT LIMITATION, +* ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* PURPOSE, OR. NONINFRINGEMENT. IN NO EVENT WILL BROADCOM BE LIABLE TO +* THE END USER OR ANY THIRD PARTY FOR ANY LOSS OR DAMAGE, DIRECT OR +* INDIRECT, FROM THE USE OF THIS DOCUMENTATION, INCLUDING WITHOUT LIMITATION, +* LOST PROFITS, LOST INVESTMENT, BUSINESS INTERRUPTION, GOODWILL, OR +* LOST DATA, EVEN IF BROADCOM IS EXPRESSLY ADVISED IN ADVANCE OF THE +* POSSIBILITY OF SUCH LOSS OR DAMAGE. +* +* +* AI assistance has been used to generate some or all contents of this file. + */ +package reconcile + +import ( + "os" + "path/filepath" + "testing" + + securityv1 "github.com/caapim/layer7-operator/api/v1" + "github.com/go-logr/logr" +) + +func TestCheckRetryScenario_commitMarkerRequired(t *testing.T) { + tmp := t.TempDir() + commit := "newsha1" + repoRef := "myrepo" + params := Params{Log: logr.Discard()} + + gw := &securityv1.Gateway{ + Status: securityv1.GatewayStatus{ + RepositoryStatus: []securityv1.GatewayRepositoryStatus{ + { + Name: repoRef, + Commit: commit, + Conditions: []securityv1.RepositoryCondition{ + {Reason: "GraphQL apply failed", Status: "False"}, + }, + }, + }, + }, + } + + should, bundle := checkRetryScenario(gw, repoRef, commit, tmp, params) + if should || len(bundle) != 0 { + t.Fatalf("without marker: want shouldRetry=false and empty bundle, got should=%v len=%d", should, len(bundle)) + } +} + +func TestCheckRetryScenario_markerAndLastApplied_retries(t *testing.T) { + tmp := t.TempDir() + commit := "abc123" + repoRef := "myrepo" + want := []byte(`{"bundle":true}`) + params := Params{Log: logr.Discard()} + + if err := os.WriteFile(filepath.Join(tmp, commit+".txt"), []byte{}, 0o600); err != nil { + t.Fatal(err) + } + if err := os.WriteFile(filepath.Join(tmp, "last_applied_"+repoRef+".json"), want, 0o600); err != nil { + t.Fatal(err) + } + + gw := &securityv1.Gateway{ + Status: securityv1.GatewayStatus{ + RepositoryStatus: []securityv1.GatewayRepositoryStatus{ + { + Name: repoRef, + Commit: commit, + Conditions: []securityv1.RepositoryCondition{ + {Reason: "error: transient", Status: "False"}, + }, + }, + }, + }, + } + + should, bundle := checkRetryScenario(gw, repoRef, commit, tmp, params) + if !should { + t.Fatal("with marker and last_applied: expected shouldRetry true") + } + if string(bundle) != string(want) { + t.Fatalf("bundle: got %q want %q", bundle, want) + } +} + +func TestCheckRetryScenario_markerNoLastApplied_shouldRetryTrueNilBundle(t *testing.T) { + tmp := t.TempDir() + commit := "abc123" + repoRef := "myrepo" + params := Params{Log: logr.Discard()} + + if err := os.WriteFile(filepath.Join(tmp, commit+".txt"), []byte{}, 0o600); err != nil { + t.Fatal(err) + } + + gw := &securityv1.Gateway{ + Status: securityv1.GatewayStatus{ + RepositoryStatus: []securityv1.GatewayRepositoryStatus{ + { + Name: repoRef, + Commit: commit, + Conditions: []securityv1.RepositoryCondition{ + {Reason: "failed apply", Status: "False"}, + }, + }, + }, + }, + } + + should, bundle := checkRetryScenario(gw, repoRef, commit, tmp, params) + if !should || bundle != nil { + t.Fatalf("marker without last_applied: want should=true, nil bundle; got should=%v bundle=%v", should, bundle) + } +} diff --git a/pkg/gateway/reconcile/service.go b/pkg/gateway/reconcile/service.go index 2d9cb83d..1fec1880 100644 --- a/pkg/gateway/reconcile/service.go +++ b/pkg/gateway/reconcile/service.go @@ -3,17 +3,32 @@ package reconcile import ( "context" "fmt" - "reflect" "github.com/caapim/layer7-operator/pkg/gateway" corev1 "k8s.io/api/core/v1" + apiequality "k8s.io/apimachinery/pkg/api/equality" k8serrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" ) func Services(ctx context.Context, params Params) error { + managementServiceName := params.Instance.Name + "-management-service" + if !params.Instance.Spec.App.Management.Service.Enabled { + currentMgmt := &corev1.Service{} + err := params.Client.Get(ctx, types.NamespacedName{Name: managementServiceName, Namespace: params.Instance.Namespace}, currentMgmt) + if err == nil && controllerutil.HasControllerReference(currentMgmt) { + if err := params.Client.Delete(ctx, currentMgmt); err != nil { + return fmt.Errorf("failed to remove management service: %w", err) + } + params.Log.Info("removed management service", "name", managementServiceName, "namespace", params.Instance.Namespace) + } else if err != nil && !k8serrors.IsNotFound(err) { + return err + } + } + desiredServices := []*corev1.Service{ gateway.NewService(params.Instance), } @@ -29,6 +44,22 @@ func Services(ctx context.Context, params Params) error { return nil } +// metadataKeysMatch returns true if current has every label and annotation key/value from desired +// (extra keys on current are allowed). +func metadataKeysMatch(current, desired metav1.ObjectMeta) bool { + for k, v := range desired.Labels { + if current.Labels == nil || current.Labels[k] != v { + return false + } + } + for k, v := range desired.Annotations { + if current.Annotations == nil || current.Annotations[k] != v { + return false + } + } + return true +} + func reconcileServices(ctx context.Context, params Params, desiredServices []*corev1.Service) error { for _, ds := range desiredServices { desiredService := ds @@ -55,6 +86,12 @@ func reconcileServices(ctx context.Context, params Params, desiredServices []*co updated.Spec = desiredService.Spec updated.ObjectMeta.OwnerReferences = desiredService.ObjectMeta.OwnerReferences + if updated.ObjectMeta.Labels == nil { + updated.ObjectMeta.Labels = make(map[string]string) + } + if updated.ObjectMeta.Annotations == nil { + updated.ObjectMeta.Annotations = make(map[string]string) + } for k, v := range desiredService.ObjectMeta.Annotations { updated.ObjectMeta.Annotations[k] = v } @@ -62,9 +99,11 @@ func reconcileServices(ctx context.Context, params Params, desiredServices []*co updated.ObjectMeta.Labels[k] = v } - if reflect.DeepEqual(currentService.Spec.Ports, desiredService.Spec.Ports) && reflect.DeepEqual(currentService.Spec.Type, desiredService.Spec.Type) { + if apiequality.Semantic.DeepEqual(currentService.Spec, desiredService.Spec) && + apiequality.Semantic.DeepEqual(currentService.ObjectMeta.OwnerReferences, desiredService.ObjectMeta.OwnerReferences) && + metadataKeysMatch(currentService.ObjectMeta, desiredService.ObjectMeta) { params.Log.V(2).Info("no service updates needed", "name", desiredService.Name, "namespace", desiredService.Namespace) - return nil + continue } patch := client.MergeFrom(¤tService) diff --git a/pkg/gateway/reconcile/service_test.go b/pkg/gateway/reconcile/service_test.go index 97c90efe..a9a0d3c7 100644 --- a/pkg/gateway/reconcile/service_test.go +++ b/pkg/gateway/reconcile/service_test.go @@ -3,11 +3,14 @@ package reconcile import ( "context" corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" "testing" ) func TestNewService(t *testing.T) { + // Exercises both main and management Services in one reconcile pass (regression: main service + // must not return early and skip the management Service). t.Run("should create services", func(t *testing.T) { params := newParams() ctx := context.Background() @@ -63,3 +66,26 @@ func TestNewService(t *testing.T) { } }) } + +func TestMetadataKeysMatch(t *testing.T) { + t.Run("extra keys on current allowed", func(t *testing.T) { + cur := metav1.ObjectMeta{ + Labels: map[string]string{"app.kubernetes.io/name": "gw", "extra": "x"}, + Annotations: map[string]string{"a": "b"}, + } + des := metav1.ObjectMeta{ + Labels: map[string]string{"app.kubernetes.io/name": "gw"}, + Annotations: map[string]string{"a": "b"}, + } + if !metadataKeysMatch(cur, des) { + t.Fatal("expected match") + } + }) + t.Run("missing desired label value", func(t *testing.T) { + cur := metav1.ObjectMeta{Labels: map[string]string{"k": "wrong"}} + des := metav1.ObjectMeta{Labels: map[string]string{"k": "v"}} + if metadataKeysMatch(cur, des) { + t.Fatal("expected no match") + } + }) +} diff --git a/pkg/gateway/secrets.go b/pkg/gateway/secrets.go index 81d5f6ff..52489e28 100644 --- a/pkg/gateway/secrets.go +++ b/pkg/gateway/secrets.go @@ -322,14 +322,8 @@ func NewOtkOverrideBundleSecret(gw *securityv1.Gateway) (*corev1.Secret, error) switch gw.Spec.App.Otk.Type { case securityv1.OtkTypeInternal: gatewayHost = gw.Spec.App.Otk.DmzOTKGateway.Url - if gw.Spec.App.Otk.DmzOTKGateway.Port != 0 { - otkPort = gw.Spec.App.Otk.DmzOTKGateway.Port - } case securityv1.OtkTypeDMZ: gatewayHost = gw.Spec.App.Otk.InternalOTKGateway.Url - if gw.Spec.App.Otk.InternalOTKGateway.Port != 0 { - otkPort = gw.Spec.App.Otk.InternalOTKGateway.Port - } } bundleBytes, checksum, err := util.BuildOtkOverrideBundle(mode, gatewayHost, otkPort, includeOtkPort) diff --git a/pkg/repository/reconcile/finalizer.go b/pkg/repository/reconcile/finalizer.go index b070de41..6c3f1678 100644 --- a/pkg/repository/reconcile/finalizer.go +++ b/pkg/repository/reconcile/finalizer.go @@ -34,6 +34,7 @@ import ( "strings" v1 "github.com/caapim/layer7-operator/api/v1" + "github.com/caapim/layer7-operator/pkg/util" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" ) @@ -104,13 +105,13 @@ func Finalizer(ctx context.Context, params Params) (err error) { } // Clean up cache directory - cachePath := "/tmp/repo-cache/" + params.Instance.Name + cachePath := util.RepoCacheDir(params.Instance.Name, params.Instance.Namespace) if err := os.RemoveAll(cachePath); err != nil { params.Log.V(2).Info("failed to remove cache directory", "path", cachePath, "error", err.Error()) } // Clean up statestore cache if it exists - stateStorePath := "/tmp/statestore/" + params.Instance.Name + stateStorePath := util.StateStoreCacheDir(params.Instance.Name, params.Instance.Namespace) if err := os.RemoveAll(stateStorePath); err != nil { params.Log.V(2).Info("failed to remove statestore cache directory", "path", stateStorePath, "error", err.Error()) } diff --git a/pkg/repository/reconcile/repository.go b/pkg/repository/reconcile/repository.go index 78f9e8c0..5ed1553c 100644 --- a/pkg/repository/reconcile/repository.go +++ b/pkg/repository/reconcile/repository.go @@ -40,6 +40,7 @@ import ( "github.com/caapim/layer7-operator/internal/graphman" "github.com/caapim/layer7-operator/pkg/util" "github.com/go-git/go-git/v5" + "github.com/go-logr/logr" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/metric" @@ -171,6 +172,11 @@ func syncRepository(ctx context.Context, params Params) error { storageSecretName = repository.Name + "-repository-" + folderName if params.Instance.Status.Commit == commit { params.Log.V(5).Info("already up-to-date", "name", repository.Name, "namespace", repository.Namespace) + idleStateStoreSynced := true + if repository.Spec.StateStoreReference != "" { + idleStateStoreSynced = repository.Status.StateStoreSynced + } + ensureReadyOnIdleSync(ctx, params, start, commit, storageSecretName, idleStateStoreSynced) return nil } case "git": @@ -181,6 +187,7 @@ func syncRepository(ctx context.Context, params Params) error { // Check if we need to build cache/storage secret (only if status doesn't match) if params.Instance.Status.Commit == commit && (params.Instance.Status.StorageSecretName != "" && params.Instance.Status.StorageSecretName != "_") { params.Log.V(5).Info("already up-to-date with cache built", "name", repository.Name, "namespace", repository.Namespace) + ensureReadyOnIdleSync(ctx, params, start, commit, params.Instance.Status.StorageSecretName, true) return nil } @@ -215,7 +222,16 @@ func syncRepository(ctx context.Context, params Params) error { } if params.Instance.Status.Commit == commit { + if repository.Spec.StateStoreReference != "" { + cacheDir := util.StateStoreCacheDir(repository.Name, repository.Namespace) + if _, statErr := os.Stat(cacheDir + "/latest.json"); os.IsNotExist(statErr) { + if cacheErr := BuildStateStoreRepositoryCache(ctx, params, statestore, commit); cacheErr != nil { + params.Log.V(2).Info("failed to materialize statestore disk cache", "name", repository.Name+"-repository", "namespace", repository.Namespace, "error", cacheErr.Error()) + } + } + } params.Log.V(5).Info("already up-to-date", "name", repository.Name, "namespace", repository.Namespace) + ensureReadyOnIdleSync(ctx, params, start, commit, "_", true) return nil } case "local": @@ -227,44 +243,70 @@ func syncRepository(ctx context.Context, params Params) error { if strings.ToLower(string(repository.Spec.Type)) != "statestore" { - if repository.Spec.StateStoreReference != "" { - // For state store repos, sync to Redis - err = StateStorage(ctx, params, statestore, commit) - if err != nil { - params.Log.V(2).Info("failed to reconcile state storage", "name", repository.Name+"-repository", "namespace", repository.Namespace, "error", err.Error()) - params.Instance.Status.StateStoreSynced = false - } + // Build cache before StateStorage so bundle failures do not advance Redis/commit tracking. + // With StateStoreReference, status uses storageSecretName "_" but cache still uses localRepoStorageInfo's secret name. + cacheSecretName, _, _, cacheInfoErr := localRepoStorageInfo(params) + if cacheInfoErr != nil { + params.Log.V(2).Info("could not resolve name for repository cache build", "name", repository.Name, "namespace", repository.Namespace, "error", cacheInfoErr.Error()) } - - // Create storage secret from bundleMap for all repos - // Filter out delta bundles - we don't use them in Gateway yet and they take up space - if storageSecretName != "_" && storageSecretName != "" { - // Build directory-based bundle cache for all repos (state store and non-state store) - bundleMap, err := BuildRepositoryCache(ctx, params, commit, storageSecretName) - if err != nil { - params.Log.V(2).Info("failed to build repository cache", "name", repository.Name+"-repository", "namespace", repository.Namespace, "error", err.Error()) + if cacheInfoErr == nil && cacheSecretName != "" { + bundleMap, buildCacheErr := BuildRepositoryCache(ctx, params, commit, cacheSecretName) + if buildCacheErr != nil { + // Log full error (includes graphman entity paths from readBundle / loose JSON) for operators. + params.Log.Error(buildCacheErr, "failed to build repository cache", "name", repository.Name, "namespace", repository.Namespace) + err = setRepoReady(ctx, params, patch) + if err != nil { + params.Log.V(2).Error(err, "failed to patch repository status", "namespace", params.Instance.Namespace, "name", params.Instance.Name) + } + return nil } - storageSecretBundleMap := make(map[string][]byte) - for k, v := range bundleMap { - if !strings.HasSuffix(k, "-delta.gz") { - storageSecretBundleMap[k] = v + // Create storage secret from bundleMap only when status tracks a real secret (not "_" for state-store-only repos). + // Skip when status already has "_" (too large for secret / state-store-only): avoids rebuilding and re-logging every reconcile. + // Filter out delta bundles - we don't use them in Gateway yet and they take up space + if storageSecretName != "_" && storageSecretName != "" && repository.Status.StorageSecretName != "_" { + storageSecretBundleMap := make(map[string][]byte) + for k, v := range bundleMap { + if !strings.HasSuffix(k, "-delta.gz") { + storageSecretBundleMap[k] = v + } + } + + err = StorageSecretFromBundleMap(ctx, params, storageSecretBundleMap, storageSecretName) + if err != nil { + params.Log.V(2).Info("failed to reconcile storage secret", "name", repository.Name+"-repository", "namespace", repository.Namespace, "error", err.Error()) + storageSecretName = "" + switch err.Error() { + case "exceededMaxSize", "file size exceeded", "combined file size exceeded": + storageSecretName = "_" + } + } else if len(storageSecretBundleMap) == 0 && repository.Spec.StateStoreReference == "" { + // Empty git/http clone: no bundle artifacts and no storage secret created — omit from gateway bootstrap (not "_" large/statestore paths). + // (buildCacheErr is always nil here — we return above on build failure.) + switch strings.ToLower(string(repository.Spec.Type)) { + case "git", "http": + storageSecretName = "" + } } } + } - err = StorageSecretFromBundleMap(ctx, params, storageSecretBundleMap, storageSecretName) + if repository.Spec.StateStoreReference != "" { + // For state store repos, sync to Redis + err = StateStorage(ctx, params, statestore, commit) if err != nil { - params.Log.V(2).Info("failed to reconcile storage secret", "name", repository.Name+"-repository", "namespace", repository.Namespace, "error", err.Error()) - storageSecretName = "" - if err.Error() == "exceededMaxSize" { - storageSecretName = "_" - } + params.Log.V(2).Info("failed to reconcile state storage", "name", repository.Name+"-repository", "namespace", repository.Namespace, "error", err.Error()) + params.Instance.Status.StateStoreSynced = false } } } if repository.Spec.StateStoreReference != "" && (!repository.Status.StateStoreSynced || commit != repository.Status.Commit) { - err = StateStorage(ctx, params, statestore, commit) + if repository.Spec.Type == securityv1.RepositoryTypeStateStore { + err = BuildStateStoreRepositoryCache(ctx, params, statestore, commit) + } else { + err = StateStorage(ctx, params, statestore, commit) + } if err != nil { params.Log.V(2).Info("failed to reconcile state storage", "name", repository.Name+"-repository", "namespace", repository.Namespace, "error", err.Error()) stateStoreSynced = false @@ -341,6 +383,39 @@ func updateStatus(ctx context.Context, params Params, commit string, storageSecr return nil } +// ensureReadyOnIdleSync calls updateStatus when sync exits early with an up-to-date commit but +// status.Ready is still false from an earlier failure. Uses the same metrics and reconciled log as the main success path. +func ensureReadyOnIdleSync(ctx context.Context, params Params, start time.Time, commit, storageSecretName string, stateStoreSynced bool) { + if params.Instance.Status.Ready { + return + } + repositoryType := strings.ToLower(string(params.Instance.Spec.Type)) + cacheSecretName := storageSecretName + if (cacheSecretName == "_" || cacheSecretName == "") && repositoryType != "statestore" { + if localStorageSecretName, _, _, err := localRepoStorageInfo(params); err == nil && localStorageSecretName != "" { + cacheSecretName = localStorageSecretName + } + } + if repositoryType != "statestore" && cacheSecretName != "" && cacheSecretName != "_" { + if _, err := BuildRepositoryCache(ctx, params, commit, cacheSecretName); err != nil { + params.Log.Error(err, "failed to build repository cache", "name", params.Instance.Name, "namespace", params.Instance.Namespace) + return + } + } + err := updateStatus(ctx, params, commit, storageSecretName, stateStoreSynced) + if err != nil { + _ = captureRepositorySyncMetrics(ctx, params, start, commit, true) + params.Log.Info("failed to update repository status", "namespace", params.Instance.Namespace, "name", params.Instance.Name, "error", err.Error()) + return + } + _ = captureRepositorySyncMetrics(ctx, params, start, commit, false) + params.Log.Info("reconciled", "name", params.Instance.Name, "namespace", params.Instance.Namespace, "commit", commit) +} + +// setRepoReady patches status.ready to false when the sync already determined the repo should not be ready +// (e.g. bundle/cache build failure). It only sends a patch if the instance is currently Ready, to avoid +// redundant writes; if Ready is already false, the reconcile still exits before success paths (storage secret, +// updateStatus with ready true) so no spurious "success" update runs. func setRepoReady(ctx context.Context, params Params, patch []byte) error { if !params.Instance.Status.Ready { @@ -355,12 +430,24 @@ func setRepoReady(ctx context.Context, params Params, patch []byte) error { return nil } +// analyzeGraphmanCloneRoot runs when DetectGraphmanFolders found no project subdirs: decide whether to +// log "no layout", and whether the clone root alone is a valid graphman bundle (flat / JSON-only layout). +func analyzeGraphmanCloneRoot(repositoryPath string, log logr.Logger) (warnNoProjectDirs bool, useCloneRootAsProject bool, err error) { + rootBytes, err := util.BuildAndValidateBundle(repositoryPath, false, log) + if err != nil { + return false, false, err + } + if util.GraphmanBundleBytesHaveNoEntities(rootBytes) { + return true, false, nil + } + return false, true, nil +} + // BuildRepositoryCache scans a repository, builds bundles per directory, and caches them // Returns the bundleMap for reuse (e.g., in StorageSecret) func BuildRepositoryCache(ctx context.Context, params Params, commit string, storageSecretName string) (map[string][]byte, error) { repository := params.Instance - cachePath := "/tmp/repo-cache/" + repository.Name - // fileName := commit + ".json" + cachePath := util.RepoCacheDir(repository.Name, repository.Namespace) // there is a flag that facilitates delete being managed using mappings outside of the operator which is the default // behaviour if you are not using a L7StateStore. @@ -401,16 +488,31 @@ func BuildRepositoryCache(ctx context.Context, params Params, commit string, sto return nil, err } + var warnNoProjectDirs, useCloneRootAsProject bool + if len(projects) == 0 { + warnNoProjectDirs, useCloneRootAsProject, err = analyzeGraphmanCloneRoot(repositoryPath, params.Log) + if err != nil { + return nil, err + } + if warnNoProjectDirs { + params.Log.Info("no graphman repository layout detected under clone path. repository cache will contain no directory bundles", + "name", repository.Name, + "namespace", repository.Namespace, + "commit", commit) + } + } + + projectsToBuild := projects + if len(projects) == 0 && useCloneRootAsProject { + projectsToBuild = []string{repositoryPath} + } + bundleMap := map[string][]byte{} currentBundles := map[string][]byte{} // Build the current commit - for _, project := range projects { - // need to see what a base level directory has here so we can account for that - // may require new build of graphman-static-init - // empty directory prob covers it already.. - - bundleBytes, err := util.BuildAndValidateBundle(project, false) + for _, project := range projectsToBuild { + bundleBytes, err := util.BuildAndValidateBundle(project, false, params.Log) if err != nil { return nil, err } @@ -418,6 +520,9 @@ func BuildRepositoryCache(ctx context.Context, params Params, commit string, sto // Generate key name (normalize directory path) keyName := strings.Replace(project, repositoryPath, "", 1) keyName = strings.TrimPrefix(strings.ReplaceAll(keyName, "/", "-"), "-") + if keyName == "" { + keyName = repository.Name + } currentBundles[keyName+".json"] = bundleBytes diff --git a/pkg/repository/reconcile/repository_graphman_test.go b/pkg/repository/reconcile/repository_graphman_test.go new file mode 100644 index 00000000..a368e912 --- /dev/null +++ b/pkg/repository/reconcile/repository_graphman_test.go @@ -0,0 +1,100 @@ +/* +* Copyright (c) 2025 Broadcom. All rights reserved. +* The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries. +* All trademarks, trade names, service marks, and logos referenced +* herein belong to their respective companies. +* +* This software and all information contained therein is confidential +* and proprietary and shall not be duplicated, used, disclosed or +* disseminated in any way except as authorized by the applicable +* license agreement, without the express written permission of Broadcom. +* All authorized reproductions must be marked with this language. +* +* EXCEPT AS SET FORTH IN THE APPLICABLE LICENSE AGREEMENT, TO THE +* EXTENT PERMITTED BY APPLICABLE LAW OR AS AGREED BY BROADCOM IN ITS +* APPLICABLE LICENSE AGREEMENT, BROADCOM PROVIDES THIS DOCUMENTATION +* "AS IS" WITHOUT WARRANTY OF ANY KIND, INCLUDING WITHOUT LIMITATION, +* ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* PURPOSE, OR. NONINFRINGEMENT. IN NO EVENT WILL BROADCOM BE LIABLE TO +* THE END USER OR ANY THIRD PARTY FOR ANY LOSS OR DAMAGE, DIRECT OR +* INDIRECT, FROM THE USE OF THIS DOCUMENTATION, INCLUDING WITHOUT LIMITATION, +* LOST PROFITS, LOST INVESTMENT, BUSINESS INTERRUPTION, GOODWILL, OR +* LOST DATA, EVEN IF BROADCOM IS EXPRESSLY ADVISED IN ADVANCE OF THE +* POSSIBILITY OF SUCH LOSS OR DAMAGE. +* +* AI assistance has been used to generate some or all contents of this file. That includes, but is not limited to, new code, modifying existing code, stylistic edits. + */ +package reconcile + +import ( + "os" + "path/filepath" + "testing" + + "github.com/caapim/layer7-operator/pkg/util" + "github.com/go-logr/logr" +) + +func TestAnalyzeGraphmanCloneRoot_EmptyClone(t *testing.T) { + d := t.TempDir() + _, _, err := analyzeGraphmanCloneRoot(d, logr.Discard()) + if err == nil { + t.Fatal("expected bundle build to fail for empty clone") + } +} + +func TestAnalyzeGraphmanCloneRoot_FlatJSONBundle(t *testing.T) { + d := t.TempDir() + // No graphman *project* dirs (DetectGraphmanFolders empty), but root-level JSON graphman file + // that BuildAndValidateBundle still merges — same pattern as a "pure" combined layout. + j := `{"services":[{"name":"s","resolutionPath":"/x","enabled":true}]}` + if err := os.WriteFile(filepath.Join(d, "svc.json"), []byte(j), 0644); err != nil { + t.Fatal(err) + } + projects, err := util.DetectGraphmanFolders(d) + if err != nil { + t.Fatal(err) + } + if len(projects) != 0 { + t.Fatalf("expected no project dirs, got %v", projects) + } + warn, useRoot, err := analyzeGraphmanCloneRoot(d, logr.Discard()) + if err != nil { + t.Fatal(err) + } + if warn || !useRoot { + t.Fatalf("expected root bundle without warn, got warn=%v useRoot=%v", warn, useRoot) + } +} + +func TestAnalyzeGraphmanCloneRoot_ClusterPropertiesJSON(t *testing.T) { + d := t.TempDir() + // Flat repo: only test.json at root (no per-project dirs); clusterProperties is valid graphman content. + j := `{ + "clusterProperties": [ + { + "goid": "982cc1ee7369c6ca5a7ae1e4ad866070", + "name": "myDemoConfigVal123", + "hiddenProperty": false, + "value": "suspiciousLlama - changed" + } + ] +}` + if err := os.WriteFile(filepath.Join(d, "test.json"), []byte(j), 0644); err != nil { + t.Fatal(err) + } + warnNoProjectDirs, useCloneRootAsProject, err := analyzeGraphmanCloneRoot(d, logr.Discard()) + if err != nil { + t.Fatal(err) + } + if warnNoProjectDirs || !useCloneRootAsProject { + t.Fatalf("expected root bundle: warnNoProjectDirs=%v useCloneRootAsProject=%v", warnNoProjectDirs, useCloneRootAsProject) + } + b, err := util.BuildAndValidateBundle(d, false, logr.Discard()) + if err != nil { + t.Fatal(err) + } + if len(b) == 0 || util.GraphmanBundleBytesHaveNoEntities(b) { + t.Fatal("clusterProperties bundle should not be empty") + } +} diff --git a/pkg/repository/reconcile/repository_status_test.go b/pkg/repository/reconcile/repository_status_test.go new file mode 100644 index 00000000..9280b95c --- /dev/null +++ b/pkg/repository/reconcile/repository_status_test.go @@ -0,0 +1,171 @@ +/* +* Copyright (c) 2025 Broadcom. All rights reserved. +* The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries. +* All trademarks, trade names, service marks, and logos referenced +* herein belong to their respective companies. +* +* This software and all information contained therein is confidential +* and proprietary and shall not be duplicated, used, disclosed or +* disseminated in any way except as authorized by the applicable +* license agreement, without the express written permission of Broadcom. +* All authorized reproductions must be marked with this language. +* +* EXCEPT AS SET FORTH IN THE APPLICABLE LICENSE AGREEMENT, TO THE +* EXTENT PERMITTED BY APPLICABLE LAW OR AS AGREED BY BROADCOM IN ITS +* APPLICABLE LICENSE AGREEMENT, BROADCOM PROVIDES THIS DOCUMENTATION +* "AS IS" WITHOUT WARRANTY OF ANY KIND, INCLUDING WITHOUT LIMITATION, +* ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* PURPOSE, OR. NONINFRINGEMENT. IN NO EVENT WILL BROADCOM BE LIABLE TO +* THE END USER OR ANY THIRD PARTY FOR ANY LOSS OR DAMAGE, DIRECT OR +* INDIRECT, FROM THE USE OF THIS DOCUMENTATION, INCLUDING WITHOUT LIMITATION, +* LOST PROFITS, LOST INVESTMENT, BUSINESS INTERRUPTION, GOODWILL, OR +* LOST DATA, EVEN IF BROADCOM IS EXPRESSLY ADVISED IN ADVANCE OF THE +* POSSIBILITY OF SUCH LOSS OR DAMAGE. +* +* AI assistance has been used to generate some or all contents of this file. That includes, but is not limited to, new code, modifying existing code, stylistic edits. + */ + +package reconcile + +import ( + "context" + "os" + "path/filepath" + "strings" + "testing" + "time" + + securityv1 "github.com/caapim/layer7-operator/api/v1" + "github.com/caapim/layer7-operator/pkg/util" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" +) + +// testK8sObjectNameSuffix derives a substring safe for metadata.name (RFC 1123 label rules) from t.Name(). +func testK8sObjectNameSuffix(t *testing.T) string { + s := strings.ToLower(t.Name()) + s = strings.ReplaceAll(s, "/", "-") + s = strings.ReplaceAll(s, "_", "-") + return s +} + +func TestRecoverReadyIfStuck_SetsReadyWhenNotReady(t *testing.T) { + ctx := context.Background() + name := "recover-ready-" + testK8sObjectNameSuffix(t) + + repo := &securityv1.Repository{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "security.brcmlabs.com/v1", + Kind: "Repository", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: "default", + }, + Spec: securityv1.RepositorySpec{ + Enabled: true, + Type: securityv1.RepositoryTypeGit, + Branch: "main", + Endpoint: "https://example.com/repo.git", + }, + } + if err := k8sClient.Create(ctx, repo); err != nil { + t.Fatal(err) + } + + commit := "abc123def" + storageName := name + "-repository-main" + repo.Status = securityv1.RepositoryStatus{ + Name: name, + Ready: false, + Commit: commit, + StorageSecretName: storageName, + StateStoreSynced: true, + } + if err := k8sClient.Status().Update(ctx, repo); err != nil { + t.Fatal(err) + } + + // Seed repo cache so BuildRepositoryCache hits the commit file fast path (no clone on disk in unit tests). + cachePath := util.RepoCacheDir(name, "default") + if err := os.MkdirAll(cachePath, 0755); err != nil { + t.Fatal(err) + } + if err := os.WriteFile(filepath.Join(cachePath, commit+".json"), []byte("{}"), 0644); err != nil { + t.Fatal(err) + } + + params := Params{ + Client: k8sClient, + Log: logger, + Scheme: testScheme, + Instance: repo, + } + ensureReadyOnIdleSync(ctx, params, time.Now(), commit, storageName, true) + + if err := k8sClient.Get(ctx, types.NamespacedName{Name: name, Namespace: "default"}, repo); err != nil { + t.Fatal(err) + } + if !repo.Status.Ready { + t.Errorf("expected Ready true after ensureReadyOnIdleSync") + } + if repo.Status.Commit != commit { + t.Errorf("commit: expected %q, got %q", commit, repo.Status.Commit) + } +} + +func TestRecoverReadyIfStuck_NoOpWhenAlreadyReady(t *testing.T) { + ctx := context.Background() + name := "recover-ready-" + testK8sObjectNameSuffix(t) + + repo := &securityv1.Repository{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "security.brcmlabs.com/v1", + Kind: "Repository", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: "default", + }, + Spec: securityv1.RepositorySpec{ + Enabled: true, + Type: securityv1.RepositoryTypeGit, + Branch: "main", + Endpoint: "https://example.com/repo.git", + }, + } + if err := k8sClient.Create(ctx, repo); err != nil { + t.Fatal(err) + } + + commit := "xyz789" + repo.Status = securityv1.RepositoryStatus{ + Name: name, + Ready: true, + Commit: commit, + StorageSecretName: name + "-repository-main", + StateStoreSynced: true, + } + if err := k8sClient.Status().Update(ctx, repo); err != nil { + t.Fatal(err) + } + updated := repo.Status.Updated + + params := Params{ + Client: k8sClient, + Log: logger, + Scheme: testScheme, + Instance: repo, + } + ensureReadyOnIdleSync(ctx, params, time.Now(), commit, repo.Status.StorageSecretName, true) + + if err := k8sClient.Get(ctx, types.NamespacedName{Name: name, Namespace: "default"}, repo); err != nil { + t.Fatal(err) + } + if !repo.Status.Ready { + t.Errorf("expected Ready to remain true") + } + if repo.Status.Updated != updated { + t.Errorf("expected status Updated to be unchanged when already Ready") + } +} diff --git a/pkg/repository/reconcile/secret.go b/pkg/repository/reconcile/secret.go index 12605d83..f739a947 100644 --- a/pkg/repository/reconcile/secret.go +++ b/pkg/repository/reconcile/secret.go @@ -122,18 +122,37 @@ func StorageSecret(ctx context.Context, params Params) error { return errors.New("exceededMaxSize") } - projects, err := util.DetectGraphmanFolders("/tmp/" + params.Instance.Name + "-" + params.Instance.Namespace + "-" + ext) + checkoutPath := "/tmp/" + params.Instance.Name + "-" + params.Instance.Namespace + "-" + ext + projects, err := util.DetectGraphmanFolders(checkoutPath) if err != nil { return err } + var warnNoProjectDirs, useCloneRootAsProject bool + if len(projects) == 0 { + warnNoProjectDirs, useCloneRootAsProject, err = analyzeGraphmanCloneRoot(checkoutPath, params.Log) + if err != nil { + return err + } + if warnNoProjectDirs { + params.Log.Info("no graphman bundle folders found under repository checkout. storage secret will have no compressed bundle keys", + "name", params.Instance.Name, + "namespace", params.Instance.Namespace) + } + } + + projectsToBuild := projects + if len(projects) == 0 && useCloneRootAsProject { + projectsToBuild = []string{checkoutPath} + } + data := map[string][]byte{} secretSize := 0 - for _, p := range projects { + for _, p := range projectsToBuild { - bundleGzip, err := util.CompressGraphmanBundle(p, false) + bundleGzip, err := util.CompressGraphmanBundle(p, false, params.Log) if err != nil { return err } @@ -158,7 +177,11 @@ func StorageSecret(ctx context.Context, params Params) error { } keyName := strings.Replace(p, "/tmp/"+params.Instance.Name+"-"+params.Instance.Namespace+"-"+ext, "", 1) - keyName = strings.Replace(strings.ReplaceAll(keyName, "/", "-"), "-", "", 1) + ".gz" + keyName = strings.Replace(strings.ReplaceAll(keyName, "/", "-"), "-", "", 1) + if keyName == "" { + keyName = params.Instance.Name + } + keyName = keyName + ".gz" data[keyName] = bundleGzip buf.Reset() } @@ -187,7 +210,9 @@ func StorageSecretFromBundleMap(ctx context.Context, params Params, bundleMap ma } if len(bundleMap) == 0 { - params.Log.V(2).Info("bundleMap is empty, skipping storage secret creation") + params.Log.Info("repository produced no bundle artifacts. skipping storage secret update from bundle map", + "name", params.Instance.Name, + "namespace", params.Instance.Namespace) return nil } diff --git a/pkg/repository/reconcile/statestorage.go b/pkg/repository/reconcile/statestorage.go index f3b29e02..054fce55 100644 --- a/pkg/repository/reconcile/statestorage.go +++ b/pkg/repository/reconcile/statestorage.go @@ -52,7 +52,7 @@ func StateStorage(ctx context.Context, params Params, statestore securityv1alpha return err } - tmpPath := "/tmp/statestore/" + params.Instance.Name + tmpPath := util.StateStoreCacheDir(params.Instance.Name, params.Instance.Namespace) commitTracker := commit + ".txt" fileName := "latest.json" _, dErr := os.Stat(tmpPath) @@ -80,6 +80,7 @@ func StateStorage(ctx context.Context, params Params, statestore securityv1alpha if err != nil { return fmt.Errorf("failed to connect to state store: %w", err) } + defer rc.Close() projects, err := util.DetectGraphmanFolders(repositoryPath) if err != nil { @@ -89,7 +90,7 @@ func StateStorage(ctx context.Context, params Params, statestore securityv1alpha bundles := map[string][]byte{} compressedBundle := map[string][]byte{} for _, p := range projects { - bundle, err := util.BuildAndValidateBundle(p, false) + bundle, err := util.BuildAndValidateBundle(p, false, params.Log) if err != nil { return err } @@ -309,6 +310,7 @@ func GetStateStoreChecksum(ctx context.Context, params Params, statestore securi if err != nil { return "", fmt.Errorf("failed to connect to state store: %w", err) } + defer rc.Close() bundle, err := rc.Get(ctx, params.Instance.Spec.StateStoreKey).Result() if err != nil { @@ -322,6 +324,96 @@ func GetStateStoreChecksum(ctx context.Context, params Params, statestore securi } +// parseStateStoreKeyPayload returns bundle JSON bytes from the Redis value: UTF-8 JSON object or gzip-compressed JSON object. +// The document must be a top-level JSON object ({...}), not an array. +func parseStateStoreKeyPayload(blob []byte) ([]byte, error) { + blob = bytes.TrimSpace(blob) + if len(blob) == 0 { + return nil, fmt.Errorf("empty state store payload") + } + if len(blob) >= 2 && blob[0] == 0x1f && blob[1] == 0x8b { + raw, err := util.GzipDecompress(blob) + if err != nil { + return nil, fmt.Errorf("gzip decompress state store payload: %w", err) + } + blob = bytes.TrimSpace(raw) + if len(blob) == 0 { + return nil, fmt.Errorf("empty state store payload after decompress") + } + } + if blob[0] != '{' { + return nil, fmt.Errorf("state store payload must be a top-level JSON object") + } + return blob, nil +} + +// stateStorePayloadToLatestJSON builds the JSON bytes for latest.json (map[string][]byte with one *.gz key). +func stateStorePayloadToLatestJSON(repoName string, blob []byte) ([]byte, error) { + bundleJSON, err := parseStateStoreKeyPayload(blob) + if err != nil { + return nil, err + } + gz, err := util.GzipCompress(bundleJSON) + if err != nil { + return nil, fmt.Errorf("failed to compress bundle: %w", err) + } + return json.Marshal(map[string][]byte{repoName + ".gz": gz}) +} + +// BuildStateStoreRepositoryCache writes util.StateStoreCacheDir/latest.json for RepositoryTypeStateStore: GET spec.stateStoreKey +// (read-only), single entry {name}.gz with gzip of bundle JSON. Does not write repository data back to Redis. +func BuildStateStoreRepositoryCache(ctx context.Context, params Params, statestore securityv1alpha1.L7StateStore, commit string) error { + tmpPath := util.StateStoreCacheDir(params.Instance.Name, params.Instance.Namespace) + commitTracker := commit + ".txt" + fileName := "latest.json" + if _, err := os.Stat(tmpPath); os.IsNotExist(err) { + if err := os.MkdirAll(tmpPath, 0755); err != nil { + return err + } + } + + latestFullPath := tmpPath + "/" + fileName + if _, err := os.Stat(tmpPath + "/" + commitTracker); err == nil { + if _, err := os.Stat(latestFullPath); err == nil { + return nil + } + } + + if statestore.Spec.Redis.ExistingSecret != "" { + stateStoreSecret, err := getStateStoreSecret(ctx, statestore.Spec.Redis.ExistingSecret, statestore, params) + if err != nil { + return err + } + statestore.Spec.Redis.Username = string(stateStoreSecret.Data["username"]) + statestore.Spec.Redis.MasterPassword = string(stateStoreSecret.Data["masterPassword"]) + } + + rc, err := util.RedisClient(&statestore.Spec.Redis) + if err != nil { + return fmt.Errorf("failed to connect to state store: %w", err) + } + defer rc.Close() + + currentStr, err := rc.Get(ctx, params.Instance.Spec.StateStoreKey).Result() + if err != nil { + return fmt.Errorf("failed to read stateStoreKey from redis: %w", err) + } + + compressedBundleBytes, err := stateStorePayloadToLatestJSON(params.Instance.Name, []byte(currentStr)) + if err != nil { + return err + } + + if err := os.WriteFile(latestFullPath, compressedBundleBytes, 0755); err != nil { + return err + } + if err := os.WriteFile(tmpPath+"/"+commitTracker, []byte{}, 0755); err != nil { + return err + } + + return nil +} + func localRepoStorageInfo(params Params) (storageSecretName string, repositoryPath string, ext string, err error) { ext = params.Instance.Spec.Branch if ext == "" { diff --git a/pkg/repository/reconcile/statestorage_statestore_test.go b/pkg/repository/reconcile/statestorage_statestore_test.go new file mode 100644 index 00000000..e8ba8a3f --- /dev/null +++ b/pkg/repository/reconcile/statestorage_statestore_test.go @@ -0,0 +1,115 @@ +/* +* Copyright (c) 2025 Broadcom. All rights reserved. +* The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries. +* All trademarks, trade names, service marks, and logos referenced +* herein belong to their respective companies. +* +* This software and all information contained therein is confidential +* and proprietary and shall not be duplicated, used, disclosed or +* disseminated in any way except as authorized by the applicable +* license agreement, without the express written permission of Broadcom. +* All authorized reproductions must be marked with this language. +* +* EXCEPT AS SET FORTH IN THE APPLICABLE LICENSE AGREEMENT, TO THE +* EXTENT PERMITTED BY APPLICABLE LAW OR AS AGREED BY BROADCOM IN ITS +* APPLICABLE LICENSE AGREEMENT, BROADCOM PROVIDES THIS DOCUMENTATION +* "AS IS" WITHOUT WARRANTY OF ANY KIND, INCLUDING WITHOUT LIMITATION, +* ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* PURPOSE, OR. NONINFRINGEMENT. IN NO EVENT WILL BROADCOM BE LIABLE TO +* THE END USER OR ANY THIRD PARTY FOR ANY LOSS OR DAMAGE, DIRECT OR +* INDIRECT, FROM THE USE OF THIS DOCUMENTATION, INCLUDING WITHOUT LIMITATION, +* LOST PROFITS, LOST INVESTMENT, BUSINESS INTERRUPTION, GOODWILL, OR +* LOST DATA, EVEN IF BROADCOM IS EXPRESSLY ADVISED IN ADVANCE OF THE +* POSSIBILITY OF SUCH LOSS OR DAMAGE. +* +* AI assistance has been used to generate some or all contents of this file. That includes, but is not limited to, new code, modifying existing code, stylistic edits. + */ + +package reconcile + +import ( + "encoding/json" + "strings" + "testing" + + "github.com/caapim/layer7-operator/internal/graphman" + "github.com/caapim/layer7-operator/pkg/util" +) + +func TestParseStateStoreKeyPayload_rawJSON(t *testing.T) { + blob := []byte(`{"services":[{"name":"x"}]}`) + got, err := parseStateStoreKeyPayload(blob) + if err != nil { + t.Fatal(err) + } + var b graphman.Bundle + if err := json.Unmarshal(got, &b); err != nil { + t.Fatal(err) + } + if len(b.Services) != 1 || b.Services[0].Name != "x" { + t.Fatalf("bundle: %+v", b) + } +} + +func TestParseStateStoreKeyPayload_gzipJSON(t *testing.T) { + raw := []byte(`{"services":[]}`) + gz, err := util.GzipCompress(raw) + if err != nil { + t.Fatal(err) + } + got, err := parseStateStoreKeyPayload(gz) + if err != nil { + t.Fatal(err) + } + var b graphman.Bundle + if err := json.Unmarshal(got, &b); err != nil { + t.Fatal(err) + } +} + +func TestParseStateStoreKeyPayload_emptyError(t *testing.T) { + _, err := parseStateStoreKeyPayload([]byte(" ")) + if err == nil { + t.Fatal("expected error") + } +} + +func TestParseStateStoreKeyPayload_rejectsTopLevelArray(t *testing.T) { + _, err := parseStateStoreKeyPayload([]byte(`[{"name":"x"}]`)) + if err == nil { + t.Fatal("expected error") + } + if !strings.Contains(err.Error(), "top-level JSON object") { + t.Fatalf("unexpected err: %v", err) + } +} + +func TestStateStorePayloadToLatestJSON_shapeAndRoundTrip(t *testing.T) { + repoName := "my-repo" + raw := []byte(`{"services":[{"name":"svc"}]}`) + jsonBytes, err := stateStorePayloadToLatestJSON(repoName, raw) + if err != nil { + t.Fatal(err) + } + + var m map[string][]byte + if err := json.Unmarshal(jsonBytes, &m); err != nil { + t.Fatal(err) + } + key := repoName + ".gz" + gz, ok := m[key] + if !ok || len(m) != 1 { + t.Fatalf("map keys: %#v", m) + } + bundleJSON, err := util.GzipDecompress(gz) + if err != nil { + t.Fatal(err) + } + var b graphman.Bundle + if err := json.Unmarshal(bundleJSON, &b); err != nil { + t.Fatal(err) + } + if len(b.Services) != 1 || b.Services[0].Name != "svc" { + t.Fatalf("services: %+v", b.Services) + } +} diff --git a/pkg/repository/reconcile/suite_test.go b/pkg/repository/reconcile/suite_test.go index 520c0098..60d56001 100644 --- a/pkg/repository/reconcile/suite_test.go +++ b/pkg/repository/reconcile/suite_test.go @@ -13,6 +13,7 @@ import ( "k8s.io/apimachinery/pkg/util/uuid" "k8s.io/client-go/kubernetes/scheme" "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/client/fake" "sigs.k8s.io/controller-runtime/pkg/envtest" logf "sigs.k8s.io/controller-runtime/pkg/log" ) @@ -38,8 +39,16 @@ func TestMain(m *testing.M) { } cfg, err := testEnv.Start() if err != nil { - fmt.Printf("failed to start testEnv: %v", err) - os.Exit(1) + fmt.Fprintf(os.Stderr, "warning: envtest unavailable (%v); using fake client for reconcile tests\n", err) + if err = securityv1.AddToScheme(testScheme); err != nil { + fmt.Printf("failed to register scheme: %v", err) + os.Exit(1) + } + k8sClient = fake.NewClientBuilder(). + WithScheme(testScheme). + WithStatusSubresource(&securityv1.Repository{}). + Build() + os.Exit(m.Run()) } if err = securityv1.AddToScheme(testScheme); err != nil { fmt.Printf("failed to register scheme: %v", err) diff --git a/pkg/statestore/reconcile/statestore.go b/pkg/statestore/reconcile/statestore.go index 19284c07..0b756930 100644 --- a/pkg/statestore/reconcile/statestore.go +++ b/pkg/statestore/reconcile/statestore.go @@ -68,6 +68,8 @@ func RedisStateStore(ctx context.Context, params Params) error { } return err } + defer c.Close() + ping := c.Ping(ctx) pong, err := ping.Result() diff --git a/pkg/util/bundle.go b/pkg/util/bundle.go index 45b9e013..cb312082 100644 --- a/pkg/util/bundle.go +++ b/pkg/util/bundle.go @@ -523,6 +523,41 @@ func BuildDefaultListenPortBundle(refreshOnKeyChanges bool) ([]byte, string, err return bundleBytes, sha1Sum, nil } +// ListenPortNamesExcludedFromGraphmanSync returns listen port names whose TCP port matches +// graphmanPort. Those entries must not be sent in dynamic Graphman bundles while the controller +// uses that port for Graphman, so the active connection is not disrupted. +func ListenPortNamesExcludedFromGraphmanSync(gw *securityv1.Gateway, graphmanPort int) map[string]struct{} { + excluded := make(map[string]struct{}) + if gw == nil || graphmanPort == 0 { + return excluded + } + for _, p := range gw.Spec.App.ListenPorts.Ports { + if p.Port == graphmanPort { + excluded[p.Name] = struct{}{} + } + } + return excluded +} + +// FilterListenPortBundleForGraphmanSync removes listen ports that use graphmanPort from the +// bundle. Bootstrap/configmap bundles should still use the full Build*ListenPortBundle output. +func FilterListenPortBundleForGraphmanSync(bundle *graphman.Bundle, graphmanPort int) { + if bundle == nil || graphmanPort == 0 || len(bundle.ListenPorts) == 0 { + return + } + out := make([]*graphman.ListenPortInput, 0, len(bundle.ListenPorts)) + for _, lp := range bundle.ListenPorts { + if lp == nil { + continue + } + if lp.Port == graphmanPort { + continue + } + out = append(out, lp) + } + bundle.ListenPorts = out +} + func BuildCustomListenPortBundle(gw *securityv1.Gateway, refreshOnKeyChanges bool) ([]byte, string, error) { bundle := graphman.Bundle{} //privateKey := "00000000000000000000000000000002:ssl" diff --git a/pkg/util/bundle_test.go b/pkg/util/bundle_test.go index 7acecf78..6938513f 100755 --- a/pkg/util/bundle_test.go +++ b/pkg/util/bundle_test.go @@ -5,6 +5,7 @@ import ( "testing" securityv1 "github.com/caapim/layer7-operator/api/v1" + "github.com/caapim/layer7-operator/internal/graphman" ) func TestBuildCWPBundle(t *testing.T) { @@ -60,3 +61,31 @@ func TestBuildCustomListenPortBundle(t *testing.T) { t.Errorf("bundle %s, sha1 %s, expected key %s", bundle, sha1, "9090") } } + +func TestListenPortNamesExcludedFromGraphmanSync(t *testing.T) { + gw := securityv1.Gateway{} + gw.Spec.App.ListenPorts.Ports = []securityv1.ListenPort{ + {Name: "a", Port: 8443}, + {Name: "graphman-lp", Port: 9443}, + } + ex := ListenPortNamesExcludedFromGraphmanSync(&gw, 9443) + if _, ok := ex["graphman-lp"]; !ok { + t.Fatalf("expected graphman-lp excluded for port 9443, got %v", ex) + } + if _, ok := ex["a"]; ok { + t.Fatalf("did not expect port 8443 in excluded set") + } +} + +func TestFilterListenPortBundleForGraphmanSync(t *testing.T) { + b := graphman.Bundle{ + ListenPorts: []*graphman.ListenPortInput{ + {Name: "keep", Port: 8443}, + {Name: "drop", Port: 9443}, + }, + } + FilterListenPortBundleForGraphmanSync(&b, 9443) + if len(b.ListenPorts) != 1 || b.ListenPorts[0].Name != "keep" { + t.Fatalf("expected single listen port keep, got %+v", b.ListenPorts) + } +} diff --git a/pkg/util/graphman.go b/pkg/util/graphman.go index ae807363..825bb821 100644 --- a/pkg/util/graphman.go +++ b/pkg/util/graphman.go @@ -44,11 +44,13 @@ import ( "math/big" "os" "path/filepath" + "reflect" "strconv" "strings" "time" graphman "github.com/caapim/layer7-operator/internal/graphman" + "github.com/go-logr/logr" corev1 "k8s.io/api/core/v1" ) @@ -168,9 +170,8 @@ func ConvertX509ToGraphmanBundle(keys []GraphmanKey, notFound []string) ([]byte, KeystoreId: "00000000000000000000000000000002", Pem: key.Key, Alias: key.Name, - //KeyType: "RSA", - SubjectDn: "CN=" + certDN, - CertChain: certsChain, + SubjectDn: "CN=" + certDN, + CertChain: certsChain, } if key.Alias != "" { @@ -191,10 +192,9 @@ func ConvertX509ToGraphmanBundle(keys []GraphmanKey, notFound []string) ([]byte, return nil, err } bundle.Keys = append(bundle.Keys, &graphman.KeyInput{ - Alias: nf, - Pem: key, - CertChain: cert, - //UsageTypes: []graphman.KeyUsageType{graphman.KeyUsageTypeSsl}, + Alias: nf, + Pem: key, + CertChain: cert, KeystoreId: "00000000000000000000000000000002", }) mappingSource := graphman.MappingSource{Alias: nf, KeystoreId: "00000000000000000000000000000002"} @@ -223,7 +223,7 @@ func ConvertCertsToGraphmanBundle(certs []GraphmanCert, notFound []string) ([]by tf = append(tf, graphman.TrustedForType(v)) } revocationCheckPolicyType := graphman.PolicyUsageTypeUseDefault - if cert.RevocationCheckPolicyType == "" { + if cert.RevocationCheckPolicyType != "" { revocationCheckPolicyType = graphman.PolicyUsageType(cert.RevocationCheckPolicyType) } @@ -372,8 +372,8 @@ func DeleteBundle(src []byte) (bundle []byte, err error) { return bundle, nil } -func CompressGraphmanBundle(path string, statestore bool) ([]byte, error) { - bundleBytes, err := BuildAndValidateBundle(path, false) +func CompressGraphmanBundle(path string, statestore bool, log logr.Logger) ([]byte, error) { + bundleBytes, err := BuildAndValidateBundle(path, false, log) if err != nil { return nil, err } @@ -494,7 +494,59 @@ func ConcatBundlesPreservingMappings(bundleMap map[string][]byte) (combinedBundl } -func BuildAndValidateBundle(path string, processNestedRepos bool) (bundleBytes []byte, err error) { +// GraphmanBundleBytesHaveNoEntities reports whether bundle JSON has no Graphman entity collections +// and no mapping instructions. Trivially small payloads (len <= 40) match BuildAndValidateBundle's +// "no valid graphman bundles" threshold. Invalid JSON returns false so callers do not treat parse +// failures as an empty repository bundle. +func GraphmanBundleBytesHaveNoEntities(b []byte) bool { + if len(b) <= 40 { + return true + } + var bundle graphman.Bundle + if err := json.Unmarshal(b, &bundle); err != nil { + return false + } + if graphmanBundleHasEntitySlices(bundle) { + return false + } + if bundle.Properties != nil { + if bundle.Properties.DefaultAction != "" { + return false + } + if graphmanBundleMappingsHaveInstructions(bundle.Properties.Mappings) { + return false + } + } + return true +} + +func graphmanBundleHasEntitySlices(b graphman.Bundle) bool { + v := reflect.ValueOf(b) + t := v.Type() + for i := 0; i < v.NumField(); i++ { + if t.Field(i).Name == "Properties" { + continue + } + f := v.Field(i) + if f.Kind() == reflect.Slice && f.Len() > 0 { + return true + } + } + return false +} + +func graphmanBundleMappingsHaveInstructions(m graphman.BundleMappings) bool { + mv := reflect.ValueOf(m) + for i := 0; i < mv.NumField(); i++ { + f := mv.Field(i) + if f.Kind() == reflect.Slice && f.Len() > 0 { + return true + } + } + return false +} + +func BuildAndValidateBundle(path string, processNestedRepos bool, log logr.Logger) (bundleBytes []byte, err error) { if path == "" { return nil, nil } @@ -508,47 +560,74 @@ func BuildAndValidateBundle(path string, processNestedRepos bool) (bundleBytes [ return nil, err } - _ = filepath.WalkDir(path, func(path string, d fs.DirEntry, err error) error { + walkErr := filepath.WalkDir(path, func(filePath string, d fs.DirEntry, err error) error { if err != nil { return err } - if strings.Contains(path, ".git") { + if strings.Contains(filePath, ".git") { return nil } if !d.IsDir() { segments := strings.Split(d.Name(), ".") ext := segments[len(segments)-1] if ext == "json" && !strings.Contains(strings.ToLower(d.Name()), "sourcesummary.json") && !strings.Contains(strings.ToLower(d.Name()), "bundle-properties.json") { - srcBundleBytes, err := os.ReadFile(path) + // Already merged by graphman.Implode (same parseEntity rules); do not read again. + if _, matched := graphman.ParseEntityPath(filePath, path); matched { + return nil + } + + srcBundleBytes, err := os.ReadFile(filePath) if err != nil { return err } - tb := graphman.Bundle{} - r := bytes.NewReader(srcBundleBytes) - d := json.NewDecoder(r) - d.DisallowUnknownFields() - _ = json.Unmarshal(srcBundleBytes, &tb) - err = d.Decode(&tb) - if err != nil { + // Policy/service alias standalone docs are not full-bundle shaped; handle first. + aliasJSON, ok, err2 := graphman.BundleJSONFromPolicyOrServiceAlias(srcBundleBytes) + if err2 != nil { + return err2 + } + if ok && len(aliasJSON) > 40 { + sbb, err := graphman.ConcatBundle(aliasJSON, bundleBytes) + if err != nil { + return err + } + bundleBytes = sbb return nil } + + // Not graphman bundle JSON (e.g. unrelated repo settings): ignore without failing the build. + if !graphman.IsFullGraphmanBundleJSON(srcBundleBytes) { + log.V(2).Info("ignoring JSON file (not a valid graphman bundle)", "path", filePath) + return nil + } + + // Bundle-shaped document: any parse/validation error fails the whole build. + tb := graphman.Bundle{} + dec := json.NewDecoder(bytes.NewReader(srcBundleBytes)) + dec.DisallowUnknownFields() + if err := dec.Decode(&tb); err != nil { + return fmt.Errorf("graphman bundle JSON in %q could not be parsed or validated: %w", filePath, err) + } tbb, err := json.Marshal(tb) if err != nil { - return nil + return fmt.Errorf("graphman bundle JSON in %q: %w", filePath, err) } if len(tbb) > 40 { sbb, err := graphman.ConcatBundle(srcBundleBytes, bundleBytes) if err != nil { - return nil + return err } bundleBytes = sbb } + return nil } } return nil }) + if walkErr != nil { + return nil, walkErr + } // if the bundle is still empty after parsing all of the directory files // return an error @@ -559,7 +638,9 @@ func BuildAndValidateBundle(path string, processNestedRepos bool) (bundleBytes [ r := bytes.NewReader(bundleBytes) d := json.NewDecoder(r) d.DisallowUnknownFields() - _ = json.Unmarshal(bundleBytes, &bundle) + if err := json.Unmarshal(bundleBytes, &bundle); err != nil { + return nil, fmt.Errorf("merged graphman bundle at %q: %w", path, err) + } err = d.Decode(&bundle) if err != nil { diff --git a/pkg/util/graphman_test.go b/pkg/util/graphman_test.go index 2ad75e24..256b98f7 100755 --- a/pkg/util/graphman_test.go +++ b/pkg/util/graphman_test.go @@ -1,10 +1,183 @@ +/* +* Copyright (c) 2025 Broadcom. All rights reserved. +* The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries. +* All trademarks, trade names, service marks, and logos referenced +* herein belong to their respective companies. +* +* This software and all information contained therein is confidential +* and proprietary and shall not be duplicated, used, disclosed or +* disseminated in any way except as authorized by the applicable +* license agreement, without the express written permission of Broadcom. +* All authorized reproductions must be marked with this language. +* +* EXCEPT AS SET FORTH IN THE APPLICABLE LICENSE AGREEMENT, TO THE +* EXTENT PERMITTED BY APPLICABLE LAW OR AS AGREED BY BROADCOM IN ITS +* APPLICABLE LICENSE AGREEMENT, BROADCOM PROVIDES THIS DOCUMENTATION +* "AS IS" WITHOUT WARRANTY OF ANY KIND, INCLUDING WITHOUT LIMITATION, +* ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* PURPOSE, OR. NONINFRINGEMENT. IN NO EVENT WILL BROADCOM BE LIABLE TO +* THE END USER OR ANY THIRD PARTY FOR ANY LOSS OR DAMAGE, DIRECT OR +* INDIRECT, FROM THE USE OF THIS DOCUMENTATION, INCLUDING WITHOUT LIMITATION, +* LOST PROFITS, LOST INVESTMENT, BUSINESS INTERRUPTION, GOODWILL, OR +* LOST DATA, EVEN IF BROADCOM IS EXPRESSLY ADVISED IN ADVANCE OF THE +* POSSIBILITY OF SUCH LOSS OR DAMAGE. +* +* AI assistance has been used to generate some or all contents of this file. That includes, but is not limited to, new code, modifying existing code, stylistic edits. + */ package util import ( + "encoding/json" + "os" + "path/filepath" "strings" "testing" + + "github.com/caapim/layer7-operator/internal/graphman" + "github.com/go-logr/logr" ) +func TestGraphmanBundleBytesHaveNoEntities(t *testing.T) { + if !GraphmanBundleBytesHaveNoEntities([]byte(`{}`)) { + t.Fatal("expected empty object to have no entities") + } + empty := graphman.Bundle{} + b, err := json.Marshal(empty) + if err != nil { + t.Fatal(err) + } + if !GraphmanBundleBytesHaveNoEntities(b) { + t.Fatal("expected marshaled empty Bundle to have no entities") + } + if !GraphmanBundleBytesHaveNoEntities([]byte(`{"goid":""}`)) { + t.Fatal("expected tiny payload to be treated as empty") + } + withService := graphman.Bundle{ + Services: []*graphman.L7ServiceInput{{Name: "s"}}, + } + b2, err := json.Marshal(withService) + if err != nil { + t.Fatal(err) + } + if GraphmanBundleBytesHaveNoEntities(b2) { + t.Fatal("expected bundle with service to not be empty") + } + longInvalidJSON := make([]byte, 50) + copy(longInvalidJSON, []byte(`not json`)) + if GraphmanBundleBytesHaveNoEntities(longInvalidJSON) { + t.Fatal("invalid JSON should not be treated as empty") + } +} + +func TestBuildAndValidateBundle_LooseFullBundleStrictDecodeFails(t *testing.T) { + d := t.TempDir() + valid := `{ + "clusterProperties": [ + { + "goid": "982cc1ee7369c6ca5a7ae1e4ad866070", + "name": "cfg", + "hiddenProperty": false, + "value": "v" + } + ] +}` + if err := os.WriteFile(filepath.Join(d, "base.json"), []byte(valid), 0644); err != nil { + t.Fatal(err) + } + // Full bundle shape but unknown top-level key fails strict Decode (DisallowUnknownFields). + bad := `{"services":[],"unexpectedTopLevel":true}` + // Filename must not contain a substring that ParseEntityPath treats as an entity + // (e.g. "bad-bundle.json" matches ".service" and would be skipped here). + if err := os.WriteFile(filepath.Join(d, "invalid-full.json"), []byte(bad), 0644); err != nil { + t.Fatal(err) + } + _, err := BuildAndValidateBundle(d, false, logr.Discard()) + if err == nil { + t.Fatal("expected error for invalid full bundle loose JSON") + } + if !strings.Contains(err.Error(), "invalid-full.json") { + t.Fatalf("expected error to mention file path, got: %v", err) + } +} + +func TestBuildAndValidateBundle_UnrelatedJSONIgnored(t *testing.T) { + d := t.TempDir() + valid := `{"services":[{"name":"s","resolutionPath":"/x","enabled":true}]}` + if err := os.WriteFile(filepath.Join(d, "svc.json"), []byte(valid), 0644); err != nil { + t.Fatal(err) + } + if err := os.WriteFile(filepath.Join(d, "settings.json"), []byte(`{"app":{"foo":1}}`), 0644); err != nil { + t.Fatal(err) + } + b, err := BuildAndValidateBundle(d, false, logr.Discard()) + if err != nil { + t.Fatal(err) + } + if len(b) <= 40 { + t.Fatalf("expected non-trivial bundle, len=%d", len(b)) + } +} + +func TestBuildAndValidateBundle_DotServiceStringVersionFails(t *testing.T) { + d := t.TempDir() + // Basename must contain ".service" so parseEntity classifies as .service (readBundle case ".service"). + // L7ServiceInput.Version is int; a JSON string must surface an error with file path (not be dropped). + bad := `{ + "goid": "6d2ca7e0a5c6c9f37dd0b124a6a26532", + "guid": "0ed53d22-bed8-424b-8b4e-68e3e40a9311", + "name": "Rest Api 4", + "resolutionPath": "/api4", + "serviceType": "WEB_API", + "enabled": true, + "version": "1" +}` + path := filepath.Join(d, "api.service.json") + if err := os.WriteFile(path, []byte(bad), 0644); err != nil { + t.Fatal(err) + } + _, err := BuildAndValidateBundle(d, false, logr.Discard()) + if err == nil { + t.Fatal("expected error for invalid .service entity JSON (version must be number)") + } + if !strings.Contains(err.Error(), "api.service.json") { + t.Fatalf("expected error to mention file path, got: %v", err) + } + if !strings.Contains(err.Error(), ".service") { + t.Fatalf("expected error to mention entity kind, got: %v", err) + } +} + +func TestBuildAndValidateBundle_ServicesFolderStringVersionFails(t *testing.T) { + d := t.TempDir() + servicesDir := filepath.Join(d, "services") + if err := os.MkdirAll(servicesDir, 0755); err != nil { + t.Fatal(err) + } + bad := `{ + "goid": "6d2ca7e0a5c6c9f37dd0b124a6a26532", + "guid": "0ed53d22-bed8-424b-8b4e-68e3e40a9311", + "name": "svc", + "resolutionPath": "/api4", + "serviceType": "WEB_API", + "enabled": true, + "version": "1" +}` + path := filepath.Join(servicesDir, "bad.json") + if err := os.WriteFile(path, []byte(bad), 0644); err != nil { + t.Fatal(err) + } + _, err := BuildAndValidateBundle(d, false, logr.Discard()) + if err == nil { + t.Fatal("expected error for invalid JSON under services/") + } + if !strings.Contains(err.Error(), "bad.json") { + t.Fatalf("expected error to mention file path, got: %v", err) + } + if !strings.Contains(err.Error(), "services") { + t.Fatalf("expected error to mention entity kind, got: %v", err) + } +} + func TestConvertOpaqueMapToGraphmanBundle(t *testing.T) { secrets := []GraphmanSecret{{Name: "test1", Secret: "secret1"}, {Name: "test2", Secret: "secret2"}} bundleBytes, err := ConvertOpaqueMapToGraphmanBundle(secrets, []string{}) diff --git a/pkg/util/redis.go b/pkg/util/redis.go index b6fafd45..3c26ed9a 100644 --- a/pkg/util/redis.go +++ b/pkg/util/redis.go @@ -38,6 +38,7 @@ import ( "github.com/redis/go-redis/v9" ) +// RedisClient builds a short-lived go-redis client. Callers must Close() when done to release the connection pool. func RedisClient(c *v1alpha1.Redis) (rdb *redis.Client, err error) { username := "" if c.Username != "" { diff --git a/pkg/util/tmp_paths.go b/pkg/util/tmp_paths.go new file mode 100644 index 00000000..d02e852b --- /dev/null +++ b/pkg/util/tmp_paths.go @@ -0,0 +1,48 @@ +/* +* Copyright (c) 2025 Broadcom. All rights reserved. +* The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries. +* All trademarks, trade names, service marks, and logos referenced +* herein belong to their respective companies. +* +* This software and all information contained therein is confidential +* and proprietary and shall not be duplicated, used, disclosed or +* disseminated in any way except as authorized by the applicable +* license agreement, without the express written permission of Broadcom. +* All authorized reproductions must be marked with this language. +* +* EXCEPT AS SET FORTH IN THE APPLICABLE LICENSE AGREEMENT, TO THE +* EXTENT PERMITTED BY APPLICABLE LAW OR AS AGREED BY BROADCOM IN ITS +* APPLICABLE LICENSE AGREEMENT, BROADCOM PROVIDES THIS DOCUMENTATION +* "AS IS" WITHOUT WARRANTY OF ANY KIND, INCLUDING WITHOUT LIMITATION, +* ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* PURPOSE, OR. NONINFRINGEMENT. IN NO EVENT WILL BROADCOM BE LIABLE TO +* THE END USER OR ANY THIRD PARTY FOR ANY LOSS OR DAMAGE, DIRECT OR +* INDIRECT, FROM THE USE OF THIS DOCUMENTATION, INCLUDING WITHOUT LIMITATION, +* LOST PROFITS, LOST INVESTMENT, BUSINESS INTERRUPTION, GOODWILL, OR +* LOST DATA, EVEN IF BROADCOM IS EXPRESSLY ADVISED IN ADVANCE OF THE +* POSSIBILITY OF SUCH LOSS OR DAMAGE. +* +* AI assistance has been used to generate some or all contents of this file. That includes, but is not limited to, new code, modifying existing code, stylistic edits. + */ + +package util + +import "path/filepath" + +// Repository-scoped /tmp layout: {name}-{namespace} must stay in sync between +// the repository controller and gateway controller (cluster-wide operator, namespaced CRs). + +// RepoCacheDir returns the directory for per-commit bundle map JSON (repo-cache). +func RepoCacheDir(name, namespace string) string { + return filepath.Join("/tmp/repo-cache", name+"-"+namespace) +} + +// StateStoreCacheDir returns the directory for statestore-backed repository temp files. +func StateStoreCacheDir(name, namespace string) string { + return filepath.Join("/tmp/statestore", name+"-"+namespace) +} + +// GatewayBundleWorkDir returns the per-gateway-repository working directory under /tmp/bundles. +func GatewayBundleWorkDir(name, namespace string) string { + return filepath.Join("/tmp/bundles", name+"-"+namespace) +} diff --git a/tests/e2e/gateway-autoscaling/00-install.yaml b/tests/e2e/gateway-autoscaling/00-install.yaml index c6dd0168..59e674a3 100644 --- a/tests/e2e/gateway-autoscaling/00-install.yaml +++ b/tests/e2e/gateway-autoscaling/00-install.yaml @@ -3,13 +3,13 @@ kind: Gateway metadata: name: ssg-autoscaling-test spec: - version: "11.1.3" + version: "11.2.1" license: accept: true secretName: gateway-license app: replicas: 1 - image: docker.io/caapim/gateway:11.1.3 + image: docker.io/caapim/gateway:11.2.1 imagePullPolicy: IfNotPresent management: cluster: diff --git a/tests/e2e/gateway-bundles/00-assert.yaml b/tests/e2e/gateway-bundles/00-assert.yaml index cf185e12..5fe9638e 100644 --- a/tests/e2e/gateway-bundles/00-assert.yaml +++ b/tests/e2e/gateway-bundles/00-assert.yaml @@ -17,7 +17,7 @@ spec: name: ssg-bundle-test - secretRef: name: ssg-bundle-test - image: docker.io/caapim/gateway:11.1.3 + image: docker.io/caapim/gateway:11.2.1 imagePullPolicy: IfNotPresent lifecycle: {} livenessProbe: diff --git a/tests/e2e/gateway-bundles/00-install.yaml b/tests/e2e/gateway-bundles/00-install.yaml index d5fa689f..0e160e7c 100644 --- a/tests/e2e/gateway-bundles/00-install.yaml +++ b/tests/e2e/gateway-bundles/00-install.yaml @@ -43,13 +43,13 @@ kind: Gateway metadata: name: ssg-bundle-test spec: - version: "11.1.3" + version: "11.2.1" license: accept: true secretName: gateway-license app: replicas: 1 - image: docker.io/caapim/gateway:11.1.3 + image: docker.io/caapim/gateway:11.2.1 imagePullPolicy: IfNotPresent #serviceAccountName: ssg-serviceaccount autoscaling: diff --git a/tests/e2e/gateway-configmaps/00-install.yaml b/tests/e2e/gateway-configmaps/00-install.yaml index 2012cb74..df3664ad 100644 --- a/tests/e2e/gateway-configmaps/00-install.yaml +++ b/tests/e2e/gateway-configmaps/00-install.yaml @@ -3,13 +3,13 @@ kind: Gateway metadata: name: ssg-configmap-test spec: - version: "11.1.3" + version: "11.2.1" license: accept: true secretName: gateway-license app: replicas: 1 - image: docker.io/caapim/gateway:11.1.3 + image: docker.io/caapim/gateway:11.2.1 imagePullPolicy: IfNotPresent management: database: diff --git a/tests/e2e/gateway-deployment/00-assert.yaml b/tests/e2e/gateway-deployment/00-assert.yaml index 106b30ad..cb099dbd 100644 --- a/tests/e2e/gateway-deployment/00-assert.yaml +++ b/tests/e2e/gateway-deployment/00-assert.yaml @@ -30,7 +30,7 @@ spec: name: ssg-deployment-test - secretRef: name: ssg-deployment-test - image: docker.io/caapim/gateway:11.1.3 + image: docker.io/caapim/gateway:11.2.1 imagePullPolicy: IfNotPresent lifecycle: postStart: diff --git a/tests/e2e/gateway-deployment/00-install.yaml b/tests/e2e/gateway-deployment/00-install.yaml index 24adaf77..b36370f7 100644 --- a/tests/e2e/gateway-deployment/00-install.yaml +++ b/tests/e2e/gateway-deployment/00-install.yaml @@ -18,13 +18,13 @@ kind: Gateway metadata: name: ssg-deployment-test spec: - version: "11.1.3" + version: "11.2.1" license: accept: true secretName: gateway-license app: replicas: 1 - image: docker.io/caapim/gateway:11.1.3 + image: docker.io/caapim/gateway:11.2.1 imagePullPolicy: IfNotPresent lifecycleHooks: postStart: diff --git a/tests/e2e/gateway-deployment/01-install.yaml b/tests/e2e/gateway-deployment/01-install.yaml index 3732f380..09852a07 100644 --- a/tests/e2e/gateway-deployment/01-install.yaml +++ b/tests/e2e/gateway-deployment/01-install.yaml @@ -3,13 +3,13 @@ kind: Gateway metadata: name: ssg-deployment-test spec: - version: "11.1.3" + version: "11.2.1" license: accept: true secretName: gateway-license app: replicas: 2 - image: docker.io/caapim/gateway:11.1.3 + image: docker.io/caapim/gateway:11.2.1 imagePullPolicy: IfNotPresent lifecycleHooks: postStart: diff --git a/tests/e2e/gateway-externalhazelcast/00-assert.yaml b/tests/e2e/gateway-externalhazelcast/00-assert.yaml index 84a92d5c..b487140f 100644 --- a/tests/e2e/gateway-externalhazelcast/00-assert.yaml +++ b/tests/e2e/gateway-externalhazelcast/00-assert.yaml @@ -17,7 +17,7 @@ spec: name: ssg-hazelcast-test - secretRef: name: ssg-hazelcast-test - image: docker.io/caapim/gateway:11.1.3 + image: docker.io/caapim/gateway:11.2.1 imagePullPolicy: IfNotPresent lifecycle: {} name: gateway diff --git a/tests/e2e/gateway-externalhazelcast/00-install.yaml b/tests/e2e/gateway-externalhazelcast/00-install.yaml index 303f0140..c757db43 100644 --- a/tests/e2e/gateway-externalhazelcast/00-install.yaml +++ b/tests/e2e/gateway-externalhazelcast/00-install.yaml @@ -3,13 +3,13 @@ kind: Gateway metadata: name: ssg-hazelcast-test spec: - version: "11.1.3" + version: "11.2.1" license: accept: true secretName: gateway-license app: replicas: 1 - image: docker.io/caapim/gateway:11.1.3 + image: docker.io/caapim/gateway:11.2.1 imagePullPolicy: IfNotPresent #serviceAccountName: ssg-serviceaccount management: diff --git a/tests/e2e/gateway-ingress/00-install.yaml b/tests/e2e/gateway-ingress/00-install.yaml index fa975d3d..8aa8b555 100644 --- a/tests/e2e/gateway-ingress/00-install.yaml +++ b/tests/e2e/gateway-ingress/00-install.yaml @@ -3,13 +3,13 @@ kind: Gateway metadata: name: ssg-ingress-test spec: - version: "11.1.3" + version: "11.2.1" license: accept: true secretName: gateway-license app: replicas: 1 - image: docker.io/caapim/gateway:11.1.3 + image: docker.io/caapim/gateway:11.2.1 imagePullPolicy: IfNotPresent updateStrategy: type: rollingUpdate diff --git a/tests/e2e/gateway-initcontainer/00-assert.yaml b/tests/e2e/gateway-initcontainer/00-assert.yaml index 5451ab71..f8849c08 100644 --- a/tests/e2e/gateway-initcontainer/00-assert.yaml +++ b/tests/e2e/gateway-initcontainer/00-assert.yaml @@ -21,7 +21,7 @@ spec: name: ssg-initcontainer-test - secretRef: name: ssg-initcontainer-test - image: docker.io/caapim/gateway:11.1.3 + image: docker.io/caapim/gateway:11.2.1 imagePullPolicy: IfNotPresent lifecycle: {} name: gateway diff --git a/tests/e2e/gateway-initcontainer/00-install.yaml b/tests/e2e/gateway-initcontainer/00-install.yaml index 847f499b..fbaf6b78 100644 --- a/tests/e2e/gateway-initcontainer/00-install.yaml +++ b/tests/e2e/gateway-initcontainer/00-install.yaml @@ -3,13 +3,13 @@ kind: Gateway metadata: name: ssg-initcontainer-test spec: - version: "11.1.3" + version: "11.2.1" license: accept: true secretName: gateway-license app: replicas: 1 - image: docker.io/caapim/gateway:11.1.3 + image: docker.io/caapim/gateway:11.2.1 imagePullPolicy: IfNotPresent management: cluster: diff --git a/tests/e2e/gateway-nodeselector/00-install.yaml b/tests/e2e/gateway-nodeselector/00-install.yaml index c462a376..e6a2b134 100644 --- a/tests/e2e/gateway-nodeselector/00-install.yaml +++ b/tests/e2e/gateway-nodeselector/00-install.yaml @@ -3,13 +3,13 @@ kind: Gateway metadata: name: ssg-nodeselector-test spec: - version: "11.1.3" + version: "11.2.1" license: accept: true secretName: gateway-license app: replicas: 1 - image: docker.io/caapim/gateway:11.1.3 + image: docker.io/caapim/gateway:11.2.1 imagePullPolicy: IfNotPresent management: cluster: diff --git a/tests/e2e/gateway-prestopscript/00-install.yaml b/tests/e2e/gateway-prestopscript/00-install.yaml index 1edceca7..76571465 100644 --- a/tests/e2e/gateway-prestopscript/00-install.yaml +++ b/tests/e2e/gateway-prestopscript/00-install.yaml @@ -3,13 +3,13 @@ kind: Gateway metadata: name: ssg-lifecycle-test spec: - version: "11.1.3" + version: "11.2.1" license: accept: true secretName: gateway-license app: replicas: 1 - image: docker.io/caapim/gateway:11.1.3 + image: docker.io/caapim/gateway:11.2.1 imagePullPolicy: IfNotPresent #serviceAccountName: ssg-serviceaccount management: diff --git a/tests/e2e/gateway-secret/00-install.yaml b/tests/e2e/gateway-secret/00-install.yaml index 8b1ffd8e..d270da94 100644 --- a/tests/e2e/gateway-secret/00-install.yaml +++ b/tests/e2e/gateway-secret/00-install.yaml @@ -3,13 +3,13 @@ kind: Gateway metadata: name: ssg-secret-test spec: - version: "11.1.3" + version: "11.2.1" license: accept: true secretName: gateway-license app: replicas: 1 - image: docker.io/caapim/gateway:11.1.3 + image: docker.io/caapim/gateway:11.2.1 imagePullPolicy: IfNotPresent updateStrategy: type: rollingUpdate diff --git a/tests/e2e/gateway-serviceaccounttoken/00-assert.yaml b/tests/e2e/gateway-serviceaccounttoken/00-assert.yaml index 4aae8d33..392f18c0 100644 --- a/tests/e2e/gateway-serviceaccounttoken/00-assert.yaml +++ b/tests/e2e/gateway-serviceaccounttoken/00-assert.yaml @@ -21,7 +21,7 @@ spec: name: ssg-sa-test - secretRef: name: ssg-sa-test - image: docker.io/caapim/gateway:11.1.3 + image: docker.io/caapim/gateway:11.2.1 imagePullPolicy: IfNotPresent lifecycle: {} name: gateway diff --git a/tests/e2e/gateway-serviceaccounttoken/00-install.yaml b/tests/e2e/gateway-serviceaccounttoken/00-install.yaml index e2c22f39..44c5b945 100644 --- a/tests/e2e/gateway-serviceaccounttoken/00-install.yaml +++ b/tests/e2e/gateway-serviceaccounttoken/00-install.yaml @@ -3,13 +3,13 @@ kind: Gateway metadata: name: ssg-sa-test spec: - version: "11.1.3" + version: "11.2.1" license: accept: true secretName: gateway-license app: replicas: 1 - image: docker.io/caapim/gateway:11.1.3 + image: docker.io/caapim/gateway:11.2.1 imagePullPolicy: IfNotPresent management: cluster: diff --git a/tests/e2e/gateway-services/00-install.yaml b/tests/e2e/gateway-services/00-install.yaml index c79a0e95..c45df7d0 100644 --- a/tests/e2e/gateway-services/00-install.yaml +++ b/tests/e2e/gateway-services/00-install.yaml @@ -3,13 +3,13 @@ kind: Gateway metadata: name: ssg-service-test spec: - version: "11.1.3" + version: "11.2.1" license: accept: true secretName: gateway-license app: replicas: 1 - image: docker.io/caapim/gateway:11.1.3 + image: docker.io/caapim/gateway:11.2.1 imagePullPolicy: IfNotPresent management: cluster: diff --git a/tests/e2e/gateway-sidecars/00-assert.yaml b/tests/e2e/gateway-sidecars/00-assert.yaml index 07a2b008..35b52d09 100644 --- a/tests/e2e/gateway-sidecars/00-assert.yaml +++ b/tests/e2e/gateway-sidecars/00-assert.yaml @@ -21,7 +21,7 @@ spec: name: ssg-sidecar-test - secretRef: name: ssg-sidecar-test - image: docker.io/caapim/gateway:11.1.3 + image: docker.io/caapim/gateway:11.2.1 imagePullPolicy: IfNotPresent lifecycle: {} name: gateway diff --git a/tests/e2e/gateway-sidecars/00-install.yaml b/tests/e2e/gateway-sidecars/00-install.yaml index 0dcc6653..c3cab338 100644 --- a/tests/e2e/gateway-sidecars/00-install.yaml +++ b/tests/e2e/gateway-sidecars/00-install.yaml @@ -3,13 +3,13 @@ kind: Gateway metadata: name: ssg-sidecar-test spec: - version: "11.1.3" + version: "11.2.1" license: accept: true secretName: gateway-license app: replicas: 1 - image: docker.io/caapim/gateway:11.1.3 + image: docker.io/caapim/gateway:11.2.1 imagePullPolicy: IfNotPresent management: cluster: