diff --git a/.gitignore b/.gitignore index c9b29b6b..decb854e 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,6 @@ vendor/ # Files used by the taskfile. .task +# JetBrains IDEs +.idea/ +.run/ \ No newline at end of file diff --git a/cmd/milo/controller-manager/controllermanager.go b/cmd/milo/controller-manager/controllermanager.go index fd689df7..b5fdbbba 100644 --- a/cmd/milo/controller-manager/controllermanager.go +++ b/cmd/milo/controller-manager/controllermanager.go @@ -288,6 +288,9 @@ func NewOptions() (*Options, error) { KubeControllerManagerOptions: baseOpts, InfraCluster: &infracluster.Options{ KubeconfigFile: baseOpts.Generic.ClientConnection.Kubeconfig, + LeaderElection: &infracluster.LeaderElectionConfig{ + CandidateNamespace: "datum-system", + }, }, ControlPlane: &controlplane.Options{}, } @@ -669,7 +672,7 @@ func Run(ctx context.Context, c *config.CompletedConfig, opts *Options) error { // Start lease candidate controller for coordinated leader election leaseCandidate, waitForSync, err := leaderelection.NewCandidate( c.Client, - "datum-system", + opts.InfraCluster.LeaderElection.CandidateNamespace, id, "datum-controller-manager", binaryVersion.FinalizeVersion(), diff --git a/config/controller-manager/base/deployment.yaml b/config/controller-manager/base/deployment.yaml index bf919b7b..18e801bb 100644 --- a/config/controller-manager/base/deployment.yaml +++ b/config/controller-manager/base/deployment.yaml @@ -31,6 +31,7 @@ spec: - --leader-elect-renew-deadline=10s - --leader-elect-retry-period=2s - --leader-elect-resource-namespace=$(LEADER_ELECT_RESOURCE_NAMESPACE) + - --leader-election-candidate-namespace=$(LEADER_ELECTION_CANDIDATE_NAMESPACE) - --authentication-skip-lookup - --client-ca-file=$(CLIENT_CA_FILE) - --secure-port=6443 @@ -45,6 +46,8 @@ spec: env: - name: LEADER_ELECT_RESOURCE_NAMESPACE value: milo-system + - name: LEADER_ELECTION_CANDIDATE_NAMESPACE + value: datum-system # Default to INFO level logging - name: LOG_LEVEL value: "4" diff --git a/config/crd/bases/iam/iam.miloapis.com_userpreferences.yaml b/config/crd/bases/iam/iam.miloapis.com_userpreferences.yaml index e9338953..36fcf880 100644 --- a/config/crd/bases/iam/iam.miloapis.com_userpreferences.yaml +++ b/config/crd/bases/iam/iam.miloapis.com_userpreferences.yaml @@ -52,6 +52,9 @@ spec: spec: description: UserPreferenceSpec defines the desired state of UserPreference properties: + displayName: + description: DisplayName is the user's preferred display name. + type: string theme: default: system description: The user's theme preference. @@ -60,6 +63,12 @@ spec: - dark - system type: string + timeZone: + description: The user's time zone preference. + type: string + title: + description: Title is the user's title or role. + type: string userRef: description: Reference to the user these preferences belong to. properties: diff --git a/config/samples/iam/v1alpha1/userpreference.yaml b/config/samples/iam/v1alpha1/userpreference.yaml index f1452b5f..5a45e2b3 100644 --- a/config/samples/iam/v1alpha1/userpreference.yaml +++ b/config/samples/iam/v1alpha1/userpreference.yaml @@ -5,4 +5,6 @@ metadata: spec: userRef: name: user-sample - theme: "dark" \ No newline at end of file + theme: "dark" + displayName: my display name + title: my title \ No newline at end of file diff --git a/docs/api/iam.md b/docs/api/iam.md index 02560446..549fa39d 100644 --- a/docs/api/iam.md +++ b/docs/api/iam.md @@ -2597,6 +2597,27 @@ UserPreferenceSpec defines the desired state of UserPreference Default: system
false + + displayName + string + + DisplayName is the user's preferred display name.
+ + false + + title + string + + Title is the user's title or role.
+ + false + + timeZone + string + + The user's time zone preference.
+ + false diff --git a/internal/infra-cluster/client.go b/internal/infra-cluster/client.go index 2b1cb584..2c12ece2 100644 --- a/internal/infra-cluster/client.go +++ b/internal/infra-cluster/client.go @@ -8,14 +8,21 @@ import ( "k8s.io/client-go/tools/clientcmd" ) +type LeaderElectionConfig struct { + CandidateNamespace string +} + // Options defines the configuration options available for modifying the // behavior of the infrastructure cluster client. type Options struct { KubeconfigFile string + LeaderElection *LeaderElectionConfig } func (o *Options) AddFlags(fs *pflag.FlagSet) { fs.StringVar(&o.KubeconfigFile, "infra-cluster-kubeconfig", "-", "The path to the kubeconfig file for the infrastructure cluster. Use '-' to use the in-cluster config.") + fs.StringVar(&o.LeaderElection.CandidateNamespace, "leader-election-candidate-namespace", o.LeaderElection.CandidateNamespace, "The candidate namespace in which the leader election will be created.") + } func (o *Options) GetClient() (*rest.Config, error) { diff --git a/internal/webhooks/iam/v1alpha1/user_webhook.go b/internal/webhooks/iam/v1alpha1/user_webhook.go index eeadf62e..60f1f9fc 100644 --- a/internal/webhooks/iam/v1alpha1/user_webhook.go +++ b/internal/webhooks/iam/v1alpha1/user_webhook.go @@ -134,7 +134,9 @@ func (v *UserValidator) createUserPreference(ctx context.Context, user *iamv1alp UserRef: iamv1alpha1.UserReference{ Name: user.Name, }, - Theme: "system", // Default theme + Theme: "system", // Default theme + DisplayName: "", + Title: "", }, } diff --git a/pkg/apis/iam/v1alpha1/userpreference_types.go b/pkg/apis/iam/v1alpha1/userpreference_types.go index c47feb11..5317d1eb 100644 --- a/pkg/apis/iam/v1alpha1/userpreference_types.go +++ b/pkg/apis/iam/v1alpha1/userpreference_types.go @@ -27,11 +27,23 @@ type UserPreferenceSpec struct { // +kubebuilder:validation:Required UserRef UserReference `json:"userRef"` + // DisplayName is the user's preferred display name. + // +kubebuilder:validation:Optional + DisplayName string `json:"displayName,omitempty"` + + // Title is the user's title or role. + // +kubebuilder:validation:Optional + Title string `json:"title,omitempty"` + // The user's theme preference. // +kubebuilder:validation:Enum=light;dark;system // +kubebuilder:validation:Optional // +kubebuilder:default=system Theme string `json:"theme,omitempty"` + + // The user's time zone preference. + // +kubebuilder:validation:Optional' + TimeZone string `json:"timeZone,omitempty"` } // UserPreferenceStatus defines the observed state of UserPreference