Configurations

Configuration file

cattage-controller reads a configuration file on startup. The default location is /etc/cattage/config.yaml. The location can be changed with --config-file flag.

The configuration file should be a JSON or YAML file having the following keys:

KeyTypeDescription
namespace.commonLabelsmap[string]stringLabels to be added to all namespaces belonging to all tenants. This may be overridden by rootNamespaces.labels of a tenant resource.
namespace.commonAnnotationsmap[string]stringAnnotations to be added to all namespaces belonging to all tenants. This may be overridden by rootNamespaces.annotations of a tenant resource.
namespace.roleBindingTemplatestringTemplate for RoleBinding resource that is created on all namespaces belonging to a tenant.
argocd.namepsacestringThe name of namespace where Argo CD is running.
argocd.appProjectTemplatestringTemplate for AppProject resources that is created for each tenant.
argocd.preventAppCreationInArgoCDNamespaceboolIf true, prevent creating applications in the Argo CD namespace. This is used to enable sharding.

The repository includes an example as follows:

namespace:
  commonLabels:
    accurate.cybozu.com/template: init-template
  commonAnnotations:
    foo: bar
  roleBindingTemplate: |
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: admin
    subjects:
      - apiGroup: rbac.authorization.k8s.io
        kind: Group
        name: {{ .Name }}
      {{- range .Roles.admin }}
      - apiGroup: rbac.authorization.k8s.io
        kind: Group
        name: {{ .Name }}
      {{- end }}
argocd:
  namespace: argocd
  appProjectTemplate: |
    apiVersion: argoproj.io/v1alpha1
    kind: AppProject
    spec:
      destinations:
      {{- range .Namespaces }}
        - namespace: {{ . }}
          server: '*'
      {{- end }}
      roles:
        - groups:
            # If `GitHubName` is specified as `ExtraParams`, use it, otherwise use `Name`.
            - {{with .ExtraParams.GitHubTeam}}{{ . }}{{else}}{{ .Name }}{{end}}
            {{- range .Roles.admin }}
            - {{with .ExtraParams.GitHubTeam}}{{ . }}{{else}}{{ .Name }}{{end}}
            {{- end }}
          name: admin
          policies:
            - p, proj:{{ .Name }}:admin, applications, *, {{ .Name }}/*, allow
      sourceNamespaces:
        {{- range .Namespaces }}
        - {{ . }}
        {{- end }}
      sourceRepos:
        {{- range .Repositories }}
        - '{{ . }}'
        {{- else }}
        - '*'
        {{- end }}

roleBindingTemplate and appProjectTemplate can be written in go-template format.

roleBindingTemplate can use the following variables:

KeyTypeDescription
NamestringThe name of the tenant.
Rolesmap[string]RoleMap of other tenants that are accessible to this tenant. The key is a role name.
ExtraParamsmap[string]stringExtra parameters specified per tenant.

appProjectTemplate can use the following variables:

KeyTypeDescription
NamestringThe name of the tenant.
Namespaces[]stringList of namespaces belonging to a tenant (including sub-namespaces).
Repositories[]stringList of repository URLs which can be used by the tenant.
Rolesmap[string]RoleMap of other tenants that are accessible to this tenant. The key is a role name.
ExtraParamsmap[string]stringExtra parameters specified per tenant.
KeyTypeDescription
NamestringThe name of the tenant.
ExtraParamsmap[string]stringExtra parameters specified per tenant.

Environment variables

NameRequiredDescription
POD_NAMESPACEYesThe namespace name where cattage is running.

Command-line flags

Flags:
      --add_dir_header                   If true, adds the file directory to the header
      --alsologtostderr                  log to standard error as well as files
      --cert-dir string                  webhook certificate directory
      --config-file string               Configuration file path (default "/etc/cattage/config.yaml")
      --health-probe-addr string         Listen address for health probes (default ":8081")
  -h, --help                             help for cattage-controller
      --leader-election-id string        ID for leader election by controller-runtime (default "cattage")
      --log_backtrace_at traceLocation   when logging hits line file:N, emit a stack trace (default :0)
      --log_dir string                   If non-empty, write log files in this directory
      --log_file string                  If non-empty, use this log file
      --log_file_max_size uint           Defines the maximum size a log file can grow to. Unit is megabytes. If the value is 0, the maximum file size is unlimited. (default 1800)
      --logtostderr                      log to standard error instead of files (default true)
      --metrics-addr string              The address the metric endpoint binds to (default ":8080")
      --skip_headers                     If true, avoid header prefixes in the log messages
      --skip_log_headers                 If true, avoid headers when opening log files
      --stderrthreshold severity         logs at or above this threshold go to stderr (default 2)
  -v, --v Level                          number for the log level verbosity
      --version                          version for cattage-controller
      --vmodule moduleSpec               comma-separated list of pattern=N settings for file-filtered logging
      --webhook-addr string              Listen address for the webhook endpoint (default ":9443")
      --zap-devel                        Development Mode defaults(encoder=consoleEncoder,logLevel=Debug,stackTraceLevel=Warn). Production Mode defaults(encoder=jsonEncoder,logLevel=Info,stackTraceLevel=Error)
      --zap-encoder encoder              Zap log encoding (one of 'json' or 'console')
      --zap-log-level level              Zap Level to configure the verbosity of logging. Can be one of 'debug', 'info', 'error', or any integer value > 0 which corresponds to custom debug levels of increasing verbosity
      --zap-stacktrace-level level       Zap Level at and above which stacktraces are captured (one of 'info', 'error', 'panic').