diff --git a/config/300-crds/300-pipelinerun.yaml b/config/300-crds/300-pipelinerun.yaml index 4ac91c25be4..3516d547b08 100644 --- a/config/300-crds/300-pipelinerun.yaml +++ b/config/300-crds/300-pipelinerun.yaml @@ -2565,8 +2565,6 @@ spec: type: boolean coschedule: type: string - disableAffinityAssistant: - type: boolean disableCredsInit: type: boolean disableInlineSpec: @@ -2979,8 +2977,6 @@ spec: type: boolean coschedule: type: string - disableAffinityAssistant: - type: boolean disableCredsInit: type: boolean disableInlineSpec: @@ -3267,8 +3263,6 @@ spec: type: boolean coschedule: type: string - disableAffinityAssistant: - type: boolean disableCredsInit: type: boolean disableInlineSpec: @@ -5876,8 +5870,6 @@ spec: type: boolean coschedule: type: string - disableAffinityAssistant: - type: boolean disableCredsInit: type: boolean disableInlineSpec: diff --git a/config/300-crds/300-taskrun.yaml b/config/300-crds/300-taskrun.yaml index b25bf427b26..dc43cf7a378 100644 --- a/config/300-crds/300-taskrun.yaml +++ b/config/300-crds/300-taskrun.yaml @@ -1948,8 +1948,6 @@ spec: type: boolean coschedule: type: string - disableAffinityAssistant: - type: boolean disableCredsInit: type: boolean disableInlineSpec: @@ -2236,8 +2234,6 @@ spec: type: boolean coschedule: type: string - disableAffinityAssistant: - type: boolean disableCredsInit: type: boolean disableInlineSpec: @@ -4135,8 +4131,6 @@ spec: type: boolean coschedule: type: string - disableAffinityAssistant: - type: boolean disableCredsInit: type: boolean disableInlineSpec: @@ -4389,8 +4383,6 @@ spec: type: boolean coschedule: type: string - disableAffinityAssistant: - type: boolean disableCredsInit: type: boolean disableInlineSpec: diff --git a/config/config-feature-flags.yaml b/config/config-feature-flags.yaml index 0fbc9ecbd55..c1b3f387e8a 100644 --- a/config/config-feature-flags.yaml +++ b/config/config-feature-flags.yaml @@ -21,17 +21,6 @@ metadata: app.kubernetes.io/instance: default app.kubernetes.io/part-of: tekton-pipelines data: - # Setting this flag to "true" will prevent Tekton to create an - # Affinity Assistant for every TaskRun sharing a PVC workspace - # - # The default behaviour is for Tekton to create Affinity Assistants - # - # See more in the Affinity Assistant documentation - # https://github.com/tektoncd/pipeline/blob/main/docs/affinityassistants.md - # or https://github.com/tektoncd/pipeline/pull/2630 for more info. - # - # Note: This feature flag is deprecated and will be removed in release v0.60. Consider using `coschedule` feature flag to configure Affinity Assistant behavior. - disable-affinity-assistant: "false" # Setting this flag will determine how PipelineRun Pods are scheduled with Affinity Assistant. # Acceptable values are "workspaces" (default), "pipelineruns", "isolate-pipelinerun", or "disabled". # diff --git a/docs/additional-configs.md b/docs/additional-configs.md index 5d85a84b984..ad853a396d3 100644 --- a/docs/additional-configs.md +++ b/docs/additional-configs.md @@ -275,21 +275,6 @@ that are running while the change occurs. The flags in this ConfigMap are as follows: -- `disable-affinity-assistant` - set this flag to `true` to disable the [Affinity Assistant](./affinityassistants) - that is used to provide Node Affinity for `TaskRun` pods that share workspace volume. - The Affinity Assistant is incompatible with other affinity rules - configured for `TaskRun` pods. - - **Note:** This feature flag is deprecated and will be removed in release `v0.60`. Consider using `coschedule` feature flag to configure Affinity Assistant behavior. - - **Note:** Affinity Assistant use [Inter-pod affinity and anti-affinity](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity) - that require substantial amount of processing which can slow down scheduling in large clusters - significantly. We do not recommend using them in clusters larger than several hundred nodes - - **Note:** Pod anti-affinity requires nodes to be consistently labelled, in other words every - node in the cluster must have an appropriate label matching `topologyKey`. If some or all nodes - are missing the specified `topologyKey` label, it can lead to unintended behavior. - - `coschedule`: set this flag determines how PipelineRun Pods are scheduled with [Affinity Assistant](./affinityassistants). Acceptable values are "workspaces" (default), "pipelineruns", "isolate-pipelinerun", or "disabled". Setting it to "workspaces" will schedule all the taskruns sharing the same PVC-based workspace in a pipelinerun to the same node. diff --git a/docs/affinityassistants.md b/docs/affinityassistants.md index 8fdc84e3f9b..05b9b52b57d 100644 --- a/docs/affinityassistants.md +++ b/docs/affinityassistants.md @@ -6,10 +6,11 @@ weight: 405 --> # Affinity Assistants + Affinity Assistant is a feature to coschedule `PipelineRun` `pods` to the same node based on [kubernetes pod affinity](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity) so that it possible for the taskruns to execute parallel while sharing volume. Available Affinity Assistant Modes are **coschedule workspaces**, **coschedule pipelineruns**, -**isolate pipelinerun** and **disabled**. +**isolate pipelinerun** and **disabled**. > :seedling: **coschedule pipelineruns** and **isolate pipelinerun** modes are [**alpha features**](./additional-configs.md#alpha-features). > **coschedule workspaces** is a **stable feature** @@ -27,10 +28,10 @@ and only one PipelineRun is allowed to run on a node at a time. This means that Affinity Assistant is incompatible with other affinity rules configured for the `TaskRun` pods (i.e. other affinity rules specified in custom [PodTemplate](pipelineruns.md#specifying-a-pod-template) will be overwritten by Affinity Assistant). If the `PipelineRun` has a custom [PodTemplate](pipelineruns.md#specifying-a-pod-template) configured, the `NodeSelector` and `Tolerations` fields will also be set on the Affinity Assistant pod. The Affinity Assistant -is deleted when the `PipelineRun` is completed. +is deleted when the `PipelineRun` is completed. -Currently, the Affinity Assistant Modes can be configured by the `disable-affinity-assistant` and `coschedule` feature flags. -The `disable-affinity-assistant` feature flag is now deprecated and will be removed in release `v0.60`. At the time, the Affinity Assistant Modes will be only determined by the `coschedule` feature flag. +The Affinity Assistant Modes are configured by the `coschedule` feature flag. +Previously, it was also controlled by the `disable-affinity-assistant` feature flag which was deprecated and removed after release `v0.68`. The following chart summarizes the Affinity Assistant Modes with different combinations of the `disable-affinity-assistant` and `coschedule` feature flags during migration (when both feature flags are present) and after the migration (when only the `coschedule` flag is present). @@ -95,7 +96,7 @@ The following chart summarizes the Affinity Assistant Modes with different combi -**Note:** For users who previously accepted the default behavior (`disable-affinity-assistant`: `false`) but now want one of the new features, you need to set `disable-affinity-assistant` to "true" and then turn on the new behavior by setting the `coschedule` flag. For users who previously disabled the affinity assistant but want one of the new features, just set the `coschedule` flag accordingly. +**Note:** After release `v0.68`, the `disable-affinity-assistant` feature flag is removed and the Affinity Assistant Modes are only controlled by the `coschedule` feature flag. **Note:** Affinity Assistant use [Inter-pod affinity and anti-affinity](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity) that require substantial amount of processing which can slow down scheduling in large clusters diff --git a/docs/artifacts.md b/docs/artifacts.md index 040c4f60276..549ce1f2e5c 100644 --- a/docs/artifacts.md +++ b/docs/artifacts.md @@ -501,7 +501,6 @@ Upon resolution and execution of the `TaskRun`, the `Status` will look something "featureFlags": { "awaitSidecarReadiness": true, "coschedule": "workspaces", - "disableAffinityAssistant": false, "disableCredsInit": false, "disableInlineSpec": "", "enableAPIFields": "beta", diff --git a/docs/deprecations.md b/docs/deprecations.md index 2421432ee42..011ad3884df 100644 --- a/docs/deprecations.md +++ b/docs/deprecations.md @@ -26,7 +26,6 @@ The following features are deprecated but have not yet been removed. | [The `config-trusted-resources` configMap is deprecated](https://github.com/tektoncd/pipeline/issues/5852) | v0.45.0 | Alpha | v0.46.0 | | [The `default-cloud-events-sink` setting in the `config-defaults` configMap is deprecated](https://github.com/tektoncd/pipeline/pull/6883) in favour of the new `config-events` configMap. | v0.50.0 | N/A | v0.59.0 | | [v1beta1 Tasks, TaskRuns, Pipelines, and PipelineRuns are deprecated in favor of v1](https://github.com/tektoncd/pipeline/issues/5541) | v0.50.0 | Beta | v0.62.0 | -| [The `disable-affinity-assistant` feature flag is deprecated in favor of the `coschedule` feature flag](https://github.com/tektoncd/pipeline/issues/6988) | v0.51.0 | N/A | April 27, 2024 | | The `resolver framework` is [deprecated](https://github.com/tektoncd/pipeline/pull/7945) in favor of an [upgraded framework](https://github.com/tektoncd/pipeline/pull/7910) | v0.60.0 | N/A | v0.72. | ### v1beta1 deprecation @@ -46,6 +45,8 @@ The features listed below have been removed but may still be supported in releas | [The `PipelineRun.Status.TaskRuns` and `PipelineRun.Status.Runs` fields and the `embedded-status` feature flag along with their functionalities have been tombstoned since v0.45.](https://github.com/tektoncd/community/blob/main/teps/0100-embedded-taskruns-and-runs-status-in-pipelineruns.md) | [[TEP100] Remove Taskruns and Runs Fields for PipelineRunStatus](https://github.com/tektoncd/pipeline/pull/6099) | Jan 25, 2023 | v0.44.0 | Jan 24, 2024 | | PipelineResources are removed, along with the components of the API that rely on them as proposed in [TEP-0074](https://github.com/tektoncd/community/blob/main/teps/0074-deprecate-pipelineresources.md). See [Removed `PipelineResources` related features](#removed-pipelineresources-related-features) for more info. | [[TEP074] Remove Generic PipelineResources with Rest of Resources Types](https://github.com/tektoncd/pipeline/pull/6150) | Mar 8, 2023 | v0.44.0 | Jan 24, 2024 | | v1alpha1 Runs are removed, as proposed in [TEP-0114](https://github.com/tektoncd/community/blob/main/teps/0114-custom-tasks-beta.md), along with the feature flags `enable-custom-task` and `custom-task-version`. | [TEP-0114: Remove support for v1alpha1.Run](https://github.com/tektoncd/pipeline/pull/6508) | April 7, 2023 | v0.44.0 | Jan 24, 2024 | +| [The `disable-affinity-assistant` feature flag is deprecated in favor of the `coschedule` feature flag](https://github.com/tektoncd/community/blob/main/teps/0135-coscheduling-pipelinerun-pods.md#tep-0135-coscheduling-pipelinerun-pods) | [cleanup: [TEP-0135] remove deprecated disable-affinity-assistant feature flag](https://github.com/tektoncd/pipeline/pull/8603) | Mar 1, 2025 | v0.68.0 | Jan 30, 2026 | + ### Removed PipelineResources related features: diff --git a/pkg/apis/config/feature_flags.go b/pkg/apis/config/feature_flags.go index 9f5780d88c1..8f65748d6c4 100644 --- a/pkg/apis/config/feature_flags.go +++ b/pkg/apis/config/feature_flags.go @@ -60,8 +60,6 @@ const ( ResultExtractionMethodTerminationMessage = "termination-message" // ResultExtractionMethodSidecarLogs is the value used for "results-from" as a way to extract results from tasks using sidecar logs. ResultExtractionMethodSidecarLogs = "sidecar-logs" - // DefaultDisableAffinityAssistant is the default value for "disable-affinity-assistant". - DefaultDisableAffinityAssistant = false // DefaultDisableCredsInit is the default value for "disable-creds-init". DefaultDisableCredsInit = false // DefaultRunningInEnvWithInjectedSidecars is the default value for "running-in-environment-with-injected-sidecars". @@ -119,7 +117,6 @@ const ( // in Taskrun or Pipelinerun DisableInlineSpec = "disable-inline-spec" - disableAffinityAssistantKey = "disable-affinity-assistant" disableCredsInitKey = "disable-creds-init" runningInEnvWithInjectedSidecarsKey = "running-in-environment-with-injected-sidecars" awaitSidecarReadinessKey = "await-sidecar-readiness" @@ -188,12 +185,9 @@ var ( // FeatureFlags holds the features configurations // +k8s:deepcopy-gen=true type FeatureFlags struct { - DisableAffinityAssistant bool `json:"disableAffinityAssistant,omitempty"` DisableCredsInit bool `json:"disableCredsInit,omitempty"` RunningInEnvWithInjectedSidecars bool `json:"runningInEnvWithInjectedSidecars,omitempty"` RequireGitSSHSecretKnownHosts bool `json:"requireGitSSHSecretKnownHosts,omitempty"` - // EnableTektonOCIBundles bool // Deprecated: this is now ignored - // ScopeWhenExpressionsToTask bool // Deprecated: this is now ignored EnableAPIFields string `json:"enableAPIFields,omitempty"` SendCloudEventsForRuns bool `json:"sendCloudEventsForRuns,omitempty"` @@ -259,9 +253,6 @@ func NewFeatureFlagsFromMap(cfgMap map[string]string) (*FeatureFlags, error) { } tc := FeatureFlags{} - if err := setFeature(disableAffinityAssistantKey, DefaultDisableAffinityAssistant, &tc.DisableAffinityAssistant); err != nil { - return nil, err - } if err := setFeature(disableCredsInitKey, DefaultDisableCredsInit, &tc.DisableCredsInit); err != nil { return nil, err } @@ -304,7 +295,7 @@ func NewFeatureFlagsFromMap(cfgMap map[string]string) (*FeatureFlags, error) { if err := setFeature(setSecurityContextReadOnlyRootFilesystemKey, DefaultSetSecurityContextReadOnlyRootFilesystem, &tc.SetSecurityContextReadOnlyRootFilesystem); err != nil { return nil, err } - if err := setCoschedule(cfgMap, DefaultCoschedule, tc.DisableAffinityAssistant, &tc.Coschedule); err != nil { + if err := setCoschedule(cfgMap, DefaultCoschedule, &tc.Coschedule); err != nil { return nil, err } if err := setPerFeatureFlag(EnableCELInWhenExpression, DefaultEnableCELInWhenExpression, &tc.EnableCELInWhenExpression); err != nil { @@ -350,8 +341,7 @@ func setEnabledAPIFields(cfgMap map[string]string, defaultValue string, feature } // setCoschedule sets the "coschedule" flag based on the content of a given map. -// If the feature gate is invalid or incompatible with `disable-affinity-assistant`, then an error is returned. -func setCoschedule(cfgMap map[string]string, defaultValue string, disabledAffinityAssistant bool, feature *string) error { +func setCoschedule(cfgMap map[string]string, defaultValue string, feature *string) error { value := defaultValue if cfg, ok := cfgMap[coscheduleKey]; ok { value = strings.ToLower(cfg) @@ -359,11 +349,6 @@ func setCoschedule(cfgMap map[string]string, defaultValue string, disabledAffini switch value { case CoscheduleDisabled, CoscheduleWorkspaces, CoschedulePipelineRuns, CoscheduleIsolatePipelineRun: - // validate that "coschedule" is compatible with "disable-affinity-assistant" - // "coschedule" must be set to "workspaces" when "disable-affinity-assistant" is false - if !disabledAffinityAssistant && value != CoscheduleWorkspaces { - return fmt.Errorf("coschedule value %v is incompatible with %v setting to false", value, disableAffinityAssistantKey) - } *feature = value default: return fmt.Errorf("invalid value for feature flag %q: %q", coscheduleKey, value) diff --git a/pkg/apis/config/feature_flags_test.go b/pkg/apis/config/feature_flags_test.go index e1084e09ad0..0abf74da639 100644 --- a/pkg/apis/config/feature_flags_test.go +++ b/pkg/apis/config/feature_flags_test.go @@ -38,7 +38,6 @@ func TestNewFeatureFlagsFromConfigMap(t *testing.T) { testCases := []testCase{ { expectedConfig: &config.FeatureFlags{ - DisableAffinityAssistant: false, RunningInEnvWithInjectedSidecars: true, RequireGitSSHSecretKnownHosts: false, DisableCredsInit: config.DefaultDisableCredsInit, @@ -63,7 +62,6 @@ func TestNewFeatureFlagsFromConfigMap(t *testing.T) { }, { expectedConfig: &config.FeatureFlags{ - DisableAffinityAssistant: true, RunningInEnvWithInjectedSidecars: false, AwaitSidecarReadiness: false, RequireGitSSHSecretKnownHosts: true, @@ -94,7 +92,6 @@ func TestNewFeatureFlagsFromConfigMap(t *testing.T) { // These are prescribed as true by enabling "alpha" API fields, even // if the submitted text value is "false". EnforceNonfalsifiability: config.DefaultEnforceNonfalsifiability, - DisableAffinityAssistant: config.DefaultDisableAffinityAssistant, DisableCredsInit: config.DefaultDisableCredsInit, RunningInEnvWithInjectedSidecars: config.DefaultRunningInEnvWithInjectedSidecars, AwaitSidecarReadiness: config.DefaultAwaitSidecarReadiness, @@ -119,7 +116,6 @@ func TestNewFeatureFlagsFromConfigMap(t *testing.T) { expectedConfig: &config.FeatureFlags{ EnableAPIFields: "stable", EnforceNonfalsifiability: config.DefaultEnforceNonfalsifiability, - DisableAffinityAssistant: config.DefaultDisableAffinityAssistant, DisableCredsInit: config.DefaultDisableCredsInit, RunningInEnvWithInjectedSidecars: config.DefaultRunningInEnvWithInjectedSidecars, AwaitSidecarReadiness: config.DefaultAwaitSidecarReadiness, @@ -140,7 +136,6 @@ func TestNewFeatureFlagsFromConfigMap(t *testing.T) { expectedConfig: &config.FeatureFlags{ EnableAPIFields: "beta", EnforceNonfalsifiability: config.DefaultEnforceNonfalsifiability, - DisableAffinityAssistant: config.DefaultDisableAffinityAssistant, DisableCredsInit: config.DefaultDisableCredsInit, RunningInEnvWithInjectedSidecars: config.DefaultRunningInEnvWithInjectedSidecars, AwaitSidecarReadiness: config.DefaultAwaitSidecarReadiness, @@ -211,7 +206,6 @@ func TestNewFeatureFlagsFromConfigMap(t *testing.T) { func TestNewFeatureFlagsFromEmptyConfigMap(t *testing.T) { FeatureFlagsConfigEmptyName := "feature-flags-empty" expectedConfig := &config.FeatureFlags{ - DisableAffinityAssistant: config.DefaultDisableAffinityAssistant, DisableCredsInit: config.DefaultDisableCredsInit, RunningInEnvWithInjectedSidecars: config.DefaultRunningInEnvWithInjectedSidecars, AwaitSidecarReadiness: config.DefaultAwaitSidecarReadiness, @@ -286,9 +280,6 @@ func TestNewFeatureFlagsConfigMapErrors(t *testing.T) { }, { fileName: "feature-flags-enforce-nonfalsifiability-bad-flag", want: `invalid value for feature flag "enforce-nonfalsifiability": "bad-value"`, - }, { - fileName: "feature-flags-invalid-coschedule-affinity-assistant-comb", - want: `coschedule value pipelineruns is incompatible with disable-affinity-assistant setting to false`, }, { fileName: "feature-flags-invalid-coschedule", want: `invalid value for feature flag "coschedule": "invalid"`, @@ -298,9 +289,6 @@ func TestNewFeatureFlagsConfigMapErrors(t *testing.T) { }, { fileName: "feature-flags-invalid-running-in-environment-with-injected-sidecars", want: `failed parsing feature flags config "invalid-boolean": strconv.ParseBool: parsing "invalid-boolean": invalid syntax`, - }, { - fileName: "feature-flags-invalid-disable-affinity-assistant", - want: `failed parsing feature flags config "truee": strconv.ParseBool: parsing "truee": invalid syntax`, }, { fileName: "feature-flags-invalid-enable-cel-in-whenexpression", want: `failed parsing feature flags config "invalid": strconv.ParseBool: parsing "invalid": invalid syntax for feature enable-cel-in-whenexpression`, diff --git a/pkg/apis/config/testdata/feature-flags-all-flags-set.yaml b/pkg/apis/config/testdata/feature-flags-all-flags-set.yaml index e16b67f1db2..0a75c477746 100644 --- a/pkg/apis/config/testdata/feature-flags-all-flags-set.yaml +++ b/pkg/apis/config/testdata/feature-flags-all-flags-set.yaml @@ -18,7 +18,6 @@ metadata: name: feature-flags namespace: tekton-pipelines data: - disable-affinity-assistant: "true" coschedule: "disabled" running-in-environment-with-injected-sidecars: "false" await-sidecar-readiness: "false" diff --git a/pkg/apis/config/testdata/feature-flags-invalid-coschedule-affinity-assistant-comb.yaml b/pkg/apis/config/testdata/feature-flags-invalid-coschedule-affinity-assistant-comb.yaml deleted file mode 100644 index 9b1ea65c16c..00000000000 --- a/pkg/apis/config/testdata/feature-flags-invalid-coschedule-affinity-assistant-comb.yaml +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright 2023 The Tekton Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -apiVersion: v1 -kind: ConfigMap -metadata: - name: feature-flags - namespace: tekton-pipelines -data: - coschedule: "pipelineruns" - disable-affinity-assistant: "false" diff --git a/pkg/apis/config/testdata/feature-flags-invalid-disable-affinity-assistant.yaml b/pkg/apis/config/testdata/feature-flags-invalid-disable-affinity-assistant.yaml deleted file mode 100644 index f6940f7b4cb..00000000000 --- a/pkg/apis/config/testdata/feature-flags-invalid-disable-affinity-assistant.yaml +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright 2023 The Tekton Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -apiVersion: v1 -kind: ConfigMap -metadata: - name: feature-flags - namespace: tekton-pipelines -data: - disable-affinity-assistant: "truee" diff --git a/pkg/apis/config/testdata/feature-flags.yaml b/pkg/apis/config/testdata/feature-flags.yaml index e3de04caae7..74080f172f0 100644 --- a/pkg/apis/config/testdata/feature-flags.yaml +++ b/pkg/apis/config/testdata/feature-flags.yaml @@ -18,6 +18,5 @@ metadata: name: feature-flags namespace: tekton-pipelines data: - disable-affinity-assistant: "false" running-in-environment-with-injected-sidecars: "true" require-git-ssh-secret-known-hosts: "false" diff --git a/pkg/internal/affinityassistant/affinityassistant_types.go b/pkg/internal/affinityassistant/affinityassistant_types.go index a2c0fe622ec..ede1b6f2130 100644 --- a/pkg/internal/affinityassistant/affinityassistant_types.go +++ b/pkg/internal/affinityassistant/affinityassistant_types.go @@ -31,30 +31,23 @@ const ( AffinityAssistantPerPipelineRunWithIsolation = AffinityAssistantBehavior("AffinityAssistantPerPipelineRunWithIsolation") ) -// GetAffinityAssistantBehavior returns an AffinityAssistantBehavior based on the -// combination of "disable-affinity-assistant" and "coschedule" feature flags -// TODO(#6740)(WIP): consume this function in the PipelineRun reconciler to determine Affinity Assistant behavior. +// GetAffinityAssistantBehavior returns an AffinityAssistantBehavior based on the "coschedule" feature flags func GetAffinityAssistantBehavior(ctx context.Context) (AffinityAssistantBehavior, error) { cfg := config.FromContextOrDefaults(ctx) - disableAA := cfg.FeatureFlags.DisableAffinityAssistant coschedule := cfg.FeatureFlags.Coschedule - // at this point, we have validated that "coschedule" can only be "workspaces" - // when "disable-affinity-assistant" is false - if !disableAA { - return AffinityAssistantPerWorkspace, nil - } - switch coschedule { case config.CoschedulePipelineRuns: return AffinityAssistantPerPipelineRun, nil case config.CoscheduleIsolatePipelineRun: return AffinityAssistantPerPipelineRunWithIsolation, nil - case config.CoscheduleDisabled, config.CoscheduleWorkspaces: + case config.CoscheduleWorkspaces: + return AffinityAssistantPerWorkspace, nil + case config.CoscheduleDisabled: return AffinityAssistantDisabled, nil } - return "", fmt.Errorf("unknown combination of disable-affinity-assistant: %v and coschedule: %v", disableAA, coschedule) + return "", fmt.Errorf("unknown affinity assistant coschedule: %v", coschedule) } // ContainerConfig defines AffinityAssistant container configuration diff --git a/pkg/internal/affinityassistant/affinityassistant_types_test.go b/pkg/internal/affinityassistant/affinityassistant_types_test.go index 58d677bf8f0..2978ab32b11 100644 --- a/pkg/internal/affinityassistant/affinityassistant_types_test.go +++ b/pkg/internal/affinityassistant/affinityassistant_types_test.go @@ -30,37 +30,27 @@ func Test_GetAffinityAssistantBehavior(t *testing.T) { configMap map[string]string expect AffinityAssistantBehavior }{{ - name: "affinity-assistant-enabled", + name: "coschedule-workspaces", configMap: map[string]string{ - "disable-affinity-assistant": "false", + "coschedule": config.CoscheduleWorkspaces, }, expect: AffinityAssistantPerWorkspace, }, { - name: "affinity-assistant-disabled-coschedule-workspaces", + name: "coschedule-pipelineruns", configMap: map[string]string{ - "disable-affinity-assistant": "true", - "coschedule": config.CoscheduleWorkspaces, - }, - expect: AffinityAssistantDisabled, - }, { - name: "affinity-assistant-disabled-coschedule-pipelineruns", - configMap: map[string]string{ - "disable-affinity-assistant": "true", - "coschedule": config.CoschedulePipelineRuns, + "coschedule": config.CoschedulePipelineRuns, }, expect: AffinityAssistantPerPipelineRun, }, { - name: "affinity-assistant-disabled-coschedule-isolate-pipelinerun", + name: "coschedule-isolate-pipelinerun", configMap: map[string]string{ - "disable-affinity-assistant": "true", - "coschedule": config.CoscheduleIsolatePipelineRun, + "coschedule": config.CoscheduleIsolatePipelineRun, }, expect: AffinityAssistantPerPipelineRunWithIsolation, }, { - name: "affinity-assistant-disabled-coschedule-disabled", + name: "coschedule-disabled", configMap: map[string]string{ - "disable-affinity-assistant": "true", - "coschedule": config.CoscheduleDisabled, + "coschedule": config.CoscheduleDisabled, }, expect: AffinityAssistantDisabled, }} @@ -69,11 +59,11 @@ func Test_GetAffinityAssistantBehavior(t *testing.T) { ctx := cfgtesting.SetFeatureFlags(context.Background(), t, tc.configMap) get, err := GetAffinityAssistantBehavior(ctx) if err != nil { - t.Fatalf("unexpected error when getting affinity assistant behavior: %v", err) + t.Fatalf("%s: unexpected error when getting affinity assistant behavior: %v", tc.name, err) } if d := cmp.Diff(tc.expect, get); d != "" { - t.Errorf("AffinityAssistantBehavior mismatch: %v", diff.PrintWantGot(d)) + t.Errorf("%s: AffinityAssistantBehavior mismatch: %v", tc.name, diff.PrintWantGot(d)) } } } diff --git a/pkg/reconciler/pipelinerun/affinity_assistant.go b/pkg/reconciler/pipelinerun/affinity_assistant.go index 1d57b2ad624..d176f219f3b 100644 --- a/pkg/reconciler/pipelinerun/affinity_assistant.go +++ b/pkg/reconciler/pipelinerun/affinity_assistant.go @@ -47,8 +47,6 @@ const ( // ReasonCouldntCreateOrUpdateAffinityAssistantStatefulSet indicates that a PipelineRun uses workspaces with PersistentVolumeClaim // as a volume source and expect an Assistant StatefulSet in AffinityAssistantPerWorkspace behavior, but couldn't create a StatefulSet. ReasonCouldntCreateOrUpdateAffinityAssistantStatefulSet = "ReasonCouldntCreateOrUpdateAffinityAssistantStatefulSet" - - featureFlagDisableAffinityAssistantKey = "disable-affinity-assistant" ) var ( diff --git a/pkg/reconciler/pipelinerun/affinity_assistant_test.go b/pkg/reconciler/pipelinerun/affinity_assistant_test.go index 63d5aaea8c9..365042a9591 100644 --- a/pkg/reconciler/pipelinerun/affinity_assistant_test.go +++ b/pkg/reconciler/pipelinerun/affinity_assistant_test.go @@ -342,8 +342,7 @@ func TestCreateOrUpdateAffinityAssistantsAndPVCsPerPipelineRun(t *testing.T) { for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { featureFlags := map[string]string{ - "disable-affinity-assistant": "true", - "coschedule": "pipelineruns", + "coschedule": "pipelineruns", } for k, v := range tc.featureFlags { @@ -1020,8 +1019,7 @@ func TestCleanupAffinityAssistants_Success(t *testing.T) { name: "Affinity Assistant Cleanup - per workspace", aaBehavior: aa.AffinityAssistantPerWorkspace, cfgMap: map[string]string{ - "disable-affinity-assistant": "false", - "coschedule": "workspaces", + "coschedule": "workspaces", }, affinityAssistantNames: []string{"affinity-assistant-9d8b15fa2e", "affinity-assistant-39883fc3b2"}, pvcNames: []string{"pvc-a12c589442", "pvc-5ce7cd98c5"}, @@ -1029,8 +1027,7 @@ func TestCleanupAffinityAssistants_Success(t *testing.T) { name: "Affinity Assistant Cleanup - per pipelinerun", aaBehavior: aa.AffinityAssistantPerPipelineRun, cfgMap: map[string]string{ - "disable-affinity-assistant": "true", - "coschedule": "pipelineruns", + "coschedule": "pipelineruns", }, affinityAssistantNames: []string{"affinity-assistant-62843d388a"}, pvcNames: []string{"pvc-a12c589442-affinity-assistant-62843d388a-0", "pvc-5ce7cd98c5-affinity-assistant-62843d388a-0"}, @@ -1157,14 +1154,12 @@ func TestCleanupAffinityAssistantsAndPVCs_Failure(t *testing.T) { } } -// TestThatCleanupIsAvoidedIfAssistantIsDisabled tests that -// cleanup of Affinity Assistants is omitted when the -// Affinity Assistant is disabled -func TestThatCleanupIsAvoidedIfAssistantIsDisabled(t *testing.T) { +// TestThatCleanupIsAvoidedtests that cleanup of Affinity Assistants is omitted +func TestThatCleanupIsAvoided(t *testing.T) { configMap := &corev1.ConfigMap{ ObjectMeta: metav1.ObjectMeta{Name: config.GetFeatureFlagsConfigName(), Namespace: system.Namespace()}, Data: map[string]string{ - featureFlagDisableAffinityAssistantKey: "true", + "coschedule": "disabled", }, } diff --git a/pkg/reconciler/pipelinerun/pipelinerun_test.go b/pkg/reconciler/pipelinerun/pipelinerun_test.go index 890c5f828a8..c6b65a36fd7 100644 --- a/pkg/reconciler/pipelinerun/pipelinerun_test.go +++ b/pkg/reconciler/pipelinerun/pipelinerun_test.go @@ -123,7 +123,6 @@ const ( apiFieldsFeatureFlag = "enable-api-fields" ociBundlesFeatureFlag = "enable-tekton-oci-bundles" maxMatrixCombinationsCountFlag = "default-max-matrix-combinations-count" - disableAffinityAssistantFlag = "disable-affinity-assistant" ) type PipelineRunTest struct { @@ -1495,12 +1494,6 @@ func withMaxMatrixCombinationsCount(cm *corev1.ConfigMap, count int) *corev1.Con return newCM } -func withoutAffinityAssistant(cm *corev1.ConfigMap) *corev1.ConfigMap { - newCM := cm.DeepCopy() - newCM.Data[disableAffinityAssistantFlag] = "true" - return newCM -} - // TestReconcileOnCancelledPipelineRun runs "Reconcile" on a PipelineRun that // has been cancelled. It verifies that reconcile is successful, the pipeline // status updated and events generated. @@ -5341,7 +5334,7 @@ spec: name: myclaim `)} ts := []*v1.Task{simpleHelloWorldTask} - cms := []*corev1.ConfigMap{withoutAffinityAssistant(newFeatureFlagsConfigMap())} + cms := []*corev1.ConfigMap{newFeatureFlagsConfigMap()} d := test.Data{ PipelineRuns: prs, @@ -5983,7 +5976,6 @@ status: name string prs []*v1.PipelineRun expectedTr *v1.TaskRun - disableAA bool }{ { name: "pcv success", @@ -6001,10 +5993,11 @@ spec: persistentVolumeClaim: claimName: $(tasks.a-task.results.aResult) `)}, - disableAA: true, expectedTr: mustParseTaskRunWithObjectMeta(t, - taskRunObjectMeta("test-pipeline-run-variable-substitution-b-task", "foo", - "test-pipeline-run-variable-substitution", "test-pipeline", "b-task", false), + taskRunObjectMetaWithAnnotations("test-pipeline-run-variable-substitution-b-task", "foo", + "test-pipeline-run-variable-substitution", "test-pipeline", "b-task", false, map[string]string{ + "pipeline.tekton.dev/affinity-assistant": "affinity-assistant-0358aabfa2", + }), `spec: serviceAccountName: test-sa-0 taskRef: @@ -6253,11 +6246,6 @@ spec: Tasks: ts, TaskRuns: trs, } - if tt.disableAA { - configMap := newFeatureFlagsConfigMap() - configMap.Data["disable-affinity-assistant"] = "true" - d.ConfigMaps = []*corev1.ConfigMap{configMap} - } prt := newPipelineRunTest(t, d) defer prt.Cancel() diff --git a/pkg/reconciler/taskrun/taskrun_test.go b/pkg/reconciler/taskrun/taskrun_test.go index a474ab33d7f..ac5ec9c8263 100644 --- a/pkg/reconciler/taskrun/taskrun_test.go +++ b/pkg/reconciler/taskrun/taskrun_test.go @@ -4750,15 +4750,13 @@ spec: }{{ name: "multiple PVC based Workspaces in per workspace coschedule mode - failure", cfgMap: map[string]string{ - "disable-affinity-assistant": "false", - "coschedule": "workspaces", + "coschedule": "workspaces", }, expectFailureReason: v1.TaskRunReasonFailedValidation.String(), }, { name: "multiple PVC based Workspaces in per pipelinerun coschedule mode - success", cfgMap: map[string]string{ - "disable-affinity-assistant": "true", - "coschedule": "pipelineruns", + "coschedule": "pipelineruns", }, }} diff --git a/test/affinity_assistant_test.go b/test/affinity_assistant_test.go index a40e1942324..62808cc82ba 100644 --- a/test/affinity_assistant_test.go +++ b/test/affinity_assistant_test.go @@ -22,7 +22,6 @@ package test import ( "context" "fmt" - "strconv" "testing" "github.com/tektoncd/pipeline/pkg/apis/config" @@ -128,8 +127,7 @@ func TestAffinityAssistant_PerPipelineRun(t *testing.T) { // update feature flag configMapData := map[string]string{ - "coschedule": config.CoschedulePipelineRuns, - "disable-affinity-assistant": "true", + "coschedule": config.CoschedulePipelineRuns, } if err := updateConfigMap(ctx, c.KubeClient, system.Namespace(), config.GetFeatureFlagsConfigName(), configMapData); err != nil { t.Fatal(err) @@ -237,8 +235,7 @@ func validatePodAffinity(t *testing.T, ctx context.Context, podNames []string, n func resetFeatureFlagAndCleanup(ctx context.Context, t *testing.T, c *clients, namespace string) { t.Helper() configMapData := map[string]string{ - "coschedule": config.DefaultCoschedule, - "disable-affinity-assistant": strconv.FormatBool(config.DefaultDisableAffinityAssistant), + "coschedule": config.DefaultCoschedule, } if err := updateConfigMap(ctx, c.KubeClient, system.Namespace(), config.GetFeatureFlagsConfigName(), configMapData); err != nil { t.Fatal(err)