diff --git a/Dockerfile b/Dockerfile index 3dd1bbc..d12678c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ ARG BASE_IMAGE=gcr.io/distroless/static:nonroot # Build the manager binary -FROM gcr.io/gcp-runtimes/go1-builder:1.13 as builder +FROM gcr.io/gcp-runtimes/go1-builder:1.14 as builder ENV PATH "/usr/local/go/bin:$PATH" diff --git a/Makefile b/Makefile index 3d8d34a..8cdb33b 100644 --- a/Makefile +++ b/Makefile @@ -16,8 +16,8 @@ SIP_BASE_IMAGE ?= gcr.io/distroless/static:nonroot JUMP_HOST_IMG ?= $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_PREFIX)/$(JUMP_HOST_IMAGE_NAME):$(DOCKER_IMAGE_TAG) SIP_IMG ?= $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_PREFIX)/$(SIP_IMAGE_NAME):$(DOCKER_IMAGE_TAG) -# Produce CRDs that work back to Kubernetes 1.11 (no version conversion) -CRD_OPTIONS ?= "crd:trivialVersions=true" +# Produce CRDs that work back to Kubernetes 1.16 +CRD_OPTIONS ?= crd:crdVersions=v1 TOOLBINDIR := tools/bin diff --git a/config/crd/bases/airship.airshipit.org_sipclusters.yaml b/config/crd/bases/airship.airshipit.org_sipclusters.yaml index 6de51b7..63e12bb 100644 --- a/config/crd/bases/airship.airshipit.org_sipclusters.yaml +++ b/config/crd/bases/airship.airshipit.org_sipclusters.yaml @@ -1,6 +1,6 @@ --- -apiVersion: apiextensions.k8s.io/v1beta1 +apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: @@ -15,279 +15,280 @@ spec: plural: sipclusters singular: sipcluster scope: Namespaced - subresources: - status: {} - validation: - openAPIV3Schema: - description: SIPCluster is the Schema for the sipclusters API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: SIPClusterSpec defines the desired state of a SIPCluster - properties: - nodes: - additionalProperties: - description: 'NodeSet are the the list of Nodes objects workers, or - ControlPlane that define expectations for the Tenant Clusters Includes - artifacts to associate with each defined namespace Such as : - Roles - for the Nodes - Flavor for the Nodes image - Anti-affinity expectations - - Scale of the group of Nodes' - properties: - count: - description: Count defines the scale expectations for the Nodes - properties: - active: - description: 'INSERT ADDITIONAL STATUS FIELD - define observed - state of cluster Important: Run "make" to regenerate code - after modifying this file' - type: integer - standby: - type: integer - type: object - labelSelector: - description: LabelSelector is the BMH label selector to use. - properties: - matchExpressions: - description: matchExpressions is a list of label selector - requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector - that contains values, a key, and an operator that relates - the key and values. - properties: - key: - description: key is the label key that the selector - applies to. - type: string - operator: - description: operator represents a key's relationship - to a set of values. Valid operators are In, NotIn, - Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If - the operator is In or NotIn, the values array must - be non-empty. If the operator is Exists or DoesNotExist, - the values array must be empty. This array is replaced - during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A - single {key,value} in the matchLabels map is equivalent - to an element of matchExpressions, whose key field is "key", - the operator is "In", and the values array contains only - "value". The requirements are ANDed. - type: object - type: object - topologyKey: - description: TopologyKey is similar to the same named field in - the kubernetes Pod anti-affinity API. If two BMHs are labeled - with this key and have identical values for that label, they - are considered to be in the same topology domain, and thus only - one will be scheduled. - type: string - type: object - description: Nodes defines the set of nodes to schedule for each BMH - role. - type: object - services: - description: Services defines the services that are deployed when a - SIPCluster is provisioned. - properties: - jumpHost: - description: JumpHost defines the sub-cluster jump host services. - items: - description: JumpHostService is an infrastructure service type - that represents the sub-cluster jump-host service. - properties: - bmc: - description: BMCOpts contains options for BMC communication. - properties: - proxy: - type: boolean - type: object - clusterIP: - type: string - image: - type: string - nodeInterfaceId: - type: string - nodeLabels: - additionalProperties: - type: string - type: object - nodePort: - type: integer - nodeSSHPrivateKeys: - description: NodeSSHPrivateKeys holds the name of a Secret - in the same namespace as the SIPCluster CR, whose key values - each represent an ssh private key that can be used to access - the cluster nodes. They are mounted into the jumphost with - the secret keys serving as file names relative to a common - directory, and then configured as identity files in the - SSH config file of the default user. - type: string - sshAuthorizedKeys: - items: - type: string - type: array - required: - - image - - nodePort - - nodeSSHPrivateKeys - type: object - type: array - loadBalancerControlPlane: - description: LoadBalancer defines the sub-cluster load balancer - services. - items: - description: LoadBalancerServiceControlPlane is an infrastructure - service type that represents the sub-cluster load balancer service. - properties: - clusterIP: - type: string - image: - type: string - nodeInterfaceId: - type: string - nodeLabels: - additionalProperties: - type: string - type: object - nodePort: - type: integer - required: - - image - - nodePort - type: object - type: array - loadBalancerWorker: - description: ' LoadBalancer defines the sub-cluster load balancer - services.' - items: - description: LoadBalancerServiceWorker is an infrastructure service - type that represents the sub-cluster load balancer service. - properties: - clusterIP: - type: string - image: - type: string - nodeInterfaceId: - type: string - nodeLabels: - additionalProperties: - type: string - type: object - nodePort: - type: integer - required: - - image - - nodePort - type: object - type: array - type: object - required: - - services - type: object - status: - description: SIPClusterStatus defines the observed state of SIPCluster - properties: - conditions: - items: - description: "Condition contains details for one aspect of the current - state of this API Resource. --- This struct is intended for direct - use as an array at the field path .status.conditions. For example, - type FooStatus struct{ // Represents the observations of a foo's - current state. // Known .status.conditions.type are: \"Available\", - \"Progressing\", and \"Degraded\" // +patchMergeKey=type // - +patchStrategy=merge // +listType=map // +listMapKey=type - \ Conditions []metav1.Condition `json:\"conditions,omitempty\" - patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` - \n // other fields }" - properties: - lastTransitionTime: - description: lastTransitionTime is the last time the condition - transitioned from one status to another. This should be when - the underlying condition changed. If that is not known, then - using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: message is a human readable message indicating details - about the transition. This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: observedGeneration represents the .metadata.generation - that the condition was set based upon. For instance, if .metadata.generation - is currently 12, but the .status.conditions[x].observedGeneration - is 9, the condition is out of date with respect to the current - state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: reason contains a programmatic identifier indicating - the reason for the condition's last transition. Producers of - specific condition types may define expected values and meanings - for this field, and whether the values are considered a guaranteed - API. The value should be a CamelCase string. This field may - not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - --- Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - type: array - type: object - type: object - version: v1 versions: - name: v1 + schema: + openAPIV3Schema: + description: SIPCluster is the Schema for the sipclusters API + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: SIPClusterSpec defines the desired state of a SIPCluster + properties: + nodes: + additionalProperties: + description: 'NodeSet are the the list of Nodes objects workers, + or ControlPlane that define expectations for the Tenant Clusters + Includes artifacts to associate with each defined namespace Such + as : - Roles for the Nodes - Flavor for the Nodes image - Anti-affinity + expectations - Scale of the group of Nodes' + properties: + count: + description: Count defines the scale expectations for the Nodes + properties: + active: + description: 'INSERT ADDITIONAL STATUS FIELD - define observed + state of cluster Important: Run "make" to regenerate code + after modifying this file' + type: integer + standby: + type: integer + type: object + labelSelector: + description: LabelSelector is the BMH label selector to use. + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: A label selector requirement is a selector + that contains values, a key, and an operator that relates + the key and values. + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: operator represents a key's relationship + to a set of values. Valid operators are In, NotIn, + Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. + If the operator is In or NotIn, the values array + must be non-empty. If the operator is Exists or + DoesNotExist, the values array must be empty. This + array is replaced during a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} pairs. + A single {key,value} in the matchLabels map is equivalent + to an element of matchExpressions, whose key field is + "key", the operator is "In", and the values array contains + only "value". The requirements are ANDed. + type: object + type: object + topologyKey: + description: TopologyKey is similar to the same named field + in the kubernetes Pod anti-affinity API. If two BMHs are labeled + with this key and have identical values for that label, they + are considered to be in the same topology domain, and thus + only one will be scheduled. + type: string + type: object + description: Nodes defines the set of nodes to schedule for each BMH + role. + type: object + services: + description: Services defines the services that are deployed when + a SIPCluster is provisioned. + properties: + jumpHost: + description: JumpHost defines the sub-cluster jump host services. + items: + description: JumpHostService is an infrastructure service type + that represents the sub-cluster jump-host service. + properties: + bmc: + description: BMCOpts contains options for BMC communication. + properties: + proxy: + type: boolean + type: object + clusterIP: + type: string + image: + type: string + nodeInterfaceId: + type: string + nodeLabels: + additionalProperties: + type: string + type: object + nodePort: + type: integer + nodeSSHPrivateKeys: + description: NodeSSHPrivateKeys holds the name of a Secret + in the same namespace as the SIPCluster CR, whose key + values each represent an ssh private key that can be used + to access the cluster nodes. They are mounted into the + jumphost with the secret keys serving as file names relative + to a common directory, and then configured as identity + files in the SSH config file of the default user. + type: string + sshAuthorizedKeys: + items: + type: string + type: array + required: + - image + - nodePort + - nodeSSHPrivateKeys + type: object + type: array + loadBalancerControlPlane: + description: LoadBalancer defines the sub-cluster load balancer + services. + items: + description: LoadBalancerServiceControlPlane is an infrastructure + service type that represents the sub-cluster load balancer + service. + properties: + clusterIP: + type: string + image: + type: string + nodeInterfaceId: + type: string + nodeLabels: + additionalProperties: + type: string + type: object + nodePort: + type: integer + required: + - image + - nodePort + type: object + type: array + loadBalancerWorker: + description: ' LoadBalancer defines the sub-cluster load balancer + services.' + items: + description: LoadBalancerServiceWorker is an infrastructure + service type that represents the sub-cluster load balancer + service. + properties: + clusterIP: + type: string + image: + type: string + nodeInterfaceId: + type: string + nodeLabels: + additionalProperties: + type: string + type: object + nodePort: + type: integer + required: + - image + - nodePort + type: object + type: array + type: object + required: + - services + type: object + status: + description: SIPClusterStatus defines the observed state of SIPCluster + properties: + conditions: + items: + description: "Condition contains details for one aspect of the current + state of this API Resource. --- This struct is intended for direct + use as an array at the field path .status.conditions. For example, + type FooStatus struct{ // Represents the observations of a + foo's current state. // Known .status.conditions.type are: + \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type + \ // +patchStrategy=merge // +listType=map // +listMapKey=type + \ Conditions []metav1.Condition `json:\"conditions,omitempty\" + patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` + \n // other fields }" + properties: + lastTransitionTime: + description: lastTransitionTime is the last time the condition + transitioned from one status to another. This should be when + the underlying condition changed. If that is not known, then + using the time when the API field changed is acceptable. + format: date-time + type: string + message: + description: message is a human readable message indicating + details about the transition. This may be an empty string. + maxLength: 32768 + type: string + observedGeneration: + description: observedGeneration represents the .metadata.generation + that the condition was set based upon. For instance, if .metadata.generation + is currently 12, but the .status.conditions[x].observedGeneration + is 9, the condition is out of date with respect to the current + state of the instance. + format: int64 + minimum: 0 + type: integer + reason: + description: reason contains a programmatic identifier indicating + the reason for the condition's last transition. Producers + of specific condition types may define expected values and + meanings for this field, and whether the values are considered + a guaranteed API. The value should be a CamelCase string. + This field may not be empty. + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + type: string + status: + description: status of the condition, one of True, False, Unknown. + enum: + - "True" + - "False" + - Unknown + type: string + type: + description: type of condition in CamelCase or in foo.example.com/CamelCase. + --- Many .condition.type values are consistent across resources + like Available, but because arbitrary conditions can be useful + (see .node.status.conditions), the ability to deconflict is + important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + type: string + required: + - lastTransitionTime + - message + - reason + - status + - type + type: object + type: array + type: object + type: object served: true storage: true + subresources: + status: {} status: acceptedNames: kind: "" diff --git a/go.mod b/go.mod index 85f4dc6..24162f1 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module sipcluster -go 1.13 +go 1.14 require ( github.com/PaesslerAG/jsonpath v0.1.1