Feature/fix poms (#4)
* Updated javadoc settings in poms Signed-off-by: Knut-Erik Johnsen <abstract@knut-erik.org> * Switched naming of tags/releases Signed-off-by: Knut-Erik Johnsen <abstract@knut-erik.org> * Added springboot starter and example. Reverted to version 1.14 to cover more releases Signed-off-by: Knut-Erik Johnsen <abstract@knut-erik.org> * Cleanup naming ved using autoregister functionality Signed-off-by: Knut-Erik Johnsen <abstract@knut-erik.org> --------- Signed-off-by: Knut-Erik Johnsen <abstract@knut-erik.org>
This commit is contained in:
parent
cdead31335
commit
f1693c4ae7
|
|
@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1
|
||||||
kind: CustomResourceDefinition
|
kind: CustomResourceDefinition
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
controller-gen.kubebuilder.io/version: v0.14.0
|
controller-gen.kubebuilder.io/version: v0.13.0
|
||||||
name: compositeresourcedefinitions.apiextensions.crossplane.io
|
name: compositeresourcedefinitions.apiextensions.crossplane.io
|
||||||
spec:
|
spec:
|
||||||
group: apiextensions.crossplane.io
|
group: apiextensions.crossplane.io
|
||||||
|
|
@ -31,25 +31,19 @@ spec:
|
||||||
name: v1
|
name: v1
|
||||||
schema:
|
schema:
|
||||||
openAPIV3Schema:
|
openAPIV3Schema:
|
||||||
description: |-
|
description: A CompositeResourceDefinition defines a new kind of composite
|
||||||
A CompositeResourceDefinition defines a new kind of composite infrastructure
|
infrastructure resource. The new resource is composed of other composite
|
||||||
resource. The new resource is composed of other composite or managed
|
or managed infrastructure resources.
|
||||||
infrastructure resources.
|
|
||||||
properties:
|
properties:
|
||||||
apiVersion:
|
apiVersion:
|
||||||
description: |-
|
description: 'APIVersion defines the versioned schema of this representation
|
||||||
APIVersion defines the versioned schema of this representation of an object.
|
of an object. Servers should convert recognized schemas to the latest
|
||||||
Servers should convert recognized schemas to the latest internal value, and
|
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
|
||||||
may reject unrecognized values.
|
|
||||||
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
|
|
||||||
type: string
|
type: string
|
||||||
kind:
|
kind:
|
||||||
description: |-
|
description: 'Kind is a string value representing the REST resource this
|
||||||
Kind is a string value representing the REST resource this object represents.
|
object represents. Servers may infer this from the endpoint the client
|
||||||
Servers may infer this from the endpoint the client submits requests to.
|
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
|
||||||
Cannot be updated.
|
|
||||||
In CamelCase.
|
|
||||||
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
|
|
||||||
type: string
|
type: string
|
||||||
metadata:
|
metadata:
|
||||||
type: object
|
type: object
|
||||||
|
|
@ -58,45 +52,42 @@ spec:
|
||||||
of the definition.
|
of the definition.
|
||||||
properties:
|
properties:
|
||||||
claimNames:
|
claimNames:
|
||||||
description: |-
|
description: ClaimNames specifies the names of an optional composite
|
||||||
ClaimNames specifies the names of an optional composite resource claim.
|
resource claim. When claim names are specified Crossplane will create
|
||||||
When claim names are specified Crossplane will create a namespaced
|
a namespaced 'composite resource claim' CRD that corresponds to
|
||||||
'composite resource claim' CRD that corresponds to the defined composite
|
the defined composite resource. This composite resource claim acts
|
||||||
resource. This composite resource claim acts as a namespaced proxy for
|
as a namespaced proxy for the composite resource; creating, updating,
|
||||||
the composite resource; creating, updating, or deleting the claim will
|
or deleting the claim will create, update, or delete a corresponding
|
||||||
create, update, or delete a corresponding composite resource. You may add
|
composite resource. You may add claim names to an existing CompositeResourceDefinition,
|
||||||
claim names to an existing CompositeResourceDefinition, but they cannot
|
but they cannot be changed or removed once they have been set.
|
||||||
be changed or removed once they have been set.
|
|
||||||
properties:
|
properties:
|
||||||
categories:
|
categories:
|
||||||
description: |-
|
description: categories is a list of grouped resources this custom
|
||||||
categories is a list of grouped resources this custom resource belongs to (e.g. 'all').
|
resource belongs to (e.g. 'all'). This is published in API discovery
|
||||||
This is published in API discovery documents, and used by clients to support invocations like
|
documents, and used by clients to support invocations like `kubectl
|
||||||
`kubectl get all`.
|
get all`.
|
||||||
items:
|
items:
|
||||||
type: string
|
type: string
|
||||||
type: array
|
type: array
|
||||||
kind:
|
kind:
|
||||||
description: |-
|
description: kind is the serialized kind of the resource. It is
|
||||||
kind is the serialized kind of the resource. It is normally CamelCase and singular.
|
normally CamelCase and singular. Custom resource instances will
|
||||||
Custom resource instances will use this value as the `kind` attribute in API calls.
|
use this value as the `kind` attribute in API calls.
|
||||||
type: string
|
type: string
|
||||||
listKind:
|
listKind:
|
||||||
description: listKind is the serialized kind of the list for this
|
description: listKind is the serialized kind of the list for this
|
||||||
resource. Defaults to "`kind`List".
|
resource. Defaults to "`kind`List".
|
||||||
type: string
|
type: string
|
||||||
plural:
|
plural:
|
||||||
description: |-
|
description: plural is the plural name of the resource to serve.
|
||||||
plural is the plural name of the resource to serve.
|
|
||||||
The custom resources are served under `/apis/<group>/<version>/.../<plural>`.
|
The custom resources are served under `/apis/<group>/<version>/.../<plural>`.
|
||||||
Must match the name of the CustomResourceDefinition (in the form `<names.plural>.<group>`).
|
Must match the name of the CustomResourceDefinition (in the
|
||||||
Must be all lowercase.
|
form `<names.plural>.<group>`). Must be all lowercase.
|
||||||
type: string
|
type: string
|
||||||
shortNames:
|
shortNames:
|
||||||
description: |-
|
description: shortNames are short names for the resource, exposed
|
||||||
shortNames are short names for the resource, exposed in API discovery documents,
|
in API discovery documents, and used by clients to support invocations
|
||||||
and used by clients to support invocations like `kubectl get <shortname>`.
|
like `kubectl get <shortname>`. It must be all lowercase.
|
||||||
It must be all lowercase.
|
|
||||||
items:
|
items:
|
||||||
type: string
|
type: string
|
||||||
type: array
|
type: array
|
||||||
|
|
@ -109,10 +100,9 @@ spec:
|
||||||
- plural
|
- plural
|
||||||
type: object
|
type: object
|
||||||
connectionSecretKeys:
|
connectionSecretKeys:
|
||||||
description: |-
|
description: ConnectionSecretKeys is the list of keys that will be
|
||||||
ConnectionSecretKeys is the list of keys that will be exposed to the end
|
exposed to the end user of the defined kind. If the list is empty,
|
||||||
user of the defined kind.
|
all keys will be published.
|
||||||
If the list is empty, all keys will be published.
|
|
||||||
items:
|
items:
|
||||||
type: string
|
type: string
|
||||||
type: array
|
type: array
|
||||||
|
|
@ -121,11 +111,13 @@ spec:
|
||||||
Composite resource.
|
Composite resource.
|
||||||
properties:
|
properties:
|
||||||
strategy:
|
strategy:
|
||||||
description: |-
|
description: 'strategy specifies how custom resources are converted
|
||||||
strategy specifies how custom resources are converted between versions. Allowed values are:
|
between versions. Allowed values are: - `"None"`: The converter
|
||||||
- `"None"`: The converter only change the apiVersion and would not touch any other field in the custom resource.
|
only change the apiVersion and would not touch any other field
|
||||||
- `"Webhook"`: API Server will call to an external webhook to do the conversion. Additional information
|
in the custom resource. - `"Webhook"`: API Server will call
|
||||||
is needed for this option. This requires spec.preserveUnknownFields to be false, and spec.conversion.webhook to be set.
|
to an external webhook to do the conversion. Additional information
|
||||||
|
is needed for this option. This requires spec.preserveUnknownFields
|
||||||
|
to be false, and spec.conversion.webhook to be set.'
|
||||||
type: string
|
type: string
|
||||||
webhook:
|
webhook:
|
||||||
description: webhook describes how to call the conversion webhook.
|
description: webhook describes how to call the conversion webhook.
|
||||||
|
|
@ -136,27 +128,23 @@ spec:
|
||||||
the webhook if strategy is `Webhook`.
|
the webhook if strategy is `Webhook`.
|
||||||
properties:
|
properties:
|
||||||
caBundle:
|
caBundle:
|
||||||
description: |-
|
description: caBundle is a PEM encoded CA bundle which
|
||||||
caBundle is a PEM encoded CA bundle which will be used to validate the webhook's server certificate.
|
will be used to validate the webhook's server certificate.
|
||||||
If unspecified, system trust roots on the apiserver are used.
|
If unspecified, system trust roots on the apiserver
|
||||||
|
are used.
|
||||||
format: byte
|
format: byte
|
||||||
type: string
|
type: string
|
||||||
service:
|
service:
|
||||||
description: |-
|
description: "service is a reference to the service for
|
||||||
service is a reference to the service for this webhook. Either
|
this webhook. Either service or url must be specified.
|
||||||
service or url must be specified.
|
\n If the webhook is running within the cluster, then
|
||||||
|
you should use `service`."
|
||||||
|
|
||||||
If the webhook is running within the cluster, then you should use `service`.
|
|
||||||
properties:
|
properties:
|
||||||
name:
|
name:
|
||||||
description: |-
|
description: name is the name of the service. Required
|
||||||
name is the name of the service.
|
|
||||||
Required
|
|
||||||
type: string
|
type: string
|
||||||
namespace:
|
namespace:
|
||||||
description: |-
|
description: namespace is the namespace of the service.
|
||||||
namespace is the namespace of the service.
|
|
||||||
Required
|
Required
|
||||||
type: string
|
type: string
|
||||||
path:
|
path:
|
||||||
|
|
@ -164,10 +152,10 @@ spec:
|
||||||
the webhook will be contacted.
|
the webhook will be contacted.
|
||||||
type: string
|
type: string
|
||||||
port:
|
port:
|
||||||
description: |-
|
description: port is an optional service port at which
|
||||||
port is an optional service port at which the webhook will be contacted.
|
the webhook will be contacted. `port` should be
|
||||||
`port` should be a valid port number (1-65535, inclusive).
|
a valid port number (1-65535, inclusive). Defaults
|
||||||
Defaults to 443 for backward compatibility.
|
to 443 for backward compatibility.
|
||||||
format: int32
|
format: int32
|
||||||
type: integer
|
type: integer
|
||||||
required:
|
required:
|
||||||
|
|
@ -175,47 +163,38 @@ spec:
|
||||||
- namespace
|
- namespace
|
||||||
type: object
|
type: object
|
||||||
url:
|
url:
|
||||||
description: |-
|
description: "url gives the location of the webhook, in
|
||||||
url gives the location of the webhook, in standard URL form
|
standard URL form (`scheme://host:port/path`). Exactly
|
||||||
(`scheme://host:port/path`). Exactly one of `url` or `service`
|
one of `url` or `service` must be specified. \n The
|
||||||
must be specified.
|
`host` should not refer to a service running in the
|
||||||
|
cluster; use the `service` field instead. The host might
|
||||||
|
be resolved via external DNS in some apiservers (e.g.,
|
||||||
The `host` should not refer to a service running in the cluster; use
|
`kube-apiserver` cannot resolve in-cluster DNS as that
|
||||||
the `service` field instead. The host might be resolved via external
|
would be a layering violation). `host` may also be an
|
||||||
DNS in some apiservers (e.g., `kube-apiserver` cannot resolve
|
IP address. \n Please note that using `localhost` or
|
||||||
in-cluster DNS as that would be a layering violation). `host` may
|
`127.0.0.1` as a `host` is risky unless you take great
|
||||||
also be an IP address.
|
care to run this webhook on all hosts which run an apiserver
|
||||||
|
which might need to make calls to this webhook. Such
|
||||||
|
installs are likely to be non-portable, i.e., not easy
|
||||||
Please note that using `localhost` or `127.0.0.1` as a `host` is
|
to turn up in a new cluster. \n The scheme must be \"https\";
|
||||||
risky unless you take great care to run this webhook on all hosts
|
the URL must begin with \"https://\". \n A path is optional,
|
||||||
which run an apiserver which might need to make calls to this
|
and if present may be any string permissible in a URL.
|
||||||
webhook. Such installs are likely to be non-portable, i.e., not easy
|
You may use the path to pass an arbitrary string to
|
||||||
to turn up in a new cluster.
|
the webhook, for example, a cluster identifier. \n Attempting
|
||||||
|
to use a user or basic auth e.g. \"user:password@\"
|
||||||
|
is not allowed. Fragments (\"#...\") and query parameters
|
||||||
The scheme must be "https"; the URL must begin with "https://".
|
(\"?...\") are not allowed, either."
|
||||||
|
|
||||||
|
|
||||||
A path is optional, and if present may be any string permissible in
|
|
||||||
a URL. You may use the path to pass an arbitrary string to the
|
|
||||||
webhook, for example, a cluster identifier.
|
|
||||||
|
|
||||||
|
|
||||||
Attempting to use a user or basic auth e.g. "user:password@" is not
|
|
||||||
allowed. Fragments ("#...") and query parameters ("?...") are not
|
|
||||||
allowed, either.
|
|
||||||
type: string
|
type: string
|
||||||
type: object
|
type: object
|
||||||
conversionReviewVersions:
|
conversionReviewVersions:
|
||||||
description: |-
|
description: conversionReviewVersions is an ordered list of
|
||||||
conversionReviewVersions is an ordered list of preferred `ConversionReview`
|
preferred `ConversionReview` versions the Webhook expects.
|
||||||
versions the Webhook expects. The API server will use the first version in
|
The API server will use the first version in the list which
|
||||||
the list which it supports. If none of the versions specified in this list
|
it supports. If none of the versions specified in this list
|
||||||
are supported by API server, conversion will fail for the custom resource.
|
are supported by API server, conversion will fail for the
|
||||||
If a persisted Webhook configuration specifies allowed versions and does not
|
custom resource. If a persisted Webhook configuration specifies
|
||||||
include any versions known to the API Server, calls to the webhook will fail.
|
allowed versions and does not include any versions known
|
||||||
|
to the API Server, calls to the webhook will fail.
|
||||||
items:
|
items:
|
||||||
type: string
|
type: string
|
||||||
type: array
|
type: array
|
||||||
|
|
@ -227,17 +206,16 @@ spec:
|
||||||
type: object
|
type: object
|
||||||
defaultCompositeDeletePolicy:
|
defaultCompositeDeletePolicy:
|
||||||
default: Background
|
default: Background
|
||||||
description: |-
|
description: DefaultCompositeDeletePolicy is the policy used when
|
||||||
DefaultCompositeDeletePolicy is the policy used when deleting the Composite
|
deleting the Composite that is associated with the Claim if no policy
|
||||||
that is associated with the Claim if no policy has been specified.
|
has been specified.
|
||||||
enum:
|
enum:
|
||||||
- Background
|
- Background
|
||||||
- Foreground
|
- Foreground
|
||||||
type: string
|
type: string
|
||||||
defaultCompositionRef:
|
defaultCompositionRef:
|
||||||
description: |-
|
description: DefaultCompositionRef refers to the Composition resource
|
||||||
DefaultCompositionRef refers to the Composition resource that will be used
|
that will be used in case no composition selector is given.
|
||||||
in case no composition selector is given.
|
|
||||||
properties:
|
properties:
|
||||||
name:
|
name:
|
||||||
description: Name of the Composition.
|
description: Name of the Composition.
|
||||||
|
|
@ -247,17 +225,17 @@ spec:
|
||||||
type: object
|
type: object
|
||||||
defaultCompositionUpdatePolicy:
|
defaultCompositionUpdatePolicy:
|
||||||
default: Automatic
|
default: Automatic
|
||||||
description: |-
|
description: DefaultCompositionUpdatePolicy is the policy used when
|
||||||
DefaultCompositionUpdatePolicy is the policy used when updating composites after a new
|
updating composites after a new Composition Revision has been created
|
||||||
Composition Revision has been created if no policy has been specified on the composite.
|
if no policy has been specified on the composite.
|
||||||
enum:
|
enum:
|
||||||
- Automatic
|
- Automatic
|
||||||
- Manual
|
- Manual
|
||||||
type: string
|
type: string
|
||||||
enforcedCompositionRef:
|
enforcedCompositionRef:
|
||||||
description: |-
|
description: EnforcedCompositionRef refers to the Composition resource
|
||||||
EnforcedCompositionRef refers to the Composition resource that will be used
|
that will be used by all composite instances whose schema is defined
|
||||||
by all composite instances whose schema is defined by this definition.
|
by this definition.
|
||||||
properties:
|
properties:
|
||||||
name:
|
name:
|
||||||
description: Name of the Composition.
|
description: Name of the Composition.
|
||||||
|
|
@ -266,10 +244,9 @@ spec:
|
||||||
- name
|
- name
|
||||||
type: object
|
type: object
|
||||||
group:
|
group:
|
||||||
description: |-
|
description: Group specifies the API group of the defined composite
|
||||||
Group specifies the API group of the defined composite resource.
|
resource. Composite resources are served under `/apis/<group>/...`.
|
||||||
Composite resources are served under `/apis/<group>/...`. Must match the
|
Must match the name of the XRD (in the form `<names.plural>.<group>`).
|
||||||
name of the XRD (in the form `<names.plural>.<group>`).
|
|
||||||
type: string
|
type: string
|
||||||
metadata:
|
metadata:
|
||||||
description: Metadata specifies the desired metadata for the defined
|
description: Metadata specifies the desired metadata for the defined
|
||||||
|
|
@ -278,58 +255,53 @@ spec:
|
||||||
annotations:
|
annotations:
|
||||||
additionalProperties:
|
additionalProperties:
|
||||||
type: string
|
type: string
|
||||||
description: |-
|
description: 'Annotations is an unstructured key value map stored
|
||||||
Annotations is an unstructured key value map stored with a resource that may be
|
with a resource that may be set by external tools to store and
|
||||||
set by external tools to store and retrieve arbitrary metadata. They are not
|
retrieve arbitrary metadata. They are not queryable and should
|
||||||
queryable and should be preserved when modifying objects.
|
be preserved when modifying objects. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations'
|
||||||
More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations
|
|
||||||
type: object
|
type: object
|
||||||
labels:
|
labels:
|
||||||
additionalProperties:
|
additionalProperties:
|
||||||
type: string
|
type: string
|
||||||
description: |-
|
description: 'Map of string keys and values that can be used to
|
||||||
Map of string keys and values that can be used to organize and categorize
|
organize and categorize (scope and select) objects. May match
|
||||||
(scope and select) objects. May match selectors of replication controllers
|
selectors of replication controllers More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels
|
||||||
More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels
|
and services. These labels are added to the composite resource
|
||||||
and services.
|
and claim CRD''s in addition to any labels defined by `CompositionResourceDefinition`
|
||||||
These labels are added to the composite resource and claim CRD's in addition
|
`metadata.labels`.'
|
||||||
to any labels defined by `CompositionResourceDefinition` `metadata.labels`.
|
|
||||||
type: object
|
type: object
|
||||||
type: object
|
type: object
|
||||||
names:
|
names:
|
||||||
description: |-
|
description: Names specifies the resource and kind names of the defined
|
||||||
Names specifies the resource and kind names of the defined composite
|
composite resource.
|
||||||
resource.
|
|
||||||
properties:
|
properties:
|
||||||
categories:
|
categories:
|
||||||
description: |-
|
description: categories is a list of grouped resources this custom
|
||||||
categories is a list of grouped resources this custom resource belongs to (e.g. 'all').
|
resource belongs to (e.g. 'all'). This is published in API discovery
|
||||||
This is published in API discovery documents, and used by clients to support invocations like
|
documents, and used by clients to support invocations like `kubectl
|
||||||
`kubectl get all`.
|
get all`.
|
||||||
items:
|
items:
|
||||||
type: string
|
type: string
|
||||||
type: array
|
type: array
|
||||||
kind:
|
kind:
|
||||||
description: |-
|
description: kind is the serialized kind of the resource. It is
|
||||||
kind is the serialized kind of the resource. It is normally CamelCase and singular.
|
normally CamelCase and singular. Custom resource instances will
|
||||||
Custom resource instances will use this value as the `kind` attribute in API calls.
|
use this value as the `kind` attribute in API calls.
|
||||||
type: string
|
type: string
|
||||||
listKind:
|
listKind:
|
||||||
description: listKind is the serialized kind of the list for this
|
description: listKind is the serialized kind of the list for this
|
||||||
resource. Defaults to "`kind`List".
|
resource. Defaults to "`kind`List".
|
||||||
type: string
|
type: string
|
||||||
plural:
|
plural:
|
||||||
description: |-
|
description: plural is the plural name of the resource to serve.
|
||||||
plural is the plural name of the resource to serve.
|
|
||||||
The custom resources are served under `/apis/<group>/<version>/.../<plural>`.
|
The custom resources are served under `/apis/<group>/<version>/.../<plural>`.
|
||||||
Must match the name of the CustomResourceDefinition (in the form `<names.plural>.<group>`).
|
Must match the name of the CustomResourceDefinition (in the
|
||||||
Must be all lowercase.
|
form `<names.plural>.<group>`). Must be all lowercase.
|
||||||
type: string
|
type: string
|
||||||
shortNames:
|
shortNames:
|
||||||
description: |-
|
description: shortNames are short names for the resource, exposed
|
||||||
shortNames are short names for the resource, exposed in API discovery documents,
|
in API discovery documents, and used by clients to support invocations
|
||||||
and used by clients to support invocations like `kubectl get <shortname>`.
|
like `kubectl get <shortname>`. It must be all lowercase.
|
||||||
It must be all lowercase.
|
|
||||||
items:
|
items:
|
||||||
type: string
|
type: string
|
||||||
type: array
|
type: array
|
||||||
|
|
@ -342,28 +314,27 @@ spec:
|
||||||
- plural
|
- plural
|
||||||
type: object
|
type: object
|
||||||
versions:
|
versions:
|
||||||
description: |-
|
description: 'Versions is the list of all API versions of the defined
|
||||||
Versions is the list of all API versions of the defined composite
|
composite resource. Version names are used to compute the order
|
||||||
resource. Version names are used to compute the order in which served
|
in which served versions are listed in API discovery. If the version
|
||||||
versions are listed in API discovery. If the version string is
|
string is "kube-like", it will sort above non "kube-like" version
|
||||||
"kube-like", it will sort above non "kube-like" version strings, which
|
strings, which are ordered lexicographically. "Kube-like" versions
|
||||||
are ordered lexicographically. "Kube-like" versions start with a "v",
|
start with a "v", then are followed by a number (the major version),
|
||||||
then are followed by a number (the major version), then optionally the
|
then optionally the string "alpha" or "beta" and another number
|
||||||
string "alpha" or "beta" and another number (the minor version). These
|
(the minor version). These are sorted first by GA > beta > alpha
|
||||||
are sorted first by GA > beta > alpha (where GA is a version with no
|
(where GA is a version with no suffix such as beta or alpha), and
|
||||||
suffix such as beta or alpha), and then by comparing major version, then
|
then by comparing major version, then minor version. An example
|
||||||
minor version. An example sorted list of versions: v10, v2, v1, v11beta2,
|
sorted list of versions: v10, v2, v1, v11beta2, v10beta3, v3beta1,
|
||||||
v10beta3, v3beta1, v12alpha1, v11alpha2, foo1, foo10.
|
v12alpha1, v11alpha2, foo1, foo10.'
|
||||||
items:
|
items:
|
||||||
description: CompositeResourceDefinitionVersion describes a version
|
description: CompositeResourceDefinitionVersion describes a version
|
||||||
of an XR.
|
of an XR.
|
||||||
properties:
|
properties:
|
||||||
additionalPrinterColumns:
|
additionalPrinterColumns:
|
||||||
description: |-
|
description: 'AdditionalPrinterColumns specifies additional
|
||||||
AdditionalPrinterColumns specifies additional columns returned in Table
|
columns returned in Table output. If no columns are specified,
|
||||||
output. If no columns are specified, a single column displaying the age
|
a single column displaying the age of the custom resource
|
||||||
of the custom resource is used. See the following link for details:
|
is used. See the following link for details: https://kubernetes.io/docs/reference/using-api/api-concepts/#receiving-resources-as-tables'
|
||||||
https://kubernetes.io/docs/reference/using-api/api-concepts/#receiving-resources-as-tables
|
|
||||||
items:
|
items:
|
||||||
description: CustomResourceColumnDefinition specifies a column
|
description: CustomResourceColumnDefinition specifies a column
|
||||||
for server side printing.
|
for server side printing.
|
||||||
|
|
@ -373,30 +344,32 @@ spec:
|
||||||
of this column.
|
of this column.
|
||||||
type: string
|
type: string
|
||||||
format:
|
format:
|
||||||
description: |-
|
description: format is an optional OpenAPI type definition
|
||||||
format is an optional OpenAPI type definition for this column. The 'name' format is applied
|
for this column. The 'name' format is applied to the
|
||||||
to the primary identifier column to assist in clients identifying column is the resource name.
|
primary identifier column to assist in clients identifying
|
||||||
See https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types for details.
|
column is the resource name. See https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types
|
||||||
|
for details.
|
||||||
type: string
|
type: string
|
||||||
jsonPath:
|
jsonPath:
|
||||||
description: |-
|
description: jsonPath is a simple JSON path (i.e. with
|
||||||
jsonPath is a simple JSON path (i.e. with array notation) which is evaluated against
|
array notation) which is evaluated against each custom
|
||||||
each custom resource to produce the value for this column.
|
resource to produce the value for this column.
|
||||||
type: string
|
type: string
|
||||||
name:
|
name:
|
||||||
description: name is a human readable name for the column.
|
description: name is a human readable name for the column.
|
||||||
type: string
|
type: string
|
||||||
priority:
|
priority:
|
||||||
description: |-
|
description: priority is an integer defining the relative
|
||||||
priority is an integer defining the relative importance of this column compared to others. Lower
|
importance of this column compared to others. Lower
|
||||||
numbers are considered higher priority. Columns that may be omitted in limited space scenarios
|
numbers are considered higher priority. Columns that
|
||||||
should be given a priority greater than 0.
|
may be omitted in limited space scenarios should be
|
||||||
|
given a priority greater than 0.
|
||||||
format: int32
|
format: int32
|
||||||
type: integer
|
type: integer
|
||||||
type:
|
type:
|
||||||
description: |-
|
description: type is an OpenAPI type definition for this
|
||||||
type is an OpenAPI type definition for this column.
|
column. See https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types
|
||||||
See https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types for details.
|
for details.
|
||||||
type: string
|
type: string
|
||||||
required:
|
required:
|
||||||
- jsonPath
|
- jsonPath
|
||||||
|
|
@ -405,43 +378,39 @@ spec:
|
||||||
type: object
|
type: object
|
||||||
type: array
|
type: array
|
||||||
deprecated:
|
deprecated:
|
||||||
description: |-
|
description: The deprecated field specifies that this version
|
||||||
The deprecated field specifies that this version is deprecated and should
|
is deprecated and should not be used.
|
||||||
not be used.
|
|
||||||
type: boolean
|
type: boolean
|
||||||
deprecationWarning:
|
deprecationWarning:
|
||||||
description: |-
|
description: DeprecationWarning specifies the message that should
|
||||||
DeprecationWarning specifies the message that should be shown to the user
|
be shown to the user when using this version.
|
||||||
when using this version.
|
|
||||||
maxLength: 256
|
maxLength: 256
|
||||||
type: string
|
type: string
|
||||||
name:
|
name:
|
||||||
description: |-
|
description: Name of this version, e.g. “v1”, “v2beta1”, etc.
|
||||||
Name of this version, e.g. “v1”, “v2beta1”, etc. Composite resources are
|
Composite resources are served under this version at `/apis/<group>/<version>/...`
|
||||||
served under this version at `/apis/<group>/<version>/...` if `served` is
|
if `served` is true.
|
||||||
true.
|
|
||||||
type: string
|
type: string
|
||||||
referenceable:
|
referenceable:
|
||||||
description: |-
|
description: Referenceable specifies that this version may be
|
||||||
Referenceable specifies that this version may be referenced by a
|
referenced by a Composition in order to configure which resources
|
||||||
Composition in order to configure which resources an XR may be composed
|
an XR may be composed of. Exactly one version must be marked
|
||||||
of. Exactly one version must be marked as referenceable; all Compositions
|
as referenceable; all Compositions must target only the referenceable
|
||||||
must target only the referenceable version. The referenceable version
|
version. The referenceable version must be served. It's mapped
|
||||||
must be served. It's mapped to the CRD's `spec.versions[*].storage` field.
|
to the CRD's `spec.versions[*].storage` field.
|
||||||
type: boolean
|
type: boolean
|
||||||
schema:
|
schema:
|
||||||
description: |-
|
description: Schema describes the schema used for validation,
|
||||||
Schema describes the schema used for validation, pruning, and defaulting
|
pruning, and defaulting of this version of the defined composite
|
||||||
of this version of the defined composite resource. Fields required by all
|
resource. Fields required by all composite resources will
|
||||||
composite resources will be injected into this schema automatically, and
|
be injected into this schema automatically, and will override
|
||||||
will override equivalently named fields in this schema. Omitting this
|
equivalently named fields in this schema. Omitting this schema
|
||||||
schema results in a schema that contains only the fields required by all
|
results in a schema that contains only the fields required
|
||||||
composite resources.
|
by all composite resources.
|
||||||
properties:
|
properties:
|
||||||
openAPIV3Schema:
|
openAPIV3Schema:
|
||||||
description: |-
|
description: OpenAPIV3Schema is the OpenAPI v3 schema to
|
||||||
OpenAPIV3Schema is the OpenAPI v3 schema to use for validation and
|
use for validation and pruning.
|
||||||
pruning.
|
|
||||||
type: object
|
type: object
|
||||||
x-kubernetes-preserve-unknown-fields: true
|
x-kubernetes-preserve-unknown-fields: true
|
||||||
type: object
|
type: object
|
||||||
|
|
@ -470,15 +439,13 @@ spec:
|
||||||
description: A Condition that may apply to a resource.
|
description: A Condition that may apply to a resource.
|
||||||
properties:
|
properties:
|
||||||
lastTransitionTime:
|
lastTransitionTime:
|
||||||
description: |-
|
description: LastTransitionTime is the last time this condition
|
||||||
LastTransitionTime is the last time this condition transitioned from one
|
transitioned from one status to another.
|
||||||
status to another.
|
|
||||||
format: date-time
|
format: date-time
|
||||||
type: string
|
type: string
|
||||||
message:
|
message:
|
||||||
description: |-
|
description: A Message containing details about this condition's
|
||||||
A Message containing details about this condition's last transition from
|
last transition from one status to another, if any.
|
||||||
one status to another, if any.
|
|
||||||
type: string
|
type: string
|
||||||
reason:
|
reason:
|
||||||
description: A Reason for this condition's last transition from
|
description: A Reason for this condition's last transition from
|
||||||
|
|
@ -489,9 +456,8 @@ spec:
|
||||||
False, or Unknown?
|
False, or Unknown?
|
||||||
type: string
|
type: string
|
||||||
type:
|
type:
|
||||||
description: |-
|
description: Type of this condition. At most one of each condition
|
||||||
Type of this condition. At most one of each condition type may apply to
|
type may apply to a resource at any point in time.
|
||||||
a resource at any point in time.
|
|
||||||
type: string
|
type: string
|
||||||
required:
|
required:
|
||||||
- lastTransitionTime
|
- lastTransitionTime
|
||||||
|
|
@ -504,17 +470,16 @@ spec:
|
||||||
- type
|
- type
|
||||||
x-kubernetes-list-type: map
|
x-kubernetes-list-type: map
|
||||||
controllers:
|
controllers:
|
||||||
description: |-
|
description: Controllers represents the status of the controllers
|
||||||
Controllers represents the status of the controllers that power this
|
that power this composite resource definition.
|
||||||
composite resource definition.
|
|
||||||
properties:
|
properties:
|
||||||
compositeResourceClaimType:
|
compositeResourceClaimType:
|
||||||
description: |-
|
description: The CompositeResourceClaimTypeRef is the type of
|
||||||
The CompositeResourceClaimTypeRef is the type of composite resource claim
|
composite resource claim that Crossplane is currently reconciling
|
||||||
that Crossplane is currently reconciling for this definition. Its version
|
for this definition. Its version will eventually become consistent
|
||||||
will eventually become consistent with the definition's referenceable
|
with the definition's referenceable version. Note that clients
|
||||||
version. Note that clients may interact with any served type; this is
|
may interact with any served type; this is simply the type that
|
||||||
simply the type that Crossplane interacts with.
|
Crossplane interacts with.
|
||||||
properties:
|
properties:
|
||||||
apiVersion:
|
apiVersion:
|
||||||
description: APIVersion of the type.
|
description: APIVersion of the type.
|
||||||
|
|
@ -527,12 +492,12 @@ spec:
|
||||||
- kind
|
- kind
|
||||||
type: object
|
type: object
|
||||||
compositeResourceType:
|
compositeResourceType:
|
||||||
description: |-
|
description: The CompositeResourceTypeRef is the type of composite
|
||||||
The CompositeResourceTypeRef is the type of composite resource that
|
resource that Crossplane is currently reconciling for this definition.
|
||||||
Crossplane is currently reconciling for this definition. Its version will
|
Its version will eventually become consistent with the definition's
|
||||||
eventually become consistent with the definition's referenceable version.
|
referenceable version. Note that clients may interact with any
|
||||||
Note that clients may interact with any served type; this is simply the
|
served type; this is simply the type that Crossplane interacts
|
||||||
type that Crossplane interacts with.
|
with.
|
||||||
properties:
|
properties:
|
||||||
apiVersion:
|
apiVersion:
|
||||||
description: APIVersion of the type.
|
description: APIVersion of the type.
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1
|
||||||
kind: CustomResourceDefinition
|
kind: CustomResourceDefinition
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
controller-gen.kubebuilder.io/version: v0.14.0
|
controller-gen.kubebuilder.io/version: v0.13.0
|
||||||
name: environmentconfigs.apiextensions.crossplane.io
|
name: environmentconfigs.apiextensions.crossplane.io
|
||||||
spec:
|
spec:
|
||||||
group: apiextensions.crossplane.io
|
group: apiextensions.crossplane.io
|
||||||
|
|
@ -28,26 +28,20 @@ spec:
|
||||||
values.
|
values.
|
||||||
properties:
|
properties:
|
||||||
apiVersion:
|
apiVersion:
|
||||||
description: |-
|
description: 'APIVersion defines the versioned schema of this representation
|
||||||
APIVersion defines the versioned schema of this representation of an object.
|
of an object. Servers should convert recognized schemas to the latest
|
||||||
Servers should convert recognized schemas to the latest internal value, and
|
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
|
||||||
may reject unrecognized values.
|
|
||||||
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
|
|
||||||
type: string
|
type: string
|
||||||
data:
|
data:
|
||||||
additionalProperties:
|
additionalProperties:
|
||||||
x-kubernetes-preserve-unknown-fields: true
|
x-kubernetes-preserve-unknown-fields: true
|
||||||
description: |-
|
description: The data of this EnvironmentConfig. This may contain any
|
||||||
The data of this EnvironmentConfig.
|
kind of structure that can be serialized into JSON.
|
||||||
This may contain any kind of structure that can be serialized into JSON.
|
|
||||||
type: object
|
type: object
|
||||||
kind:
|
kind:
|
||||||
description: |-
|
description: 'Kind is a string value representing the REST resource this
|
||||||
Kind is a string value representing the REST resource this object represents.
|
object represents. Servers may infer this from the endpoint the client
|
||||||
Servers may infer this from the endpoint the client submits requests to.
|
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
|
||||||
Cannot be updated.
|
|
||||||
In CamelCase.
|
|
||||||
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
|
|
||||||
type: string
|
type: string
|
||||||
metadata:
|
metadata:
|
||||||
type: object
|
type: object
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1
|
||||||
kind: CustomResourceDefinition
|
kind: CustomResourceDefinition
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
controller-gen.kubebuilder.io/version: v0.14.0
|
controller-gen.kubebuilder.io/version: v0.13.0
|
||||||
name: usages.apiextensions.crossplane.io
|
name: usages.apiextensions.crossplane.io
|
||||||
spec:
|
spec:
|
||||||
group: apiextensions.crossplane.io
|
group: apiextensions.crossplane.io
|
||||||
|
|
@ -32,19 +32,14 @@ spec:
|
||||||
resources.
|
resources.
|
||||||
properties:
|
properties:
|
||||||
apiVersion:
|
apiVersion:
|
||||||
description: |-
|
description: 'APIVersion defines the versioned schema of this representation
|
||||||
APIVersion defines the versioned schema of this representation of an object.
|
of an object. Servers should convert recognized schemas to the latest
|
||||||
Servers should convert recognized schemas to the latest internal value, and
|
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
|
||||||
may reject unrecognized values.
|
|
||||||
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
|
|
||||||
type: string
|
type: string
|
||||||
kind:
|
kind:
|
||||||
description: |-
|
description: 'Kind is a string value representing the REST resource this
|
||||||
Kind is a string value representing the REST resource this object represents.
|
object represents. Servers may infer this from the endpoint the client
|
||||||
Servers may infer this from the endpoint the client submits requests to.
|
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
|
||||||
Cannot be updated.
|
|
||||||
In CamelCase.
|
|
||||||
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
|
|
||||||
type: string
|
type: string
|
||||||
metadata:
|
metadata:
|
||||||
type: object
|
type: object
|
||||||
|
|
@ -58,9 +53,7 @@ spec:
|
||||||
description: API version of the referent.
|
description: API version of the referent.
|
||||||
type: string
|
type: string
|
||||||
kind:
|
kind:
|
||||||
description: |-
|
description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
|
||||||
Kind of the referent.
|
|
||||||
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
|
|
||||||
type: string
|
type: string
|
||||||
resourceRef:
|
resourceRef:
|
||||||
description: Reference to the resource.
|
description: Reference to the resource.
|
||||||
|
|
@ -72,14 +65,12 @@ spec:
|
||||||
- name
|
- name
|
||||||
type: object
|
type: object
|
||||||
resourceSelector:
|
resourceSelector:
|
||||||
description: |-
|
description: Selector to the resource. This field will be ignored
|
||||||
Selector to the resource.
|
if ResourceRef is set.
|
||||||
This field will be ignored if ResourceRef is set.
|
|
||||||
properties:
|
properties:
|
||||||
matchControllerRef:
|
matchControllerRef:
|
||||||
description: |-
|
description: MatchControllerRef ensures an object with the
|
||||||
MatchControllerRef ensures an object with the same controller reference
|
same controller reference as the selecting object is selected.
|
||||||
as the selecting object is selected.
|
|
||||||
type: boolean
|
type: boolean
|
||||||
matchLabels:
|
matchLabels:
|
||||||
additionalProperties:
|
additionalProperties:
|
||||||
|
|
@ -100,9 +91,7 @@ spec:
|
||||||
description: API version of the referent.
|
description: API version of the referent.
|
||||||
type: string
|
type: string
|
||||||
kind:
|
kind:
|
||||||
description: |-
|
description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
|
||||||
Kind of the referent.
|
|
||||||
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
|
|
||||||
type: string
|
type: string
|
||||||
resourceRef:
|
resourceRef:
|
||||||
description: Reference to the resource.
|
description: Reference to the resource.
|
||||||
|
|
@ -114,14 +103,12 @@ spec:
|
||||||
- name
|
- name
|
||||||
type: object
|
type: object
|
||||||
resourceSelector:
|
resourceSelector:
|
||||||
description: |-
|
description: Selector to the resource. This field will be ignored
|
||||||
Selector to the resource.
|
if ResourceRef is set.
|
||||||
This field will be ignored if ResourceRef is set.
|
|
||||||
properties:
|
properties:
|
||||||
matchControllerRef:
|
matchControllerRef:
|
||||||
description: |-
|
description: MatchControllerRef ensures an object with the
|
||||||
MatchControllerRef ensures an object with the same controller reference
|
same controller reference as the selecting object is selected.
|
||||||
as the selecting object is selected.
|
|
||||||
type: boolean
|
type: boolean
|
||||||
matchLabels:
|
matchLabels:
|
||||||
additionalProperties:
|
additionalProperties:
|
||||||
|
|
@ -158,15 +145,13 @@ spec:
|
||||||
description: A Condition that may apply to a resource.
|
description: A Condition that may apply to a resource.
|
||||||
properties:
|
properties:
|
||||||
lastTransitionTime:
|
lastTransitionTime:
|
||||||
description: |-
|
description: LastTransitionTime is the last time this condition
|
||||||
LastTransitionTime is the last time this condition transitioned from one
|
transitioned from one status to another.
|
||||||
status to another.
|
|
||||||
format: date-time
|
format: date-time
|
||||||
type: string
|
type: string
|
||||||
message:
|
message:
|
||||||
description: |-
|
description: A Message containing details about this condition's
|
||||||
A Message containing details about this condition's last transition from
|
last transition from one status to another, if any.
|
||||||
one status to another, if any.
|
|
||||||
type: string
|
type: string
|
||||||
reason:
|
reason:
|
||||||
description: A Reason for this condition's last transition from
|
description: A Reason for this condition's last transition from
|
||||||
|
|
@ -177,9 +162,8 @@ spec:
|
||||||
False, or Unknown?
|
False, or Unknown?
|
||||||
type: string
|
type: string
|
||||||
type:
|
type:
|
||||||
description: |-
|
description: Type of this condition. At most one of each condition
|
||||||
Type of this condition. At most one of each condition type may apply to
|
type may apply to a resource at any point in time.
|
||||||
a resource at any point in time.
|
|
||||||
type: string
|
type: string
|
||||||
required:
|
required:
|
||||||
- lastTransitionTime
|
- lastTransitionTime
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
release="release-1.16"
|
release="release-1.14"
|
||||||
|
|
||||||
apiextensions=$(gh api --jq '.[].name' "/repos/crossplane/crossplane/contents/cluster/crds?ref=${release}" | grep apiextensions)
|
apiextensions=$(gh api --jq '.[].name' "/repos/crossplane/crossplane/contents/cluster/crds?ref=${release}" | grep apiextensions)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
||||||
package io.crossplane.compositefunctions;
|
|
||||||
|
|
||||||
import io.crossplane.compositefunctions.protobuf.Credentials;
|
|
||||||
import io.crossplane.compositefunctions.protobuf.Resources;
|
|
||||||
import io.crossplane.compositefunctions.protobuf.State;
|
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Holder for the request from crossplane
|
|
||||||
* @param observedState The observedstate of the crossplane resources
|
|
||||||
* @param extraResourcesMap A map of any extra resources requested
|
|
||||||
* @param credentialsMap A map of credentials sent as input
|
|
||||||
*/
|
|
||||||
public record CrossplaneFunctionRequest(State observedState,
|
|
||||||
Map<String, Resources> extraResourcesMap,
|
|
||||||
Map<String, Credentials> credentialsMap) {
|
|
||||||
}
|
|
||||||
|
|
@ -1,6 +1,10 @@
|
||||||
package io.crossplane.compositefunctions;
|
package io.crossplane.compositefunctions.base;
|
||||||
|
|
||||||
import io.crossplane.compositefunctions.protobuf.*;
|
|
||||||
|
import io.crossplane.compositefunctions.protobuf.FunctionRunnerServiceGrpc;
|
||||||
|
import io.crossplane.compositefunctions.protobuf.RunFunctionRequest;
|
||||||
|
import io.crossplane.compositefunctions.protobuf.RunFunctionResponse;
|
||||||
|
import io.crossplane.compositefunctions.protobuf.State;
|
||||||
import io.grpc.stub.StreamObserver;
|
import io.grpc.stub.StreamObserver;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
@ -25,11 +29,12 @@ public abstract class CrossplaneCompositeFunctionBase extends FunctionRunnerServ
|
||||||
State desired = request.getDesired();
|
State desired = request.getDesired();
|
||||||
|
|
||||||
// Copy existing state into new desired state
|
// Copy existing state into new desired state
|
||||||
// Should these be sent to the function? Probably?
|
|
||||||
desiredBuilder.putAllResources(desired.getResourcesMap());
|
desiredBuilder.putAllResources(desired.getResourcesMap());
|
||||||
|
|
||||||
CrossplaneFunctionRequest crossplaneFunctionRequest = new CrossplaneFunctionRequest(request.getObserved(),
|
CrossplaneFunctionRequest crossplaneFunctionRequest = new CrossplaneFunctionRequest(request.getObserved(),
|
||||||
request.getExtraResourcesMap(), request.getCredentialsMap());
|
request.getDesired());
|
||||||
|
|
||||||
|
// request.getExtraResourcesMap(), request.getCredentialsMap()
|
||||||
|
|
||||||
logger.debug("Calling method with implemented logic");
|
logger.debug("Calling method with implemented logic");
|
||||||
CrossplaneFunctionResponse crossplaneFunctionResponse = runFunction(crossplaneFunctionRequest);
|
CrossplaneFunctionResponse crossplaneFunctionResponse = runFunction(crossplaneFunctionRequest);
|
||||||
|
|
@ -39,15 +44,26 @@ public abstract class CrossplaneCompositeFunctionBase extends FunctionRunnerServ
|
||||||
desiredBuilder.putResources(entry.getKey(), CrossplaneObjectToProtobufConverter.convertToResource(entry.getValue()));
|
desiredBuilder.putResources(entry.getKey(), CrossplaneObjectToProtobufConverter.convertToResource(entry.getValue()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RunFunctionResponse.Builder responseBuilder = RunFunctionResponse.newBuilder();
|
||||||
|
|
||||||
|
/*
|
||||||
|
if (! crossplaneFunctionResponse.resourceSelectors().isEmpty()) {
|
||||||
Requirements requirements = Requirements.newBuilder()
|
Requirements requirements = Requirements.newBuilder()
|
||||||
.putAllExtraResources(crossplaneFunctionResponse.resourceSelectors())
|
.putAllExtraResources(crossplaneFunctionResponse.resourceSelectors())
|
||||||
.build();
|
.build();
|
||||||
|
responseBuilder.setRequirements(requirements);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
RunFunctionResponse runFunctionResponse = RunFunctionResponse
|
if (! crossplaneFunctionResponse.results().isEmpty()) {
|
||||||
.newBuilder()
|
responseBuilder.addAllResults(crossplaneFunctionResponse.results());
|
||||||
.setRequirements(requirements)
|
}
|
||||||
.addAllResults(crossplaneFunctionResponse.results())
|
|
||||||
.setDesired(desiredBuilder.build())
|
if (desiredBuilder.getResourcesCount() > 0) {
|
||||||
|
responseBuilder.setDesired(desiredBuilder.build());
|
||||||
|
}
|
||||||
|
|
||||||
|
RunFunctionResponse runFunctionResponse = responseBuilder
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
responseObserver.onNext(runFunctionResponse);
|
responseObserver.onNext(runFunctionResponse);
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
package io.crossplane.compositefunctions.base;
|
||||||
|
|
||||||
|
import io.crossplane.compositefunctions.protobuf.State;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Holder for the request from crossplane
|
||||||
|
* @param observedState The observedstate of the crossplane resources
|
||||||
|
* @param desiredState The sum of previously called functions state. To override, create a new resource with the same name in the response
|
||||||
|
*/
|
||||||
|
public record CrossplaneFunctionRequest(State observedState, State desiredState) {
|
||||||
|
|
||||||
|
// * @param extraResourcesMap A map of any extra resources requested
|
||||||
|
// * @param credentialsMap A map of credentials sent as input
|
||||||
|
// Map<String, Resources> extraResourcesMap,
|
||||||
|
// Map<String, Credentials> credentialsMap
|
||||||
|
}
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package io.crossplane.compositefunctions;
|
package io.crossplane.compositefunctions.base;
|
||||||
|
|
||||||
import io.crossplane.compositefunctions.protobuf.ResourceSelector;
|
|
||||||
import io.crossplane.compositefunctions.protobuf.Result;
|
import io.crossplane.compositefunctions.protobuf.Result;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
@ -11,18 +10,19 @@ import java.util.Map;
|
||||||
/**
|
/**
|
||||||
* Holder for the response to Crossplane
|
* Holder for the response to Crossplane
|
||||||
* @param desiredResources Map of the desired resources
|
* @param desiredResources Map of the desired resources
|
||||||
* @param resourceSelectors Map of the resource selectors for any extra resources
|
|
||||||
* @param results List of the results
|
* @param results List of the results
|
||||||
*/
|
*/
|
||||||
public record CrossplaneFunctionResponse(Map<String, Object> desiredResources,
|
public record CrossplaneFunctionResponse(Map<String, Object> desiredResources,
|
||||||
Map<String, ResourceSelector> resourceSelectors,
|
|
||||||
List<Result> results) {
|
List<Result> results) {
|
||||||
|
|
||||||
|
// @param resourceSelectors Map of the resource selectors for any extra resources
|
||||||
|
// Map<String, ResourceSelector> resourceSelectors,
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an empty response with all fields initiated
|
* Create an empty response with all fields initiated
|
||||||
*/
|
*/
|
||||||
public CrossplaneFunctionResponse() {
|
public CrossplaneFunctionResponse() {
|
||||||
this(new HashMap<>(), new HashMap<>(), new ArrayList<>());
|
this(new HashMap<>(), new ArrayList<>());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.crossplane.compositefunctions;
|
package io.crossplane.compositefunctions.base;
|
||||||
|
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import com.google.protobuf.Struct;
|
import com.google.protobuf.Struct;
|
||||||
|
|
@ -0,0 +1,41 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>io.crossplane.compositefunctions</groupId>
|
||||||
|
<artifactId>crossplane-parent</artifactId>
|
||||||
|
<version>${revision}</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<artifactId>crossplane-function-example</artifactId>
|
||||||
|
<description>Crossplane example implementation of a function</description>
|
||||||
|
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.crossplane.compositefunctions</groupId>
|
||||||
|
<artifactId>crossplane-function-springboot-starter</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.slf4j</groupId>
|
||||||
|
<artifactId>slf4j-api</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.fasterxml.jackson.core</groupId>
|
||||||
|
<artifactId>jackson-databind</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-autoconfigure</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.bouncycastle</groupId>
|
||||||
|
<artifactId>bcpkix-jdk18on</artifactId>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</project>
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
package io.crossplane.compositefunctions.example;
|
||||||
|
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
|
||||||
|
import java.security.Security;
|
||||||
|
|
||||||
|
@SpringBootApplication
|
||||||
|
public class ExampleFunctionApplication {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
// The bouncycastle provider is needed for the autogenerated certificates that crossplane generates to work
|
||||||
|
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
|
||||||
|
SpringApplication.run(ExampleFunctionApplication.class, args);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
package io.crossplane.compositefunctions.example.model;
|
||||||
|
|
||||||
|
import io.fabric8.kubernetes.client.CustomResource;
|
||||||
|
import io.fabric8.kubernetes.model.annotation.Group;
|
||||||
|
import io.fabric8.kubernetes.model.annotation.Plural;
|
||||||
|
import io.fabric8.kubernetes.model.annotation.Singular;
|
||||||
|
import io.fabric8.kubernetes.model.annotation.Version;
|
||||||
|
|
||||||
|
@Version(value = "v1", storage = true, served = true)
|
||||||
|
@Group("example.crossplane.io")
|
||||||
|
@Singular("XBuckets")
|
||||||
|
@Plural("XBucketsList")
|
||||||
|
public class XBuckets extends CustomResource<XBucketsSpec, Void> {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
package io.crossplane.compositefunctions.example.model;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||||
|
public class XBucketsSpec {
|
||||||
|
|
||||||
|
private String region;
|
||||||
|
private List<String> names;
|
||||||
|
|
||||||
|
public String getRegion() {
|
||||||
|
return region;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRegion(String region) {
|
||||||
|
this.region = region;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> getNames() {
|
||||||
|
return names;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNames(List<String> names) {
|
||||||
|
this.names = names;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
package io.crossplane.compositefunctions.example.resource;
|
||||||
|
|
||||||
|
import io.crossplane.compositefunctions.base.CrossplaneCompositeFunctionBase;
|
||||||
|
import io.crossplane.compositefunctions.base.CrossplaneFunctionRequest;
|
||||||
|
import io.crossplane.compositefunctions.base.CrossplaneFunctionResponse;
|
||||||
|
import io.crossplane.compositefunctions.example.model.XBuckets;
|
||||||
|
import io.crossplane.compositefunctions.starter.conversion.CrossplaneResourceService;
|
||||||
|
import net.devh.boot.grpc.server.service.GrpcService;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
@GrpcService
|
||||||
|
public class ExampleFunctionResource extends CrossplaneCompositeFunctionBase {
|
||||||
|
|
||||||
|
final CrossplaneResourceService crossplaneResourceService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public ExampleFunctionResource(CrossplaneResourceService crossplaneResourceService) {
|
||||||
|
this.crossplaneResourceService = crossplaneResourceService;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CrossplaneFunctionResponse runFunction(CrossplaneFunctionRequest crossplaneFunctionRequest) {
|
||||||
|
Optional<XBuckets> xBuckets = crossplaneResourceService.getResource(crossplaneFunctionRequest.observedState(), XBuckets.class);
|
||||||
|
|
||||||
|
return new CrossplaneFunctionResponse();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
grpc:
|
||||||
|
server:
|
||||||
|
security:
|
||||||
|
# For local testing we disable the security setting. This enables us to use the crossplane beta render functionality
|
||||||
|
enabled: false
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
grpc:
|
||||||
|
server:
|
||||||
|
security:
|
||||||
|
# When runnin on kubernetes, crossplane expects a TLS endpoint to be presented, and
|
||||||
|
# injects the pod with the certificate and ca store to use. We just point to the mounted files
|
||||||
|
# in our config to be compliant.
|
||||||
|
# See also the ExampleFunctionApplication class, as we need to register bouncycastle as the provider for these
|
||||||
|
# certificates to work in Java
|
||||||
|
enabled: true
|
||||||
|
client-auth: optional
|
||||||
|
certificate-chain: file:///tls/server/tls.crt
|
||||||
|
private-key: file:///tls/server/tls.key
|
||||||
|
trust-cert-collection: file:///tls/server/ca.crt
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
spring:
|
||||||
|
profiles:
|
||||||
|
active: development
|
||||||
|
|
||||||
|
|
||||||
|
grpc:
|
||||||
|
server:
|
||||||
|
port: 9443
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
apiVersion: apiextensions.crossplane.io/v1
|
||||||
|
kind: Composition
|
||||||
|
metadata:
|
||||||
|
name: create-buckets
|
||||||
|
spec:
|
||||||
|
compositeTypeRef:
|
||||||
|
apiVersion: example.crossplane.io/v1
|
||||||
|
kind: XBuckets
|
||||||
|
mode: Pipeline
|
||||||
|
pipeline:
|
||||||
|
- step: create-buckets
|
||||||
|
functionRef:
|
||||||
|
name: function-example
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
apiVersion: pkg.crossplane.io/v1beta1
|
||||||
|
kind: Function
|
||||||
|
metadata:
|
||||||
|
name: function-example
|
||||||
|
annotations:
|
||||||
|
render.crossplane.io/runtime: Development
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
apiVersion: example.crossplane.io/v1
|
||||||
|
kind: XBuckets
|
||||||
|
metadata:
|
||||||
|
name: example-buckets
|
||||||
|
spec:
|
||||||
|
region: us-east-2
|
||||||
|
names:
|
||||||
|
- crossplane-functions-example-a
|
||||||
|
- crossplane-functions-example-b
|
||||||
|
- crossplane-functions-example-c
|
||||||
|
|
@ -0,0 +1,55 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>io.crossplane.compositefunctions</groupId>
|
||||||
|
<artifactId>crossplane-parent</artifactId>
|
||||||
|
<version>${revision}</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<artifactId>crossplane-function-springboot-starter</artifactId>
|
||||||
|
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.crossplane.compositefunctions</groupId>
|
||||||
|
<artifactId>crossplane-function-base</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.crossplane.compositefunctions</groupId>
|
||||||
|
<artifactId>crossplane-crd-model</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-autoconfigure</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.protobuf</groupId>
|
||||||
|
<artifactId>protobuf-java-util</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.devh</groupId>
|
||||||
|
<artifactId>grpc-server-spring-boot-starter</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.fasterxml.jackson.module</groupId>
|
||||||
|
<artifactId>jackson-module-jsonSchema-jakarta</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.fabric8</groupId>
|
||||||
|
<artifactId>kubernetes-client</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
|
||||||
|
</project>
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
package io.crossplane.compositefunctions.starter.config;
|
||||||
|
|
||||||
|
import org.springframework.boot.autoconfigure.AutoConfiguration;
|
||||||
|
import org.springframework.context.annotation.ComponentScan;
|
||||||
|
|
||||||
|
@AutoConfiguration
|
||||||
|
@ComponentScan(basePackages = {"io.crossplane.compositefunctions.starter.conversion"})
|
||||||
|
public class CrossplaneServiceConfiguration {
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,53 @@
|
||||||
|
package io.crossplane.compositefunctions.starter.conversion;
|
||||||
|
|
||||||
|
import com.google.protobuf.util.JsonFormat;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class CrossplaneExtraResourcesService {
|
||||||
|
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(CrossplaneExtraResourcesService.class);
|
||||||
|
private final JsonFormat.Printer printer = JsonFormat.printer();
|
||||||
|
|
||||||
|
/*
|
||||||
|
public <T> Optional<T> getExtraResource(Map<String, Resources> extraResources, String resourceName, Class<T> clazz) {
|
||||||
|
return getExtraResources(extraResources, resourceName, 1, clazz).get(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T> List<Optional<T>> getExtraResources(Map<String, Resources> extraResources, String resourceName, int expectedResources, Class<T> clazz) {
|
||||||
|
List<Optional<T>> result = new ArrayList<>();
|
||||||
|
Resources resources = extraResources.get(resourceName);
|
||||||
|
|
||||||
|
if (resources != null ) {
|
||||||
|
if (resources.getItemsCount() != expectedResources) {
|
||||||
|
throw new CrossplaneUnexpectedItemsException("Unexpected number of resources. Expected " + expectedResources + " but got " + resources.getItemsCount() + ".");
|
||||||
|
}
|
||||||
|
for (int i = 0; i < expectedResources; i++) {
|
||||||
|
try {
|
||||||
|
logger.debug("We have an extra resource " + clazz.getSimpleName());
|
||||||
|
result.add(Optional.ofNullable(Serialization.unmarshal(printer.print(resources.getItems(i).getResource()), clazz)));
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new CrossplaneUnmarshallException("Error when unmarshalling the extra resource " + clazz.getName(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, ResourceSelector> createExtraResourcesSelector(String resourceName, HasMetadata type) {
|
||||||
|
ResourceSelector resourceSelector = ResourceSelector.newBuilder()
|
||||||
|
.setApiVersion(type.getApiVersion())
|
||||||
|
.setKind(type.getKind())
|
||||||
|
.setMatchName(resourceName)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
return Map.of(resourceName, resourceSelector);
|
||||||
|
}
|
||||||
|
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,36 @@
|
||||||
|
package io.crossplane.compositefunctions.starter.conversion;
|
||||||
|
|
||||||
|
|
||||||
|
import com.google.protobuf.util.JsonFormat;
|
||||||
|
import io.crossplane.compositefunctions.protobuf.Resource;
|
||||||
|
import io.crossplane.compositefunctions.protobuf.State;
|
||||||
|
import io.crossplane.compositefunctions.starter.exception.CrossplaneUnmarshallException;
|
||||||
|
import io.fabric8.kubernetes.client.utils.Serialization;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class CrossplaneObservableService {
|
||||||
|
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(CrossplaneObservableService.class);
|
||||||
|
private final JsonFormat.Printer printer = JsonFormat.printer();
|
||||||
|
|
||||||
|
public <T> Optional<T> getObservableResource(String resourceName, State observedState, Class<T> clazz) {
|
||||||
|
Resource observedResource = observedState.getResourcesOrDefault(resourceName, null);
|
||||||
|
Optional<T> result = Optional.empty();
|
||||||
|
if (observedResource != null) {
|
||||||
|
try {
|
||||||
|
logger.debug("We have an observed " + clazz.getSimpleName());
|
||||||
|
result = Optional.ofNullable(Serialization.unmarshal(printer.print(observedResource.getResource()), clazz));
|
||||||
|
} catch (Exception e) {
|
||||||
|
|
||||||
|
throw new CrossplaneUnmarshallException("Error when unmarshalling the observed resource " + clazz.getName(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
package io.crossplane.compositefunctions.starter.conversion;
|
||||||
|
|
||||||
|
import com.google.protobuf.util.JsonFormat;
|
||||||
|
import io.crossplane.compositefunctions.protobuf.State;
|
||||||
|
import io.crossplane.compositefunctions.starter.exception.CrossplaneUnmarshallException;
|
||||||
|
import io.fabric8.kubernetes.client.utils.Serialization;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class CrossplaneResourceService {
|
||||||
|
|
||||||
|
final JsonFormat.Printer printer = JsonFormat.printer();
|
||||||
|
|
||||||
|
public <T> Optional<T> getResource(State observedState, Class<T> clazz) {
|
||||||
|
try {
|
||||||
|
String resource = printer.print(observedState.getComposite().getResource());
|
||||||
|
return Optional.ofNullable(Serialization.unmarshal(resource, clazz));
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new CrossplaneUnmarshallException("Error when unmarshalling the resource " + clazz.getName(), e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
package io.crossplane.compositefunctions.starter.exception;
|
||||||
|
|
||||||
|
public class CrossplaneUnexpectedItemsException extends RuntimeException {
|
||||||
|
|
||||||
|
public CrossplaneUnexpectedItemsException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public CrossplaneUnexpectedItemsException(String message, Throwable cause) {
|
||||||
|
super(message, cause);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
package io.crossplane.compositefunctions.starter.exception;
|
||||||
|
|
||||||
|
public class CrossplaneUnmarshallException extends RuntimeException {
|
||||||
|
|
||||||
|
public CrossplaneUnmarshallException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public CrossplaneUnmarshallException(String message, Throwable cause) {
|
||||||
|
super(message, cause);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,84 @@
|
||||||
|
package io.crossplane.compositefunctions.starter.registration;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatTypes;
|
||||||
|
import com.fasterxml.jackson.module.jsonSchema.jakarta.JsonSchema;
|
||||||
|
import com.fasterxml.jackson.module.jsonSchema.jakarta.JsonSchemaGenerator;
|
||||||
|
import com.fasterxml.jackson.module.jsonSchema.jakarta.types.ArraySchema;
|
||||||
|
import io.crossplane.apiextensions.v1.compositeresourcedefinitionspec.versions.schema.OpenAPIV3Schema;
|
||||||
|
import io.fabric8.kubernetes.api.model.apiextensions.v1.JSONSchemaProps;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
public class CrossplanJsonSchemaGenerator {
|
||||||
|
|
||||||
|
public static OpenAPIV3Schema getOpenAPIV3Schema(Class clazz, Class mixin) {
|
||||||
|
try {
|
||||||
|
ObjectMapper mapper = new ObjectMapper();
|
||||||
|
//Add mixin class to ignore id field as OpenShift does not support it.
|
||||||
|
mapper.addMixIn(clazz, mixin);
|
||||||
|
// apper.addMixIn(ObjectMeta.class, MetadataIgnorer.class);
|
||||||
|
JsonSchemaGenerator generator = new JsonSchemaGenerator(mapper);
|
||||||
|
JsonSchema jsonSchema = generator.generateSchema(clazz);
|
||||||
|
|
||||||
|
removeIdField(jsonSchema);
|
||||||
|
//Since JSONSchemaProps and JsonSchema is two POJOs of the same JSON schema type (specified by https://json-schema.org/specification.html)
|
||||||
|
//We would ideally just cast like this: JSONSchemaProps props = (JSONSchemaProps) jsonSchema;
|
||||||
|
//But that is not allowed, so we have to write as string and re-parse.
|
||||||
|
//This was the easiest way to convert from one to the other
|
||||||
|
String s = mapper.writeValueAsString(jsonSchema);
|
||||||
|
|
||||||
|
return mapper.readValue(s, OpenAPIV3Schema.class);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException("Failed to generate JSONSchema for class " + clazz.getSimpleName(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void removeIdField(JsonSchema jsonSchema) {
|
||||||
|
jsonSchema.setId(null);
|
||||||
|
|
||||||
|
if (JsonFormatTypes.OBJECT.equals(jsonSchema.getType())) {
|
||||||
|
jsonSchema.asObjectSchema().getProperties().forEach((key, value) -> removeIdField(value));
|
||||||
|
} else if (JsonFormatTypes.ARRAY.equals(jsonSchema.getType())) {
|
||||||
|
final ArraySchema.Items items = jsonSchema.asArraySchema().getItems();
|
||||||
|
if (items.isArrayItems()) {
|
||||||
|
Stream.of(items.asArrayItems().getJsonSchemas()).forEach(s -> removeIdField(s));
|
||||||
|
} else {
|
||||||
|
removeIdField(items.asSingleItems().getSchema());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static JSONSchemaProps getJsonSchema(Class clazz) {
|
||||||
|
try {
|
||||||
|
ObjectMapper mapper = new ObjectMapper();
|
||||||
|
//Add mixin class to ignore id field as OpenShift does not support it.
|
||||||
|
mapper.addMixIn(JSONSchemaProps.class, IdIgnorer.class);
|
||||||
|
// apper.addMixIn(ObjectMeta.class, MetadataIgnorer.class);
|
||||||
|
JsonSchemaGenerator generator = new JsonSchemaGenerator(mapper);
|
||||||
|
JsonSchema jsonSchema = generator.generateSchema(clazz);
|
||||||
|
|
||||||
|
//Since JSONSchemaProps and JsonSchema is two POJOs of the same JSON schema type (specified by https://json-schema.org/specification.html)
|
||||||
|
//We would ideally just cast like this: JSONSchemaProps props = (JSONSchemaProps) jsonSchema;
|
||||||
|
//But that is not allowed, so we have to write as string and re-parse.
|
||||||
|
//This was the easiest way to convert from one to the other
|
||||||
|
String s = mapper.writeValueAsString(jsonSchema);
|
||||||
|
return mapper.readValue(s, JSONSchemaProps.class);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException("Failed to generate JSONSchema for class " + clazz.getSimpleName(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private abstract class IdIgnorer {
|
||||||
|
|
||||||
|
@JsonIgnore
|
||||||
|
String id;
|
||||||
|
@JsonIgnore abstract String getId();
|
||||||
|
@JsonIgnore abstract void setId(java.lang.String id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,43 @@
|
||||||
|
package io.crossplane.compositefunctions.starter.registration;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
|
import io.fabric8.kubernetes.api.model.ObjectMeta;
|
||||||
|
|
||||||
|
public abstract class CrossplaneCompositeResourceMixin {
|
||||||
|
|
||||||
|
@JsonIgnore
|
||||||
|
String id;
|
||||||
|
@JsonIgnore
|
||||||
|
ObjectMeta metadata;
|
||||||
|
@JsonIgnore
|
||||||
|
String apiVersion = "";
|
||||||
|
|
||||||
|
@JsonIgnore
|
||||||
|
String kind = "";
|
||||||
|
|
||||||
|
@JsonIgnore
|
||||||
|
Void status;
|
||||||
|
|
||||||
|
@JsonIgnore
|
||||||
|
abstract ObjectMeta getMetadata();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@JsonIgnore
|
||||||
|
abstract void setMetadata(ObjectMeta metadata);
|
||||||
|
|
||||||
|
@JsonIgnore
|
||||||
|
abstract String getApiVersion();
|
||||||
|
|
||||||
|
@JsonIgnore
|
||||||
|
abstract void setApiVersion(String apiVersion);
|
||||||
|
|
||||||
|
@JsonIgnore
|
||||||
|
abstract String getKind();
|
||||||
|
|
||||||
|
@JsonIgnore
|
||||||
|
abstract void setKind(String kind);
|
||||||
|
|
||||||
|
@JsonIgnore abstract String getId();
|
||||||
|
@JsonIgnore abstract void setId(String id);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,146 @@
|
||||||
|
package io.crossplane.compositefunctions.starter.registration;
|
||||||
|
|
||||||
|
import io.crossplane.apiextensions.v1.CompositeResourceDefinition;
|
||||||
|
import io.crossplane.apiextensions.v1.CompositeResourceDefinitionSpec;
|
||||||
|
import io.crossplane.apiextensions.v1.Composition;
|
||||||
|
import io.crossplane.apiextensions.v1.CompositionSpec;
|
||||||
|
import io.crossplane.apiextensions.v1.compositeresourcedefinitionspec.ClaimNames;
|
||||||
|
import io.crossplane.apiextensions.v1.compositeresourcedefinitionspec.Names;
|
||||||
|
import io.crossplane.apiextensions.v1.compositeresourcedefinitionspec.Versions;
|
||||||
|
import io.crossplane.apiextensions.v1.compositeresourcedefinitionspec.versions.Schema;
|
||||||
|
import io.crossplane.apiextensions.v1.compositionspec.CompositeTypeRef;
|
||||||
|
import io.crossplane.apiextensions.v1.compositionspec.Pipeline;
|
||||||
|
import io.crossplane.apiextensions.v1.compositionspec.pipeline.FunctionRef;
|
||||||
|
import io.fabric8.kubernetes.api.model.Namespaced;
|
||||||
|
import io.fabric8.kubernetes.client.CustomResource;
|
||||||
|
import io.fabric8.kubernetes.client.KubernetesClient;
|
||||||
|
import io.fabric8.kubernetes.client.dsl.Resource;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static io.crossplane.compositefunctions.starter.registration.CrossplanJsonSchemaGenerator.getOpenAPIV3Schema;
|
||||||
|
|
||||||
|
public class CrossplaneCompositeResourceService {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public static <T extends CustomResource<?, Void>> void registerOrUpdateCompositeResource(String functionName,
|
||||||
|
List<String> additionalFunctions,
|
||||||
|
T functionDefinition,
|
||||||
|
KubernetesClient kubernetesClient) {
|
||||||
|
|
||||||
|
CompositeResourceDefinition compositeResourceDefinition = createCompositeResourceDefinition(functionDefinition);
|
||||||
|
|
||||||
|
registerOrUpdateCompositeResourceDefinition(compositeResourceDefinition, kubernetesClient);
|
||||||
|
|
||||||
|
Composition composition = createCompositionDefinition(functionName, additionalFunctions, functionDefinition);
|
||||||
|
|
||||||
|
registerOrUpdateCompositeResourceDefinition(composition, kubernetesClient);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void registerOrUpdateCompositeResourceDefinition(CompositeResourceDefinition compositeResourceDefinition, KubernetesClient kubernetesClient) {
|
||||||
|
var customResourceClient = kubernetesClient.resources(CompositeResourceDefinition.class);
|
||||||
|
Resource<CompositeResourceDefinition> resource = customResourceClient.resource(compositeResourceDefinition);
|
||||||
|
|
||||||
|
CompositeResourceDefinition serverSide = resource.get();
|
||||||
|
if (serverSide == null) {
|
||||||
|
resource.create();
|
||||||
|
} else {
|
||||||
|
resource.update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T extends CustomResource<?, Void>> CompositeResourceDefinition createCompositeResourceDefinition(T functionDefinition) { //}, Class functionMixin) {
|
||||||
|
|
||||||
|
CompositeResourceDefinition compositeResourceDefinition = new CompositeResourceDefinition();
|
||||||
|
compositeResourceDefinition.setMetadata(CrossplaneMetadataBuilder.createMetadata(functionDefinition.getCRDName()));
|
||||||
|
|
||||||
|
CompositeResourceDefinitionSpec spec = new CompositeResourceDefinitionSpec();
|
||||||
|
spec.setGroup(functionDefinition.getGroup());
|
||||||
|
|
||||||
|
String namePrefix = "";
|
||||||
|
|
||||||
|
if (functionDefinition instanceof Namespaced) {
|
||||||
|
ClaimNames claimNames = new ClaimNames();
|
||||||
|
claimNames.setKind(functionDefinition.getKind());
|
||||||
|
claimNames.setPlural(functionDefinition.getPlural());
|
||||||
|
claimNames.setSingular(functionDefinition.getSingular());
|
||||||
|
spec.setClaimNames(claimNames);
|
||||||
|
namePrefix = "x";
|
||||||
|
}
|
||||||
|
|
||||||
|
Names names = new Names();
|
||||||
|
names.setKind(namePrefix + functionDefinition.getKind());
|
||||||
|
names.setPlural(namePrefix + functionDefinition.getPlural());
|
||||||
|
names.setSingular(namePrefix + functionDefinition.getSingular());
|
||||||
|
spec.setNames(names);
|
||||||
|
|
||||||
|
Versions versions = new Versions();
|
||||||
|
versions.setName(functionDefinition.getVersion());
|
||||||
|
|
||||||
|
// This is not 100%. isStorage vs referencable. Need to check the crossplan docs
|
||||||
|
versions.setReferenceable(functionDefinition.isStorage());
|
||||||
|
versions.setServed(functionDefinition.isServed());
|
||||||
|
|
||||||
|
|
||||||
|
Schema schema = new Schema();
|
||||||
|
schema.setOpenAPIV3Schema(getOpenAPIV3Schema(functionDefinition.getClass(), CrossplaneCompositeResourceMixin.class));
|
||||||
|
|
||||||
|
versions.setSchema(schema);
|
||||||
|
spec.setVersions(List.of(versions));
|
||||||
|
compositeResourceDefinition.setSpec(spec);
|
||||||
|
return compositeResourceDefinition;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static void registerOrUpdateCompositeResourceDefinition(Composition compositeResourceDefinition, KubernetesClient kubernetesClient) {
|
||||||
|
var customResourceClient = kubernetesClient.resources(Composition.class);
|
||||||
|
Resource<Composition> resource = customResourceClient.resource(compositeResourceDefinition);
|
||||||
|
|
||||||
|
Composition serverSide = resource.get();
|
||||||
|
if (serverSide == null) {
|
||||||
|
resource.create();
|
||||||
|
} else {
|
||||||
|
resource.update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static <T extends CustomResource<?, Void>> Composition createCompositionDefinition(
|
||||||
|
String functionName, List<String> additionalFunctions,
|
||||||
|
T functionDefinition) {
|
||||||
|
|
||||||
|
Composition composition = new Composition();
|
||||||
|
|
||||||
|
composition.setMetadata(CrossplaneMetadataBuilder.createMetadata(functionDefinition.getKind().toLowerCase() + "-composition"));
|
||||||
|
CompositionSpec compositionSpec = new CompositionSpec();
|
||||||
|
|
||||||
|
CompositeTypeRef compositeTypeRef = new CompositeTypeRef();
|
||||||
|
compositeTypeRef.setKind(functionDefinition.getKind());
|
||||||
|
compositeTypeRef.setApiVersion(functionDefinition.getApiVersion());
|
||||||
|
|
||||||
|
compositionSpec.setCompositeTypeRef(compositeTypeRef);
|
||||||
|
compositionSpec.setMode(CompositionSpec.Mode.PIPELINE);
|
||||||
|
|
||||||
|
List<Pipeline> pipelineList = new ArrayList<>();
|
||||||
|
|
||||||
|
pipelineList.add(createPipeline(functionName));
|
||||||
|
|
||||||
|
additionalFunctions.forEach(s -> pipelineList.add(createPipeline(s)));
|
||||||
|
|
||||||
|
compositionSpec.setPipeline(pipelineList);
|
||||||
|
composition.setSpec(compositionSpec);
|
||||||
|
return composition;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Pipeline createPipeline(String pipelineName) {
|
||||||
|
Pipeline pipeline = new Pipeline();
|
||||||
|
pipeline.setStep(pipelineName);
|
||||||
|
FunctionRef functionRef = new FunctionRef();
|
||||||
|
functionRef.setName(pipelineName);
|
||||||
|
pipeline.setFunctionRef(functionRef);
|
||||||
|
return pipeline;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
package io.crossplane.compositefunctions.starter.registration;
|
||||||
|
|
||||||
|
import io.fabric8.kubernetes.api.model.ObjectMeta;
|
||||||
|
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
|
||||||
|
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class CrossplaneMetadataBuilder {
|
||||||
|
|
||||||
|
private CrossplaneMetadataBuilder() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ObjectMeta createMetadata(String name, String namespace) {
|
||||||
|
return createMetadata(name, namespace, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ObjectMeta createMetadata(String name, String namespace, Map<String, String> annotations) {
|
||||||
|
return new ObjectMetaBuilder().withName(name).withNamespace(namespace).withAnnotations(annotations).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static ObjectMeta createMetadata(String name) {
|
||||||
|
return createMetadata(name, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ObjectMeta addAnnotations(Map<String, String> annotations, ObjectMeta objectMeta) {
|
||||||
|
|
||||||
|
Map<String, String> existingAnnotations = objectMeta.getAnnotations();
|
||||||
|
if (existingAnnotations == null) {
|
||||||
|
existingAnnotations = new LinkedHashMap<>();
|
||||||
|
}
|
||||||
|
existingAnnotations.putAll(annotations);
|
||||||
|
objectMeta.setAnnotations(existingAnnotations);
|
||||||
|
return objectMeta;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
io.crossplane.compositefunctions.starter.config.CrossplaneServiceConfiguration
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
release="release-1.16"
|
release="release-1.14"
|
||||||
file="run_function.proto"
|
file="run_function.proto"
|
||||||
gh api -H "Accept: application/vnd.github.raw+json" "/repos/crossplane/crossplane/contents/apis/apiextensions/fn/proto/v1beta1/${file}?ref=${release}" > $file
|
gh api -H "Accept: application/vnd.github.raw+json" "/repos/crossplane/crossplane/contents/apis/apiextensions/fn/proto/v1beta1/${file}?ref=${release}" > $file
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -62,37 +62,6 @@ message RunFunctionRequest {
|
||||||
// and that context will be passed to subsequent Functions. Crossplane
|
// and that context will be passed to subsequent Functions. Crossplane
|
||||||
// discards all context returned by the last Function in the pipeline.
|
// discards all context returned by the last Function in the pipeline.
|
||||||
optional google.protobuf.Struct context = 5;
|
optional google.protobuf.Struct context = 5;
|
||||||
|
|
||||||
// Optional extra resources that the Function required.
|
|
||||||
// Note that extra resources is a map to Resources, plural.
|
|
||||||
// The map key corresponds to the key in a RunFunctionResponse's
|
|
||||||
// extra_resources field. If a Function requested extra resources that
|
|
||||||
// did not exist, Crossplane sets the map key to an empty Resources message to
|
|
||||||
// indicate that it attempted to satisfy the request.
|
|
||||||
map<string, Resources> extra_resources = 6;
|
|
||||||
|
|
||||||
// Optional credentials that this Function may use to communicate with an
|
|
||||||
// external system.
|
|
||||||
map <string, Credentials> credentials = 7;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Credentials that a Function may use to communicate with an external system.
|
|
||||||
message Credentials {
|
|
||||||
// Source of the credentials.
|
|
||||||
oneof source {
|
|
||||||
// Credential data loaded by Crossplane, for example from a Secret.
|
|
||||||
CredentialData credential_data = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// CredentialData loaded by Crossplane, for example from a Secret.
|
|
||||||
message CredentialData {
|
|
||||||
map<string, bytes> data = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Resources represents the state of several Crossplane resources.
|
|
||||||
message Resources {
|
|
||||||
repeated Resource items = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// A RunFunctionResponse contains the result of a Composition Function run.
|
// A RunFunctionResponse contains the result of a Composition Function run.
|
||||||
|
|
@ -120,9 +89,6 @@ message RunFunctionResponse {
|
||||||
// Optional context to be passed to the next Function in the pipeline as part
|
// Optional context to be passed to the next Function in the pipeline as part
|
||||||
// of the RunFunctionRequest. Dropped on the last function in the pipeline.
|
// of the RunFunctionRequest. Dropped on the last function in the pipeline.
|
||||||
optional google.protobuf.Struct context = 4;
|
optional google.protobuf.Struct context = 4;
|
||||||
|
|
||||||
// Requirements that must be satisfied for this Function to run successfully.
|
|
||||||
Requirements requirements = 5;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// RequestMeta contains metadata pertaining to a RunFunctionRequest.
|
// RequestMeta contains metadata pertaining to a RunFunctionRequest.
|
||||||
|
|
@ -132,36 +98,6 @@ message RequestMeta {
|
||||||
string tag = 1;
|
string tag = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Requirements that must be satisfied for a Function to run successfully.
|
|
||||||
message Requirements {
|
|
||||||
// Extra resources that this Function requires.
|
|
||||||
// The map key uniquely identifies the group of resources.
|
|
||||||
map<string, ResourceSelector> extra_resources = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ResourceSelector selects a group of resources, either by name or by label.
|
|
||||||
message ResourceSelector {
|
|
||||||
// API version of resources to select.
|
|
||||||
string api_version = 1;
|
|
||||||
|
|
||||||
// Kind of resources to select.
|
|
||||||
string kind = 2;
|
|
||||||
|
|
||||||
// Resources to match.
|
|
||||||
oneof match {
|
|
||||||
// Match the resource with this name.
|
|
||||||
string match_name = 3;
|
|
||||||
|
|
||||||
// Match all resources with these labels.
|
|
||||||
MatchLabels match_labels = 4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// MatchLabels defines a set of labels to match resources against.
|
|
||||||
message MatchLabels {
|
|
||||||
map<string, string> labels = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ResponseMeta contains metadata pertaining to a RunFunctionResponse.
|
// ResponseMeta contains metadata pertaining to a RunFunctionResponse.
|
||||||
message ResponseMeta {
|
message ResponseMeta {
|
||||||
// An opaque string identifying the content of the request. Must match the
|
// An opaque string identifying the content of the request. Must match the
|
||||||
|
|
|
||||||
44
pom.xml
44
pom.xml
|
|
@ -3,6 +3,11 @@
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-parent</artifactId>
|
||||||
|
<version>3.3.1</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
<groupId>io.crossplane.compositefunctions</groupId>
|
<groupId>io.crossplane.compositefunctions</groupId>
|
||||||
<artifactId>crossplane-parent</artifactId>
|
<artifactId>crossplane-parent</artifactId>
|
||||||
|
|
@ -20,13 +25,16 @@
|
||||||
<maven.compiler.source>17</maven.compiler.source>
|
<maven.compiler.source>17</maven.compiler.source>
|
||||||
|
|
||||||
<!-- Dependency versions -->
|
<!-- Dependency versions -->
|
||||||
|
<spring-boot.version>3.3.1</spring-boot.version>
|
||||||
<kubernetes-client.version>6.13.0</kubernetes-client.version>
|
<kubernetes-client.version>6.13.0</kubernetes-client.version>
|
||||||
<os-maven-plugin.version>1.7.1</os-maven-plugin.version>
|
<os-maven-plugin.version>1.7.1</os-maven-plugin.version>
|
||||||
<protobuf.version>4.27.0</protobuf.version>
|
<protobuf.version>3.25.1</protobuf.version>
|
||||||
<grpc.version>1.64.0</grpc.version>
|
<grpc.version>1.64.0</grpc.version>
|
||||||
<jakarta-annotation.version>1.3.5</jakarta-annotation.version>
|
<jakarta-annotation.version>1.3.5</jakarta-annotation.version>
|
||||||
<slf4j.version>2.0.13</slf4j.version>
|
<slf4j.version>2.0.13</slf4j.version>
|
||||||
<jackson-databind.version>2.17.1</jackson-databind.version>
|
<jackson-databind.version>2.17.1</jackson-databind.version>
|
||||||
|
<bouncycastle.version>1.77</bouncycastle.version>
|
||||||
|
<grpc-spring-boot-starter.version>3.1.0.RELEASE</grpc-spring-boot-starter.version>
|
||||||
|
|
||||||
<!-- Plugin versions -->
|
<!-- Plugin versions -->
|
||||||
<flatten-maven-plugin.version>1.6.0</flatten-maven-plugin.version>
|
<flatten-maven-plugin.version>1.6.0</flatten-maven-plugin.version>
|
||||||
|
|
@ -41,6 +49,8 @@
|
||||||
<module>crossplane-crd-model</module>
|
<module>crossplane-crd-model</module>
|
||||||
<module>crossplane-protobuf-model</module>
|
<module>crossplane-protobuf-model</module>
|
||||||
<module>crossplane-function-base</module>
|
<module>crossplane-function-base</module>
|
||||||
|
<module>crossplane-function-springboot-starter</module>
|
||||||
|
<module>crossplane-function-example</module>
|
||||||
</modules>
|
</modules>
|
||||||
|
|
||||||
<dependencyManagement>
|
<dependencyManagement>
|
||||||
|
|
@ -55,7 +65,17 @@
|
||||||
<artifactId>crossplane-protobuf-model</artifactId>
|
<artifactId>crossplane-protobuf-model</artifactId>
|
||||||
<version>${revision}</version>
|
<version>${revision}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.crossplane.compositefunctions</groupId>
|
||||||
|
<artifactId>crossplane-function-base</artifactId>
|
||||||
|
<version>${revision}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.crossplane.compositefunctions</groupId>
|
||||||
|
<artifactId>crossplane-function-springboot-starter</artifactId>
|
||||||
|
<version>${revision}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.fabric8</groupId>
|
<groupId>io.fabric8</groupId>
|
||||||
|
|
@ -64,6 +84,8 @@
|
||||||
<scope>import</scope>
|
<scope>import</scope>
|
||||||
<type>pom</type>
|
<type>pom</type>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.google.protobuf</groupId>
|
<groupId>com.google.protobuf</groupId>
|
||||||
<artifactId>protobuf-java</artifactId>
|
<artifactId>protobuf-java</artifactId>
|
||||||
|
|
@ -101,6 +123,16 @@
|
||||||
<artifactId>grpc-util</artifactId>
|
<artifactId>grpc-util</artifactId>
|
||||||
<version>${grpc.version}</version>
|
<version>${grpc.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.grpc</groupId>
|
||||||
|
<artifactId>grpc-services</artifactId>
|
||||||
|
<version>${grpc.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.grpc</groupId>
|
||||||
|
<artifactId>grpc-inprocess</artifactId>
|
||||||
|
<version>${grpc.version}</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.grpc</groupId>
|
<groupId>io.grpc</groupId>
|
||||||
<artifactId>grpc-netty-shaded</artifactId>
|
<artifactId>grpc-netty-shaded</artifactId>
|
||||||
|
|
@ -121,6 +153,16 @@
|
||||||
<artifactId>jackson-databind</artifactId>
|
<artifactId>jackson-databind</artifactId>
|
||||||
<version>${jackson-databind.version}</version>
|
<version>${jackson-databind.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.bouncycastle</groupId>
|
||||||
|
<artifactId>bcpkix-jdk18on</artifactId>
|
||||||
|
<version>${bouncycastle.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.devh</groupId>
|
||||||
|
<artifactId>grpc-server-spring-boot-starter</artifactId>
|
||||||
|
<version>${grpc-spring-boot-starter.version}</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</dependencyManagement>
|
</dependencyManagement>
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue