Inital project structure (#1)
Base structure for the Java SDK. --------- Signed-off-by: Knut-Erik Johnsen <abstract@knut-erik.org>
This commit is contained in:
parent
bb31f20e43
commit
6921301495
|
|
@ -0,0 +1,21 @@
|
||||||
|
name: Build with maven
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ "*" ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ "main" ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Set up JDK 17
|
||||||
|
uses: actions/setup-java@v4
|
||||||
|
with:
|
||||||
|
java-version: '17'
|
||||||
|
distribution: 'oracle'
|
||||||
|
cache: maven
|
||||||
|
- name: Build with Maven
|
||||||
|
run: mvn -B clean verify --file pom.xml
|
||||||
|
|
@ -0,0 +1,44 @@
|
||||||
|
name: Release a new version
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
releaseversion:
|
||||||
|
type: string
|
||||||
|
description: 'Version to reelase'
|
||||||
|
required: true
|
||||||
|
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Set up JDK 17
|
||||||
|
uses: actions/setup-java@v4
|
||||||
|
with:
|
||||||
|
java-version: '17'
|
||||||
|
distribution: 'oracle'
|
||||||
|
cache: maven
|
||||||
|
server-id: central
|
||||||
|
server-username: MAVEN_CENTRAL_USERNAME # env variable for username in deploy
|
||||||
|
server-password: MAVEN_CENTRAL_TOKEN # env variable for token in deploy
|
||||||
|
gpg-private-key: ${{ secrets.MAVEN_GPG_PRIVATE_KEY }} # Value of the GPG private key to import
|
||||||
|
gpg-passphrase: MAVEN_GPG_PASSPHRASE # env variable for GPG private key passphrase
|
||||||
|
- name: Set the revision property
|
||||||
|
run: mvn versions:set-property -Dproperty=revision "-DnewVersion==${{ github.event.inputs.releaseversion }}" -DgenerateBackupPoms=false
|
||||||
|
- name: Build with Maven
|
||||||
|
run: mvn -B deploy --file pom.xml -Pdeploy
|
||||||
|
env:
|
||||||
|
MAVEN_CENTRAL_USERNAME: ${{ secrets.MAVEN_CENTRAL_USERNAME }}
|
||||||
|
MAVEN_CENTRAL_TOKEN: ${{ secrets.MAVEN_CENTRAL_TOKEN }}
|
||||||
|
MAVEN_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }}
|
||||||
|
- name: Create release
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
tag: ${{ github.ref_name }}
|
||||||
|
run: |
|
||||||
|
gh release create "$tag" \
|
||||||
|
--repo="$GITHUB_REPOSITORY" \
|
||||||
|
--title="${GITHUB_REPOSITORY#*/} ${tag#v}" \
|
||||||
|
--generate-notes
|
||||||
|
|
@ -22,3 +22,9 @@
|
||||||
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||||
hs_err_pid*
|
hs_err_pid*
|
||||||
replay_pid*
|
replay_pid*
|
||||||
|
|
||||||
|
**/.flattened-pom.xml
|
||||||
|
*.iml
|
||||||
|
.idea/
|
||||||
|
target/
|
||||||
|
generated/
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,48 @@
|
||||||
|
<?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>
|
||||||
|
<!-- PROJECT -->
|
||||||
|
<parent>
|
||||||
|
<groupId>io.crossplane.compositefunctions</groupId>
|
||||||
|
<artifactId>crossplane-parent</artifactId>
|
||||||
|
<version>${revision}</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<artifactId>crossplane-crd-model</artifactId>
|
||||||
|
<description>Crossplane coposite function CRDS</description>
|
||||||
|
<!-- DEPENDENCIES -->
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.fabric8</groupId>
|
||||||
|
<artifactId>kubernetes-client</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.fabric8</groupId>
|
||||||
|
<artifactId>generator-annotations</artifactId>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
<!-- BUILD -->
|
||||||
|
<build>
|
||||||
|
<!-- PLUGINS -->
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>io.fabric8</groupId>
|
||||||
|
<artifactId>java-generator-maven-plugin</artifactId>
|
||||||
|
<version>${kubernetes-client.version}</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<goals>
|
||||||
|
<goal>generate</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
<configuration>
|
||||||
|
<source>src/main/resources/kubernetes</source>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
</project>
|
||||||
|
|
@ -0,0 +1,553 @@
|
||||||
|
apiVersion: apiextensions.k8s.io/v1
|
||||||
|
kind: CustomResourceDefinition
|
||||||
|
metadata:
|
||||||
|
annotations:
|
||||||
|
controller-gen.kubebuilder.io/version: v0.14.0
|
||||||
|
name: compositeresourcedefinitions.apiextensions.crossplane.io
|
||||||
|
spec:
|
||||||
|
group: apiextensions.crossplane.io
|
||||||
|
names:
|
||||||
|
categories:
|
||||||
|
- crossplane
|
||||||
|
kind: CompositeResourceDefinition
|
||||||
|
listKind: CompositeResourceDefinitionList
|
||||||
|
plural: compositeresourcedefinitions
|
||||||
|
shortNames:
|
||||||
|
- xrd
|
||||||
|
- xrds
|
||||||
|
singular: compositeresourcedefinition
|
||||||
|
scope: Cluster
|
||||||
|
versions:
|
||||||
|
- additionalPrinterColumns:
|
||||||
|
- jsonPath: .status.conditions[?(@.type=='Established')].status
|
||||||
|
name: ESTABLISHED
|
||||||
|
type: string
|
||||||
|
- jsonPath: .status.conditions[?(@.type=='Offered')].status
|
||||||
|
name: OFFERED
|
||||||
|
type: string
|
||||||
|
- jsonPath: .metadata.creationTimestamp
|
||||||
|
name: AGE
|
||||||
|
type: date
|
||||||
|
name: v1
|
||||||
|
schema:
|
||||||
|
openAPIV3Schema:
|
||||||
|
description: |-
|
||||||
|
A CompositeResourceDefinition defines a new kind of composite infrastructure
|
||||||
|
resource. The new resource is composed of other composite or managed
|
||||||
|
infrastructure resources.
|
||||||
|
properties:
|
||||||
|
apiVersion:
|
||||||
|
description: |-
|
||||||
|
APIVersion defines the versioned schema of this representation of an object.
|
||||||
|
Servers should convert recognized schemas to the latest internal value, and
|
||||||
|
may reject unrecognized values.
|
||||||
|
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
|
||||||
|
type: string
|
||||||
|
kind:
|
||||||
|
description: |-
|
||||||
|
Kind is a string value representing the REST resource this object represents.
|
||||||
|
Servers may infer this from the endpoint the client submits requests to.
|
||||||
|
Cannot be updated.
|
||||||
|
In CamelCase.
|
||||||
|
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
|
||||||
|
type: string
|
||||||
|
metadata:
|
||||||
|
type: object
|
||||||
|
spec:
|
||||||
|
description: CompositeResourceDefinitionSpec specifies the desired state
|
||||||
|
of the definition.
|
||||||
|
properties:
|
||||||
|
claimNames:
|
||||||
|
description: |-
|
||||||
|
ClaimNames specifies the names of an optional composite resource claim.
|
||||||
|
When claim names are specified Crossplane will create a namespaced
|
||||||
|
'composite resource claim' CRD that corresponds to the defined composite
|
||||||
|
resource. This composite resource claim acts as a namespaced proxy for
|
||||||
|
the composite resource; creating, updating, or deleting the claim will
|
||||||
|
create, update, or delete a corresponding composite resource. You may add
|
||||||
|
claim names to an existing CompositeResourceDefinition, but they cannot
|
||||||
|
be changed or removed once they have been set.
|
||||||
|
properties:
|
||||||
|
categories:
|
||||||
|
description: |-
|
||||||
|
categories is a list of grouped resources this custom resource belongs to (e.g. 'all').
|
||||||
|
This is published in API discovery documents, and used by clients to support invocations like
|
||||||
|
`kubectl get all`.
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
type: array
|
||||||
|
kind:
|
||||||
|
description: |-
|
||||||
|
kind is the serialized kind of the resource. It is normally CamelCase and singular.
|
||||||
|
Custom resource instances will use this value as the `kind` attribute in API calls.
|
||||||
|
type: string
|
||||||
|
listKind:
|
||||||
|
description: listKind is the serialized kind of the list for this
|
||||||
|
resource. Defaults to "`kind`List".
|
||||||
|
type: string
|
||||||
|
plural:
|
||||||
|
description: |-
|
||||||
|
plural is the plural name of the resource to serve.
|
||||||
|
The custom resources are served under `/apis/<group>/<version>/.../<plural>`.
|
||||||
|
Must match the name of the CustomResourceDefinition (in the form `<names.plural>.<group>`).
|
||||||
|
Must be all lowercase.
|
||||||
|
type: string
|
||||||
|
shortNames:
|
||||||
|
description: |-
|
||||||
|
shortNames are short names for the resource, exposed in API discovery documents,
|
||||||
|
and used by clients to support invocations like `kubectl get <shortname>`.
|
||||||
|
It must be all lowercase.
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
type: array
|
||||||
|
singular:
|
||||||
|
description: singular is the singular name of the resource. It
|
||||||
|
must be all lowercase. Defaults to lowercased `kind`.
|
||||||
|
type: string
|
||||||
|
required:
|
||||||
|
- kind
|
||||||
|
- plural
|
||||||
|
type: object
|
||||||
|
connectionSecretKeys:
|
||||||
|
description: |-
|
||||||
|
ConnectionSecretKeys is the list of keys that will be exposed to the end
|
||||||
|
user of the defined kind.
|
||||||
|
If the list is empty, all keys will be published.
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
type: array
|
||||||
|
conversion:
|
||||||
|
description: Conversion defines all conversion settings for the defined
|
||||||
|
Composite resource.
|
||||||
|
properties:
|
||||||
|
strategy:
|
||||||
|
description: |-
|
||||||
|
strategy specifies how custom resources are converted between versions. Allowed values are:
|
||||||
|
- `"None"`: The converter only change the apiVersion and would not touch any other field in the custom resource.
|
||||||
|
- `"Webhook"`: API Server will call 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
|
||||||
|
webhook:
|
||||||
|
description: webhook describes how to call the conversion webhook.
|
||||||
|
Required when `strategy` is set to `"Webhook"`.
|
||||||
|
properties:
|
||||||
|
clientConfig:
|
||||||
|
description: clientConfig is the instructions for how to call
|
||||||
|
the webhook if strategy is `Webhook`.
|
||||||
|
properties:
|
||||||
|
caBundle:
|
||||||
|
description: |-
|
||||||
|
caBundle is a PEM encoded CA bundle which will be used to validate the webhook's server certificate.
|
||||||
|
If unspecified, system trust roots on the apiserver are used.
|
||||||
|
format: byte
|
||||||
|
type: string
|
||||||
|
service:
|
||||||
|
description: |-
|
||||||
|
service is a reference to the service for this webhook. Either
|
||||||
|
service or url must be specified.
|
||||||
|
|
||||||
|
|
||||||
|
If the webhook is running within the cluster, then you should use `service`.
|
||||||
|
properties:
|
||||||
|
name:
|
||||||
|
description: |-
|
||||||
|
name is the name of the service.
|
||||||
|
Required
|
||||||
|
type: string
|
||||||
|
namespace:
|
||||||
|
description: |-
|
||||||
|
namespace is the namespace of the service.
|
||||||
|
Required
|
||||||
|
type: string
|
||||||
|
path:
|
||||||
|
description: path is an optional URL path at which
|
||||||
|
the webhook will be contacted.
|
||||||
|
type: string
|
||||||
|
port:
|
||||||
|
description: |-
|
||||||
|
port is an optional service port at which the webhook will be contacted.
|
||||||
|
`port` should be a valid port number (1-65535, inclusive).
|
||||||
|
Defaults to 443 for backward compatibility.
|
||||||
|
format: int32
|
||||||
|
type: integer
|
||||||
|
required:
|
||||||
|
- name
|
||||||
|
- namespace
|
||||||
|
type: object
|
||||||
|
url:
|
||||||
|
description: |-
|
||||||
|
url gives the location of the webhook, in standard URL form
|
||||||
|
(`scheme://host:port/path`). Exactly one of `url` or `service`
|
||||||
|
must be specified.
|
||||||
|
|
||||||
|
|
||||||
|
The `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., `kube-apiserver` cannot resolve
|
||||||
|
in-cluster DNS as that would be a layering violation). `host` may
|
||||||
|
also be an IP address.
|
||||||
|
|
||||||
|
|
||||||
|
Please note that using `localhost` or `127.0.0.1` as a `host` is
|
||||||
|
risky unless you take great 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
|
||||||
|
to turn up in a new cluster.
|
||||||
|
|
||||||
|
|
||||||
|
The scheme must be "https"; the URL must begin with "https://".
|
||||||
|
|
||||||
|
|
||||||
|
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: object
|
||||||
|
conversionReviewVersions:
|
||||||
|
description: |-
|
||||||
|
conversionReviewVersions is an ordered list of preferred `ConversionReview`
|
||||||
|
versions the Webhook expects. The API server will use the first version in
|
||||||
|
the list which it supports. If none of the versions specified in this list
|
||||||
|
are supported by API server, conversion will fail for the custom resource.
|
||||||
|
If a persisted Webhook configuration specifies allowed versions and does not
|
||||||
|
include any versions known to the API Server, calls to the webhook will fail.
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
type: array
|
||||||
|
required:
|
||||||
|
- conversionReviewVersions
|
||||||
|
type: object
|
||||||
|
required:
|
||||||
|
- strategy
|
||||||
|
type: object
|
||||||
|
defaultCompositeDeletePolicy:
|
||||||
|
default: Background
|
||||||
|
description: |-
|
||||||
|
DefaultCompositeDeletePolicy is the policy used when deleting the Composite
|
||||||
|
that is associated with the Claim if no policy has been specified.
|
||||||
|
enum:
|
||||||
|
- Background
|
||||||
|
- Foreground
|
||||||
|
type: string
|
||||||
|
defaultCompositionRef:
|
||||||
|
description: |-
|
||||||
|
DefaultCompositionRef refers to the Composition resource that will be used
|
||||||
|
in case no composition selector is given.
|
||||||
|
properties:
|
||||||
|
name:
|
||||||
|
description: Name of the Composition.
|
||||||
|
type: string
|
||||||
|
required:
|
||||||
|
- name
|
||||||
|
type: object
|
||||||
|
defaultCompositionUpdatePolicy:
|
||||||
|
default: Automatic
|
||||||
|
description: |-
|
||||||
|
DefaultCompositionUpdatePolicy is the policy used when updating composites after a new
|
||||||
|
Composition Revision has been created if no policy has been specified on the composite.
|
||||||
|
enum:
|
||||||
|
- Automatic
|
||||||
|
- Manual
|
||||||
|
type: string
|
||||||
|
enforcedCompositionRef:
|
||||||
|
description: |-
|
||||||
|
EnforcedCompositionRef refers to the Composition resource that will be used
|
||||||
|
by all composite instances whose schema is defined by this definition.
|
||||||
|
properties:
|
||||||
|
name:
|
||||||
|
description: Name of the Composition.
|
||||||
|
type: string
|
||||||
|
required:
|
||||||
|
- name
|
||||||
|
type: object
|
||||||
|
group:
|
||||||
|
description: |-
|
||||||
|
Group specifies the API group of the defined composite resource.
|
||||||
|
Composite resources are served under `/apis/<group>/...`. Must match the
|
||||||
|
name of the XRD (in the form `<names.plural>.<group>`).
|
||||||
|
type: string
|
||||||
|
metadata:
|
||||||
|
description: Metadata specifies the desired metadata for the defined
|
||||||
|
composite resource and claim CRD's.
|
||||||
|
properties:
|
||||||
|
annotations:
|
||||||
|
additionalProperties:
|
||||||
|
type: string
|
||||||
|
description: |-
|
||||||
|
Annotations is an unstructured key value map stored with a resource that may be
|
||||||
|
set by external tools to store and retrieve arbitrary metadata. They are not
|
||||||
|
queryable and should be preserved when modifying objects.
|
||||||
|
More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations
|
||||||
|
type: object
|
||||||
|
labels:
|
||||||
|
additionalProperties:
|
||||||
|
type: string
|
||||||
|
description: |-
|
||||||
|
Map of string keys and values that can be used to organize and categorize
|
||||||
|
(scope and select) objects. May match selectors of replication controllers
|
||||||
|
More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels
|
||||||
|
and services.
|
||||||
|
These labels are added to the composite resource and claim CRD's in addition
|
||||||
|
to any labels defined by `CompositionResourceDefinition` `metadata.labels`.
|
||||||
|
type: object
|
||||||
|
type: object
|
||||||
|
names:
|
||||||
|
description: |-
|
||||||
|
Names specifies the resource and kind names of the defined composite
|
||||||
|
resource.
|
||||||
|
properties:
|
||||||
|
categories:
|
||||||
|
description: |-
|
||||||
|
categories is a list of grouped resources this custom resource belongs to (e.g. 'all').
|
||||||
|
This is published in API discovery documents, and used by clients to support invocations like
|
||||||
|
`kubectl get all`.
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
type: array
|
||||||
|
kind:
|
||||||
|
description: |-
|
||||||
|
kind is the serialized kind of the resource. It is normally CamelCase and singular.
|
||||||
|
Custom resource instances will use this value as the `kind` attribute in API calls.
|
||||||
|
type: string
|
||||||
|
listKind:
|
||||||
|
description: listKind is the serialized kind of the list for this
|
||||||
|
resource. Defaults to "`kind`List".
|
||||||
|
type: string
|
||||||
|
plural:
|
||||||
|
description: |-
|
||||||
|
plural is the plural name of the resource to serve.
|
||||||
|
The custom resources are served under `/apis/<group>/<version>/.../<plural>`.
|
||||||
|
Must match the name of the CustomResourceDefinition (in the form `<names.plural>.<group>`).
|
||||||
|
Must be all lowercase.
|
||||||
|
type: string
|
||||||
|
shortNames:
|
||||||
|
description: |-
|
||||||
|
shortNames are short names for the resource, exposed in API discovery documents,
|
||||||
|
and used by clients to support invocations like `kubectl get <shortname>`.
|
||||||
|
It must be all lowercase.
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
type: array
|
||||||
|
singular:
|
||||||
|
description: singular is the singular name of the resource. It
|
||||||
|
must be all lowercase. Defaults to lowercased `kind`.
|
||||||
|
type: string
|
||||||
|
required:
|
||||||
|
- kind
|
||||||
|
- plural
|
||||||
|
type: object
|
||||||
|
versions:
|
||||||
|
description: |-
|
||||||
|
Versions is the list of all API versions of the defined composite
|
||||||
|
resource. Version names are used to compute the order in which served
|
||||||
|
versions are listed in API discovery. If the version string is
|
||||||
|
"kube-like", it will sort above non "kube-like" version strings, which
|
||||||
|
are ordered lexicographically. "Kube-like" versions start with a "v",
|
||||||
|
then are followed by a number (the major version), then optionally the
|
||||||
|
string "alpha" or "beta" and another number (the minor version). These
|
||||||
|
are sorted first by GA > beta > alpha (where GA is a version with no
|
||||||
|
suffix such as beta or alpha), and then by comparing major version, then
|
||||||
|
minor version. An example sorted list of versions: v10, v2, v1, v11beta2,
|
||||||
|
v10beta3, v3beta1, v12alpha1, v11alpha2, foo1, foo10.
|
||||||
|
items:
|
||||||
|
description: CompositeResourceDefinitionVersion describes a version
|
||||||
|
of an XR.
|
||||||
|
properties:
|
||||||
|
additionalPrinterColumns:
|
||||||
|
description: |-
|
||||||
|
AdditionalPrinterColumns specifies additional columns returned in Table
|
||||||
|
output. If no columns are specified, a single column displaying the age
|
||||||
|
of the custom resource is used. See the following link for details:
|
||||||
|
https://kubernetes.io/docs/reference/using-api/api-concepts/#receiving-resources-as-tables
|
||||||
|
items:
|
||||||
|
description: CustomResourceColumnDefinition specifies a column
|
||||||
|
for server side printing.
|
||||||
|
properties:
|
||||||
|
description:
|
||||||
|
description: description is a human readable description
|
||||||
|
of this column.
|
||||||
|
type: string
|
||||||
|
format:
|
||||||
|
description: |-
|
||||||
|
format is an optional OpenAPI type definition for this column. The 'name' format is applied
|
||||||
|
to the primary identifier column to assist in clients identifying column is the resource name.
|
||||||
|
See https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types for details.
|
||||||
|
type: string
|
||||||
|
jsonPath:
|
||||||
|
description: |-
|
||||||
|
jsonPath is a simple JSON path (i.e. with array notation) which is evaluated against
|
||||||
|
each custom resource to produce the value for this column.
|
||||||
|
type: string
|
||||||
|
name:
|
||||||
|
description: name is a human readable name for the column.
|
||||||
|
type: string
|
||||||
|
priority:
|
||||||
|
description: |-
|
||||||
|
priority is an integer defining the relative importance of this column compared to others. Lower
|
||||||
|
numbers are considered higher priority. Columns that may be omitted in limited space scenarios
|
||||||
|
should be given a priority greater than 0.
|
||||||
|
format: int32
|
||||||
|
type: integer
|
||||||
|
type:
|
||||||
|
description: |-
|
||||||
|
type is an OpenAPI type definition for this column.
|
||||||
|
See https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types for details.
|
||||||
|
type: string
|
||||||
|
required:
|
||||||
|
- jsonPath
|
||||||
|
- name
|
||||||
|
- type
|
||||||
|
type: object
|
||||||
|
type: array
|
||||||
|
deprecated:
|
||||||
|
description: |-
|
||||||
|
The deprecated field specifies that this version is deprecated and should
|
||||||
|
not be used.
|
||||||
|
type: boolean
|
||||||
|
deprecationWarning:
|
||||||
|
description: |-
|
||||||
|
DeprecationWarning specifies the message that should be shown to the user
|
||||||
|
when using this version.
|
||||||
|
maxLength: 256
|
||||||
|
type: string
|
||||||
|
name:
|
||||||
|
description: |-
|
||||||
|
Name of this version, e.g. “v1”, “v2beta1”, etc. Composite resources are
|
||||||
|
served under this version at `/apis/<group>/<version>/...` if `served` is
|
||||||
|
true.
|
||||||
|
type: string
|
||||||
|
referenceable:
|
||||||
|
description: |-
|
||||||
|
Referenceable specifies that this version may be referenced by a
|
||||||
|
Composition in order to configure which resources an XR may be composed
|
||||||
|
of. Exactly one version must be marked as referenceable; all Compositions
|
||||||
|
must target only the referenceable version. The referenceable version
|
||||||
|
must be served. It's mapped to the CRD's `spec.versions[*].storage` field.
|
||||||
|
type: boolean
|
||||||
|
schema:
|
||||||
|
description: |-
|
||||||
|
Schema describes the schema used for validation, pruning, and defaulting
|
||||||
|
of this version of the defined composite resource. Fields required by all
|
||||||
|
composite resources will be injected into this schema automatically, and
|
||||||
|
will override equivalently named fields in this schema. Omitting this
|
||||||
|
schema results in a schema that contains only the fields required by all
|
||||||
|
composite resources.
|
||||||
|
properties:
|
||||||
|
openAPIV3Schema:
|
||||||
|
description: |-
|
||||||
|
OpenAPIV3Schema is the OpenAPI v3 schema to use for validation and
|
||||||
|
pruning.
|
||||||
|
type: object
|
||||||
|
x-kubernetes-preserve-unknown-fields: true
|
||||||
|
type: object
|
||||||
|
served:
|
||||||
|
description: Served specifies that this version should be served
|
||||||
|
via REST APIs.
|
||||||
|
type: boolean
|
||||||
|
required:
|
||||||
|
- name
|
||||||
|
- referenceable
|
||||||
|
- served
|
||||||
|
type: object
|
||||||
|
type: array
|
||||||
|
required:
|
||||||
|
- group
|
||||||
|
- names
|
||||||
|
- versions
|
||||||
|
type: object
|
||||||
|
status:
|
||||||
|
description: CompositeResourceDefinitionStatus shows the observed state
|
||||||
|
of the definition.
|
||||||
|
properties:
|
||||||
|
conditions:
|
||||||
|
description: Conditions of the resource.
|
||||||
|
items:
|
||||||
|
description: A Condition that may apply to a resource.
|
||||||
|
properties:
|
||||||
|
lastTransitionTime:
|
||||||
|
description: |-
|
||||||
|
LastTransitionTime is the last time this condition transitioned from one
|
||||||
|
status to another.
|
||||||
|
format: date-time
|
||||||
|
type: string
|
||||||
|
message:
|
||||||
|
description: |-
|
||||||
|
A Message containing details about this condition's last transition from
|
||||||
|
one status to another, if any.
|
||||||
|
type: string
|
||||||
|
reason:
|
||||||
|
description: A Reason for this condition's last transition from
|
||||||
|
one status to another.
|
||||||
|
type: string
|
||||||
|
status:
|
||||||
|
description: Status of this condition; is it currently True,
|
||||||
|
False, or Unknown?
|
||||||
|
type: string
|
||||||
|
type:
|
||||||
|
description: |-
|
||||||
|
Type of this condition. At most one of each condition type may apply to
|
||||||
|
a resource at any point in time.
|
||||||
|
type: string
|
||||||
|
required:
|
||||||
|
- lastTransitionTime
|
||||||
|
- reason
|
||||||
|
- status
|
||||||
|
- type
|
||||||
|
type: object
|
||||||
|
type: array
|
||||||
|
x-kubernetes-list-map-keys:
|
||||||
|
- type
|
||||||
|
x-kubernetes-list-type: map
|
||||||
|
controllers:
|
||||||
|
description: |-
|
||||||
|
Controllers represents the status of the controllers that power this
|
||||||
|
composite resource definition.
|
||||||
|
properties:
|
||||||
|
compositeResourceClaimType:
|
||||||
|
description: |-
|
||||||
|
The CompositeResourceClaimTypeRef is the type of composite resource claim
|
||||||
|
that Crossplane is currently reconciling for this definition. Its version
|
||||||
|
will eventually become consistent with the definition's referenceable
|
||||||
|
version. Note that clients may interact with any served type; this is
|
||||||
|
simply the type that Crossplane interacts with.
|
||||||
|
properties:
|
||||||
|
apiVersion:
|
||||||
|
description: APIVersion of the type.
|
||||||
|
type: string
|
||||||
|
kind:
|
||||||
|
description: Kind of the type.
|
||||||
|
type: string
|
||||||
|
required:
|
||||||
|
- apiVersion
|
||||||
|
- kind
|
||||||
|
type: object
|
||||||
|
compositeResourceType:
|
||||||
|
description: |-
|
||||||
|
The CompositeResourceTypeRef is the type of composite resource that
|
||||||
|
Crossplane is currently reconciling for this definition. Its version will
|
||||||
|
eventually become consistent with the definition's referenceable version.
|
||||||
|
Note that clients may interact with any served type; this is simply the
|
||||||
|
type that Crossplane interacts with.
|
||||||
|
properties:
|
||||||
|
apiVersion:
|
||||||
|
description: APIVersion of the type.
|
||||||
|
type: string
|
||||||
|
kind:
|
||||||
|
description: Kind of the type.
|
||||||
|
type: string
|
||||||
|
required:
|
||||||
|
- apiVersion
|
||||||
|
- kind
|
||||||
|
type: object
|
||||||
|
type: object
|
||||||
|
type: object
|
||||||
|
type: object
|
||||||
|
served: true
|
||||||
|
storage: true
|
||||||
|
subresources:
|
||||||
|
status: {}
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,57 @@
|
||||||
|
apiVersion: apiextensions.k8s.io/v1
|
||||||
|
kind: CustomResourceDefinition
|
||||||
|
metadata:
|
||||||
|
annotations:
|
||||||
|
controller-gen.kubebuilder.io/version: v0.14.0
|
||||||
|
name: environmentconfigs.apiextensions.crossplane.io
|
||||||
|
spec:
|
||||||
|
group: apiextensions.crossplane.io
|
||||||
|
names:
|
||||||
|
categories:
|
||||||
|
- crossplane
|
||||||
|
kind: EnvironmentConfig
|
||||||
|
listKind: EnvironmentConfigList
|
||||||
|
plural: environmentconfigs
|
||||||
|
shortNames:
|
||||||
|
- envcfg
|
||||||
|
singular: environmentconfig
|
||||||
|
scope: Cluster
|
||||||
|
versions:
|
||||||
|
- additionalPrinterColumns:
|
||||||
|
- jsonPath: .metadata.creationTimestamp
|
||||||
|
name: AGE
|
||||||
|
type: date
|
||||||
|
name: v1alpha1
|
||||||
|
schema:
|
||||||
|
openAPIV3Schema:
|
||||||
|
description: A EnvironmentConfig contains a set of arbitrary, unstructured
|
||||||
|
values.
|
||||||
|
properties:
|
||||||
|
apiVersion:
|
||||||
|
description: |-
|
||||||
|
APIVersion defines the versioned schema of this representation of an object.
|
||||||
|
Servers should convert recognized schemas to the latest internal value, and
|
||||||
|
may reject unrecognized values.
|
||||||
|
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
|
||||||
|
type: string
|
||||||
|
data:
|
||||||
|
additionalProperties:
|
||||||
|
x-kubernetes-preserve-unknown-fields: true
|
||||||
|
description: |-
|
||||||
|
The data of this EnvironmentConfig.
|
||||||
|
This may contain any kind of structure that can be serialized into JSON.
|
||||||
|
type: object
|
||||||
|
kind:
|
||||||
|
description: |-
|
||||||
|
Kind is a string value representing the REST resource this object represents.
|
||||||
|
Servers may infer this from the endpoint the client submits requests to.
|
||||||
|
Cannot be updated.
|
||||||
|
In CamelCase.
|
||||||
|
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
|
||||||
|
type: string
|
||||||
|
metadata:
|
||||||
|
type: object
|
||||||
|
type: object
|
||||||
|
served: true
|
||||||
|
storage: true
|
||||||
|
subresources: {}
|
||||||
|
|
@ -0,0 +1,201 @@
|
||||||
|
apiVersion: apiextensions.k8s.io/v1
|
||||||
|
kind: CustomResourceDefinition
|
||||||
|
metadata:
|
||||||
|
annotations:
|
||||||
|
controller-gen.kubebuilder.io/version: v0.14.0
|
||||||
|
name: usages.apiextensions.crossplane.io
|
||||||
|
spec:
|
||||||
|
group: apiextensions.crossplane.io
|
||||||
|
names:
|
||||||
|
categories:
|
||||||
|
- crossplane
|
||||||
|
kind: Usage
|
||||||
|
listKind: UsageList
|
||||||
|
plural: usages
|
||||||
|
singular: usage
|
||||||
|
scope: Cluster
|
||||||
|
versions:
|
||||||
|
- additionalPrinterColumns:
|
||||||
|
- jsonPath: .metadata.annotations.crossplane\.io/usage-details
|
||||||
|
name: DETAILS
|
||||||
|
type: string
|
||||||
|
- jsonPath: .status.conditions[?(@.type=='Ready')].status
|
||||||
|
name: READY
|
||||||
|
type: string
|
||||||
|
- jsonPath: .metadata.creationTimestamp
|
||||||
|
name: AGE
|
||||||
|
type: date
|
||||||
|
name: v1alpha1
|
||||||
|
schema:
|
||||||
|
openAPIV3Schema:
|
||||||
|
description: A Usage defines a deletion blocking relationship between two
|
||||||
|
resources.
|
||||||
|
properties:
|
||||||
|
apiVersion:
|
||||||
|
description: |-
|
||||||
|
APIVersion defines the versioned schema of this representation of an object.
|
||||||
|
Servers should convert recognized schemas to the latest internal value, and
|
||||||
|
may reject unrecognized values.
|
||||||
|
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
|
||||||
|
type: string
|
||||||
|
kind:
|
||||||
|
description: |-
|
||||||
|
Kind is a string value representing the REST resource this object represents.
|
||||||
|
Servers may infer this from the endpoint the client submits requests to.
|
||||||
|
Cannot be updated.
|
||||||
|
In CamelCase.
|
||||||
|
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
|
||||||
|
type: string
|
||||||
|
metadata:
|
||||||
|
type: object
|
||||||
|
spec:
|
||||||
|
description: UsageSpec defines the desired state of Usage.
|
||||||
|
properties:
|
||||||
|
by:
|
||||||
|
description: By is the resource that is "using the other resource".
|
||||||
|
properties:
|
||||||
|
apiVersion:
|
||||||
|
description: API version of the referent.
|
||||||
|
type: string
|
||||||
|
kind:
|
||||||
|
description: |-
|
||||||
|
Kind of the referent.
|
||||||
|
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
|
||||||
|
type: string
|
||||||
|
resourceRef:
|
||||||
|
description: Reference to the resource.
|
||||||
|
properties:
|
||||||
|
name:
|
||||||
|
description: Name of the referent.
|
||||||
|
type: string
|
||||||
|
required:
|
||||||
|
- name
|
||||||
|
type: object
|
||||||
|
resourceSelector:
|
||||||
|
description: |-
|
||||||
|
Selector to the resource.
|
||||||
|
This field will be ignored if ResourceRef is set.
|
||||||
|
properties:
|
||||||
|
matchControllerRef:
|
||||||
|
description: |-
|
||||||
|
MatchControllerRef ensures an object with the same controller reference
|
||||||
|
as the selecting object is selected.
|
||||||
|
type: boolean
|
||||||
|
matchLabels:
|
||||||
|
additionalProperties:
|
||||||
|
type: string
|
||||||
|
description: MatchLabels ensures an object with matching labels
|
||||||
|
is selected.
|
||||||
|
type: object
|
||||||
|
type: object
|
||||||
|
type: object
|
||||||
|
x-kubernetes-validations:
|
||||||
|
- message: either a resource reference or a resource selector should
|
||||||
|
be set.
|
||||||
|
rule: has(self.resourceRef) || has(self.resourceSelector)
|
||||||
|
of:
|
||||||
|
description: Of is the resource that is "being used".
|
||||||
|
properties:
|
||||||
|
apiVersion:
|
||||||
|
description: API version of the referent.
|
||||||
|
type: string
|
||||||
|
kind:
|
||||||
|
description: |-
|
||||||
|
Kind of the referent.
|
||||||
|
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
|
||||||
|
type: string
|
||||||
|
resourceRef:
|
||||||
|
description: Reference to the resource.
|
||||||
|
properties:
|
||||||
|
name:
|
||||||
|
description: Name of the referent.
|
||||||
|
type: string
|
||||||
|
required:
|
||||||
|
- name
|
||||||
|
type: object
|
||||||
|
resourceSelector:
|
||||||
|
description: |-
|
||||||
|
Selector to the resource.
|
||||||
|
This field will be ignored if ResourceRef is set.
|
||||||
|
properties:
|
||||||
|
matchControllerRef:
|
||||||
|
description: |-
|
||||||
|
MatchControllerRef ensures an object with the same controller reference
|
||||||
|
as the selecting object is selected.
|
||||||
|
type: boolean
|
||||||
|
matchLabels:
|
||||||
|
additionalProperties:
|
||||||
|
type: string
|
||||||
|
description: MatchLabels ensures an object with matching labels
|
||||||
|
is selected.
|
||||||
|
type: object
|
||||||
|
type: object
|
||||||
|
type: object
|
||||||
|
x-kubernetes-validations:
|
||||||
|
- message: either a resource reference or a resource selector should
|
||||||
|
be set.
|
||||||
|
rule: has(self.resourceRef) || has(self.resourceSelector)
|
||||||
|
reason:
|
||||||
|
description: Reason is the reason for blocking deletion of the resource.
|
||||||
|
type: string
|
||||||
|
replayDeletion:
|
||||||
|
description: ReplayDeletion will trigger a deletion on the used resource
|
||||||
|
during the deletion of the usage itself, if it was attempted to
|
||||||
|
be deleted at least once.
|
||||||
|
type: boolean
|
||||||
|
required:
|
||||||
|
- of
|
||||||
|
type: object
|
||||||
|
x-kubernetes-validations:
|
||||||
|
- message: either "spec.by" or "spec.reason" must be specified.
|
||||||
|
rule: has(self.by) || has(self.reason)
|
||||||
|
status:
|
||||||
|
description: UsageStatus defines the observed state of Usage.
|
||||||
|
properties:
|
||||||
|
conditions:
|
||||||
|
description: Conditions of the resource.
|
||||||
|
items:
|
||||||
|
description: A Condition that may apply to a resource.
|
||||||
|
properties:
|
||||||
|
lastTransitionTime:
|
||||||
|
description: |-
|
||||||
|
LastTransitionTime is the last time this condition transitioned from one
|
||||||
|
status to another.
|
||||||
|
format: date-time
|
||||||
|
type: string
|
||||||
|
message:
|
||||||
|
description: |-
|
||||||
|
A Message containing details about this condition's last transition from
|
||||||
|
one status to another, if any.
|
||||||
|
type: string
|
||||||
|
reason:
|
||||||
|
description: A Reason for this condition's last transition from
|
||||||
|
one status to another.
|
||||||
|
type: string
|
||||||
|
status:
|
||||||
|
description: Status of this condition; is it currently True,
|
||||||
|
False, or Unknown?
|
||||||
|
type: string
|
||||||
|
type:
|
||||||
|
description: |-
|
||||||
|
Type of this condition. At most one of each condition type may apply to
|
||||||
|
a resource at any point in time.
|
||||||
|
type: string
|
||||||
|
required:
|
||||||
|
- lastTransitionTime
|
||||||
|
- reason
|
||||||
|
- status
|
||||||
|
- type
|
||||||
|
type: object
|
||||||
|
type: array
|
||||||
|
x-kubernetes-list-map-keys:
|
||||||
|
- type
|
||||||
|
x-kubernetes-list-type: map
|
||||||
|
type: object
|
||||||
|
required:
|
||||||
|
- spec
|
||||||
|
type: object
|
||||||
|
served: true
|
||||||
|
storage: true
|
||||||
|
subresources:
|
||||||
|
status: {}
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
release="release-1.16"
|
||||||
|
|
||||||
|
apiextensions=$(gh api --jq '.[].name' "/repos/crossplane/crossplane/contents/cluster/crds?ref=${release}" | grep apiextensions)
|
||||||
|
|
||||||
|
|
||||||
|
for file in $apiextensions;
|
||||||
|
do
|
||||||
|
# output=$(echo $file | cut -d'_' -f2)
|
||||||
|
gh api -H "Accept: application/vnd.github.raw+json" "/repos/crossplane/crossplane/contents/cluster/crds/${file}?ref=${release}" > $file
|
||||||
|
done
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
<?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-base</artifactId>
|
||||||
|
<description>Crossplane base module for functions</description>
|
||||||
|
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.crossplane.compositefunctions</groupId>
|
||||||
|
<artifactId>crossplane-protobuf-model</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.slf4j</groupId>
|
||||||
|
<artifactId>slf4j-api</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.fasterxml.jackson.core</groupId>
|
||||||
|
<artifactId>jackson-databind</artifactId>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</project>
|
||||||
|
|
@ -0,0 +1,69 @@
|
||||||
|
package io.crossplane.compositefunctions;
|
||||||
|
|
||||||
|
import io.crossplane.compositefunctions.protobuf.*;
|
||||||
|
import io.grpc.stub.StreamObserver;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base class for a function to implement. Extend this class and implement the abstract runFunction method.
|
||||||
|
* This class adds any desired resources from a previously called function into the returned desired map.
|
||||||
|
* Any returned objects from the runFunction in the desiredresources map will be converted to protobuf resources,
|
||||||
|
* so the implemented method can work with the regular Java objects.
|
||||||
|
*/
|
||||||
|
public abstract class CrossplaneCompositeFunctionBase extends FunctionRunnerServiceGrpc.FunctionRunnerServiceImplBase {
|
||||||
|
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(CrossplaneCompositeFunctionBase.class);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void runFunction(RunFunctionRequest request, StreamObserver<RunFunctionResponse> responseObserver) {
|
||||||
|
try {
|
||||||
|
|
||||||
|
State.Builder desiredBuilder = State.newBuilder();
|
||||||
|
State desired = request.getDesired();
|
||||||
|
|
||||||
|
// Copy existing state into new desired state
|
||||||
|
// Should these be sent to the function? Probably?
|
||||||
|
desiredBuilder.putAllResources(desired.getResourcesMap());
|
||||||
|
|
||||||
|
CrossplaneFunctionRequest crossplaneFunctionRequest = new CrossplaneFunctionRequest(request.getObserved(),
|
||||||
|
request.getExtraResourcesMap(), request.getCredentialsMap());
|
||||||
|
|
||||||
|
logger.debug("Calling method with implemented logic");
|
||||||
|
CrossplaneFunctionResponse crossplaneFunctionResponse = runFunction(crossplaneFunctionRequest);
|
||||||
|
logger.debug("Finished calling method with implemented logic");
|
||||||
|
|
||||||
|
for (Map.Entry<String, Object> entry : crossplaneFunctionResponse.desiredResources().entrySet()) {
|
||||||
|
desiredBuilder.putResources(entry.getKey(), CrossplaneObjectToProtobufConverter.convertToResource(entry.getValue()));
|
||||||
|
}
|
||||||
|
|
||||||
|
Requirements requirements = Requirements.newBuilder()
|
||||||
|
.putAllExtraResources(crossplaneFunctionResponse.resourceSelectors())
|
||||||
|
.build();
|
||||||
|
|
||||||
|
RunFunctionResponse runFunctionResponse = RunFunctionResponse
|
||||||
|
.newBuilder()
|
||||||
|
.setRequirements(requirements)
|
||||||
|
.addAllResults(crossplaneFunctionResponse.results())
|
||||||
|
.setDesired(desiredBuilder.build())
|
||||||
|
.build();
|
||||||
|
|
||||||
|
responseObserver.onNext(runFunctionResponse);
|
||||||
|
responseObserver.onCompleted();
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.error("Error when running function logic", e);
|
||||||
|
responseObserver.onError(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The main method where the logic should live.
|
||||||
|
* @param crossplaneFunctionRequest The request object with the inputs from Crossplane added to it
|
||||||
|
* @return The response with desired resources, resource selectors and function results
|
||||||
|
*/
|
||||||
|
public abstract CrossplaneFunctionResponse runFunction(CrossplaneFunctionRequest crossplaneFunctionRequest);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
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) {
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
package io.crossplane.compositefunctions;
|
||||||
|
|
||||||
|
import io.crossplane.compositefunctions.protobuf.ResourceSelector;
|
||||||
|
import io.crossplane.compositefunctions.protobuf.Result;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Holder for the response to Crossplane
|
||||||
|
* @param desiredResources Map of the desired resources
|
||||||
|
* @param resourceSelectors Map of the resource selectors for any extra resources
|
||||||
|
* @param results List of the results
|
||||||
|
*/
|
||||||
|
public record CrossplaneFunctionResponse(Map<String, Object> desiredResources,
|
||||||
|
Map<String, ResourceSelector> resourceSelectors,
|
||||||
|
List<Result> results) {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an empty response with all fields initiated
|
||||||
|
*/
|
||||||
|
public CrossplaneFunctionResponse() {
|
||||||
|
this(new HashMap<>(), new HashMap<>(), new ArrayList<>());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,46 @@
|
||||||
|
package io.crossplane.compositefunctions;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import com.google.protobuf.Struct;
|
||||||
|
import com.google.protobuf.util.JsonFormat;
|
||||||
|
import io.crossplane.compositefunctions.protobuf.Resource;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper class for converting Java Objects into protobuf Structs within the Resource object
|
||||||
|
*/
|
||||||
|
public final class CrossplaneObjectToProtobufConverter {
|
||||||
|
|
||||||
|
private static final ObjectMapper objectMapper = new ObjectMapper();
|
||||||
|
private static final JsonFormat.Parser parser = JsonFormat.parser();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a java object to a resource
|
||||||
|
* @param object The object to convert
|
||||||
|
* @return The Resource with the object wrapped as a Struct
|
||||||
|
*/
|
||||||
|
public static Resource convertToResource(Object object) {
|
||||||
|
try {
|
||||||
|
Resource.Builder builder = Resource.newBuilder();
|
||||||
|
return builder.setResource(convertToStruct(object)).build();
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException("Unable to convert object to resource", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a java object to a struct
|
||||||
|
* @param object The object to convert
|
||||||
|
* @return The object as a protobuf struct
|
||||||
|
*/
|
||||||
|
public static Struct convertToStruct(Object object) {
|
||||||
|
try {
|
||||||
|
Struct.Builder structBuilder = Struct.newBuilder();
|
||||||
|
parser.merge(objectMapper.writeValueAsString(object), structBuilder);
|
||||||
|
return structBuilder.build();
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException("Unable to convert object to struct", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,113 @@
|
||||||
|
<?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>
|
||||||
|
<!-- PROJECT -->
|
||||||
|
<parent>
|
||||||
|
<groupId>io.crossplane.compositefunctions</groupId>
|
||||||
|
<artifactId>crossplane-parent</artifactId>
|
||||||
|
<version>${revision}</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<artifactId>crossplane-protobuf-model</artifactId>
|
||||||
|
<description>Crossplane coposite function protobuf</description>
|
||||||
|
<!-- DEPENDENCIES -->
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.protobuf</groupId>
|
||||||
|
<artifactId>protobuf-java</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.protobuf</groupId>
|
||||||
|
<artifactId>protobuf-java-util</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<!-- Protobuf -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.grpc</groupId>
|
||||||
|
<artifactId>grpc-protobuf</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.grpc</groupId>
|
||||||
|
<artifactId>grpc-stub</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.grpc</groupId>
|
||||||
|
<artifactId>grpc-core</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.grpc</groupId>
|
||||||
|
<artifactId>grpc-api</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.grpc</groupId>
|
||||||
|
<artifactId>grpc-util</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.grpc</groupId>
|
||||||
|
<artifactId>grpc-netty-shaded</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>jakarta.annotation</groupId>
|
||||||
|
<artifactId>jakarta.annotation-api</artifactId>
|
||||||
|
<optional>true</optional>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
<!-- BUILD -->
|
||||||
|
<build>
|
||||||
|
|
||||||
|
<extensions>
|
||||||
|
<extension>
|
||||||
|
<groupId>kr.motd.maven</groupId>
|
||||||
|
<artifactId>os-maven-plugin</artifactId>
|
||||||
|
<version>${os-maven-plugin.version}</version>
|
||||||
|
</extension>
|
||||||
|
</extensions>
|
||||||
|
<!-- PLUGINS -->
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>build-helper-maven-plugin</artifactId>
|
||||||
|
<version>${build-helper-maven-plugin.version}</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>add-source</id>
|
||||||
|
<phase>generate-sources</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>add-source</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<sources>
|
||||||
|
<source>src/main/proto/</source>
|
||||||
|
</sources>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.xolstice.maven.plugins</groupId>
|
||||||
|
<artifactId>protobuf-maven-plugin</artifactId>
|
||||||
|
<version>0.6.1</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<goals>
|
||||||
|
<goal>compile</goal>
|
||||||
|
<goal>compile-custom</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<pluginId>grpc-java</pluginId>
|
||||||
|
<protocArtifact>
|
||||||
|
com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier}
|
||||||
|
</protocArtifact>
|
||||||
|
<pluginArtifact>
|
||||||
|
io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}
|
||||||
|
</pluginArtifact>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
</project>
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
release="release-1.16"
|
||||||
|
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
|
||||||
|
|
||||||
|
sed -i '/option go_package/a\option java_package = "io.crossplane.compositefunctions.protobuf";\noption java_multiple_files = true;' $file
|
||||||
|
|
@ -0,0 +1,267 @@
|
||||||
|
/*
|
||||||
|
Copyright 2022 The Crossplane Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
import "google/protobuf/struct.proto";
|
||||||
|
import "google/protobuf/duration.proto";
|
||||||
|
|
||||||
|
package apiextensions.fn.proto.v1beta1;
|
||||||
|
|
||||||
|
option go_package = "github.com/crossplane/crossplane/apis/apiextensions/fn/proto/v1beta1";
|
||||||
|
option java_package = "io.crossplane.compositefunctions.protobuf";
|
||||||
|
option java_multiple_files = true;
|
||||||
|
|
||||||
|
// A FunctionRunnerService is a Composition Function.
|
||||||
|
service FunctionRunnerService {
|
||||||
|
// RunFunction runs the Composition Function.
|
||||||
|
rpc RunFunction(RunFunctionRequest) returns (RunFunctionResponse) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
// A RunFunctionRequest requests that the Composition Function be run.
|
||||||
|
message RunFunctionRequest {
|
||||||
|
// Metadata pertaining to this request.
|
||||||
|
RequestMeta meta = 1;
|
||||||
|
|
||||||
|
// The observed state prior to invocation of a Function pipeline. State passed
|
||||||
|
// to each Function is fresh as of the time the pipeline was invoked, not as
|
||||||
|
// of the time each Function was invoked.
|
||||||
|
State observed = 2;
|
||||||
|
|
||||||
|
// Desired state according to a Function pipeline. The state passed to a
|
||||||
|
// particular Function may have been accumulated by previous Functions in the
|
||||||
|
// pipeline.
|
||||||
|
//
|
||||||
|
// Note that the desired state must be a partial object with only the fields
|
||||||
|
// that this function (and its predecessors in the pipeline) wants to have
|
||||||
|
// set in the object. Copying a non-partial observed state to desired is most
|
||||||
|
// likely not what you want to do. Leaving out fields that had been returned
|
||||||
|
// as desired before will result in them being deleted from the objects in the
|
||||||
|
// cluster.
|
||||||
|
State desired = 3;
|
||||||
|
|
||||||
|
// Optional input specific to this Function invocation. A JSON representation
|
||||||
|
// of the 'input' block of the relevant entry in a Composition's pipeline.
|
||||||
|
optional google.protobuf.Struct input = 4;
|
||||||
|
|
||||||
|
// Optional context. Crossplane may pass arbitary contextual information to a
|
||||||
|
// Function. A Function may also return context in its RunFunctionResponse,
|
||||||
|
// and that context will be passed to subsequent Functions. Crossplane
|
||||||
|
// discards all context returned by the last Function in the pipeline.
|
||||||
|
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.
|
||||||
|
message RunFunctionResponse {
|
||||||
|
// Metadata pertaining to this response.
|
||||||
|
ResponseMeta meta = 1;
|
||||||
|
|
||||||
|
// Desired state according to a Function pipeline. Functions may add desired
|
||||||
|
// state, and may mutate or delete any part of the desired state they are
|
||||||
|
// concerned with. A Function must pass through any part of the desired state
|
||||||
|
// that it is not concerned with.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Note that the desired state must be a partial object with only the fields
|
||||||
|
// that this function (and its predecessors in the pipeline) wants to have
|
||||||
|
// set in the object. Copying a non-partial observed state to desired is most
|
||||||
|
// likely not what you want to do. Leaving out fields that had been returned
|
||||||
|
// as desired before will result in them being deleted from the objects in the
|
||||||
|
// cluster.
|
||||||
|
State desired = 2;
|
||||||
|
|
||||||
|
// Results of the Function run. Results are used for observability purposes.
|
||||||
|
repeated Result results = 3;
|
||||||
|
|
||||||
|
// 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.
|
||||||
|
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.
|
||||||
|
message RequestMeta {
|
||||||
|
// An opaque string identifying the content of the request. Two identical
|
||||||
|
// requests should have the same tag.
|
||||||
|
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.
|
||||||
|
message ResponseMeta {
|
||||||
|
// An opaque string identifying the content of the request. Must match the
|
||||||
|
// meta.tag of the corresponding RunFunctionRequest.
|
||||||
|
string tag = 1;
|
||||||
|
|
||||||
|
// Time-to-live of this response. Deterministic Functions with no side-effects
|
||||||
|
// (e.g. simple templating Functions) may specify a TTL. Crossplane may choose
|
||||||
|
// to cache responses until the TTL expires.
|
||||||
|
optional google.protobuf.Duration ttl = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// State of the composite resource (XR) and any composed resources.
|
||||||
|
message State {
|
||||||
|
// The state of the composite resource (XR).
|
||||||
|
Resource composite = 1;
|
||||||
|
|
||||||
|
// The state of any composed resources.
|
||||||
|
map<string, Resource> resources = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// A Resource represents the state of a composite or composed resource.
|
||||||
|
message Resource {
|
||||||
|
// The JSON representation of the resource.
|
||||||
|
//
|
||||||
|
// * Crossplane will set this field in a RunFunctionRequest to the entire
|
||||||
|
// observed state of a resource - including its metadata, spec, and status.
|
||||||
|
//
|
||||||
|
// * A Function should set this field in a RunFunctionRequest to communicate
|
||||||
|
// the desired state of a composite or composed resource.
|
||||||
|
//
|
||||||
|
// * A Function may only specify the desired status of a composite resource -
|
||||||
|
// not its metadata or spec. A Function should not return desired metadata
|
||||||
|
// or spec for a composite resource. This will be ignored.
|
||||||
|
//
|
||||||
|
// * A Function may not specify the desired status of a composed resource -
|
||||||
|
// only its metadata and spec. A Function should not return desired status
|
||||||
|
// for a composed resource. This will be ignored.
|
||||||
|
google.protobuf.Struct resource = 1;
|
||||||
|
|
||||||
|
// The resource's connection details.
|
||||||
|
//
|
||||||
|
// * Crossplane will set this field in a RunFunctionRequest to communicate the
|
||||||
|
// the observed connection details of a composite or composed resource.
|
||||||
|
//
|
||||||
|
// * A Function should set this field in a RunFunctionResponse to indicate the
|
||||||
|
// desired connection details of the composite resource.
|
||||||
|
//
|
||||||
|
// * A Function should not set this field in a RunFunctionResponse to indicate
|
||||||
|
// the desired connection details of a composed resource. This will be
|
||||||
|
// ignored.
|
||||||
|
map<string, bytes> connection_details = 2;
|
||||||
|
|
||||||
|
// Ready indicates whether the resource should be considered ready.
|
||||||
|
//
|
||||||
|
// * Crossplane will never set this field in a RunFunctionRequest.
|
||||||
|
//
|
||||||
|
// * A Function should set this field to READY_TRUE in a RunFunctionResponse
|
||||||
|
// to indicate that a desired composed resource is ready.
|
||||||
|
//
|
||||||
|
// * A Function should not set this field in a RunFunctionResponse to indicate
|
||||||
|
// that the desired composite resource is ready. This will be ignored.
|
||||||
|
Ready ready = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ready indicates whether a composed resource should be considered ready.
|
||||||
|
enum Ready {
|
||||||
|
READY_UNSPECIFIED = 0;
|
||||||
|
|
||||||
|
// True means the composed resource has been observed to be ready.
|
||||||
|
READY_TRUE = 1;
|
||||||
|
|
||||||
|
// False means the composed resource has not been observed to be ready.
|
||||||
|
READY_FALSE = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// A Result of running a Function.
|
||||||
|
message Result {
|
||||||
|
// Severity of this result.
|
||||||
|
Severity severity = 1;
|
||||||
|
|
||||||
|
// Human-readable details about the result.
|
||||||
|
string message = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Severity of Function results.
|
||||||
|
enum Severity {
|
||||||
|
SEVERITY_UNSPECIFIED = 0;
|
||||||
|
|
||||||
|
// Fatal results are fatal; subsequent Composition Functions may run, but
|
||||||
|
// the Composition Function pipeline run will be considered a failure and
|
||||||
|
// the first fatal result will be returned as an error.
|
||||||
|
SEVERITY_FATAL = 1;
|
||||||
|
|
||||||
|
// Warning results are non-fatal; the entire Composition will run to
|
||||||
|
// completion but warning events and debug logs associated with the
|
||||||
|
// composite resource will be emitted.
|
||||||
|
SEVERITY_WARNING = 2;
|
||||||
|
|
||||||
|
// Normal results are emitted as normal events and debug logs associated
|
||||||
|
// with the composite resource.
|
||||||
|
SEVERITY_NORMAL = 3;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,250 @@
|
||||||
|
<?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>
|
||||||
|
|
||||||
|
|
||||||
|
<groupId>io.crossplane.compositefunctions</groupId>
|
||||||
|
<artifactId>crossplane-parent</artifactId>
|
||||||
|
<version>${revision}</version>
|
||||||
|
<packaging>pom</packaging>
|
||||||
|
|
||||||
|
<url>https://crossplane.io/</url>
|
||||||
|
<description>Crossplane parent pom for composite functions</description>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<revision>1.0.0-SNAPSHOT</revision>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||||
|
<maven.compiler.target>17</maven.compiler.target>
|
||||||
|
<maven.compiler.source>17</maven.compiler.source>
|
||||||
|
|
||||||
|
<!-- Dependency versions -->
|
||||||
|
<kubernetes-client.version>6.13.0</kubernetes-client.version>
|
||||||
|
<os-maven-plugin.version>1.7.1</os-maven-plugin.version>
|
||||||
|
<protobuf.version>4.27.0</protobuf.version>
|
||||||
|
<grpc.version>1.64.0</grpc.version>
|
||||||
|
<jakarta-annotation.version>1.3.5</jakarta-annotation.version>
|
||||||
|
<slf4j.version>2.0.13</slf4j.version>
|
||||||
|
<jackson-databind.version>2.17.1</jackson-databind.version>
|
||||||
|
|
||||||
|
<!-- Plugin versions -->
|
||||||
|
<flatten-maven-plugin.version>1.6.0</flatten-maven-plugin.version>
|
||||||
|
<central-publishing-maven-plugin.version>0.4.0</central-publishing-maven-plugin.version>
|
||||||
|
<maven-source-plugin.version>3.3.1</maven-source-plugin.version>
|
||||||
|
<maven-javadoc-plugin.version>3.7.0</maven-javadoc-plugin.version>
|
||||||
|
<maven-gpg-plugin.version>3.2.4</maven-gpg-plugin.version>
|
||||||
|
<build-helper-maven-plugin.version>3.6.0</build-helper-maven-plugin.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<modules>
|
||||||
|
<module>crossplane-crd-model</module>
|
||||||
|
<module>crossplane-protobuf-model</module>
|
||||||
|
<module>crossplane-function-base</module>
|
||||||
|
</modules>
|
||||||
|
|
||||||
|
<dependencyManagement>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.crossplane.compositefunctions</groupId>
|
||||||
|
<artifactId>crossplane-crd-model</artifactId>
|
||||||
|
<version>${revision}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.crossplane.compositefunctions</groupId>
|
||||||
|
<artifactId>crossplane-protobuf-model</artifactId>
|
||||||
|
<version>${revision}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.fabric8</groupId>
|
||||||
|
<artifactId>kubernetes-client-bom</artifactId>
|
||||||
|
<version>${kubernetes-client.version}</version>
|
||||||
|
<scope>import</scope>
|
||||||
|
<type>pom</type>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.protobuf</groupId>
|
||||||
|
<artifactId>protobuf-java</artifactId>
|
||||||
|
<version>${protobuf.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.protobuf</groupId>
|
||||||
|
<artifactId>protobuf-java-util</artifactId>
|
||||||
|
<version>${protobuf.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Protobuf -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.grpc</groupId>
|
||||||
|
<artifactId>grpc-protobuf</artifactId>
|
||||||
|
<version>${grpc.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.grpc</groupId>
|
||||||
|
<artifactId>grpc-stub</artifactId>
|
||||||
|
<version>${grpc.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.grpc</groupId>
|
||||||
|
<artifactId>grpc-core</artifactId>
|
||||||
|
<version>${grpc.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.grpc</groupId>
|
||||||
|
<artifactId>grpc-api</artifactId>
|
||||||
|
<version>${grpc.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.grpc</groupId>
|
||||||
|
<artifactId>grpc-util</artifactId>
|
||||||
|
<version>${grpc.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.grpc</groupId>
|
||||||
|
<artifactId>grpc-netty-shaded</artifactId>
|
||||||
|
<version>${grpc.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>jakarta.annotation</groupId>
|
||||||
|
<artifactId>jakarta.annotation-api</artifactId>
|
||||||
|
<version>${jakarta-annotation.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.slf4j</groupId>
|
||||||
|
<artifactId>slf4j-api</artifactId>
|
||||||
|
<version>${slf4j.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.fasterxml.jackson.core</groupId>
|
||||||
|
<artifactId>jackson-databind</artifactId>
|
||||||
|
<version>${jackson-databind.version}</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</dependencyManagement>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<!-- To make the artifacts with ${revision} usable by maven, they have to be flattened -->
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>flatten-maven-plugin</artifactId>
|
||||||
|
<version>${flatten-maven-plugin.version}</version>
|
||||||
|
<configuration>
|
||||||
|
<updatePomFile>true</updatePomFile>
|
||||||
|
<flattenMode>resolveCiFriendliesOnly</flattenMode>
|
||||||
|
</configuration>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>flatten</id>
|
||||||
|
<phase>process-resources</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>flatten</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
<execution>
|
||||||
|
<id>flatten.clean</id>
|
||||||
|
<phase>clean</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>clean</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.sonatype.central</groupId>
|
||||||
|
<artifactId>central-publishing-maven-plugin</artifactId>
|
||||||
|
<version>${central-publishing-maven-plugin.version}</version>
|
||||||
|
<extensions>true</extensions>
|
||||||
|
<configuration>
|
||||||
|
<publishingServerId>central</publishingServerId>
|
||||||
|
<tokenAuth>true</tokenAuth>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-source-plugin</artifactId>
|
||||||
|
<version>${maven-source-plugin.version}</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>attach-sources</id>
|
||||||
|
<goals>
|
||||||
|
<goal>jar-no-fork</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-javadoc-plugin</artifactId>
|
||||||
|
<version>${maven-javadoc-plugin.version}</version>
|
||||||
|
<configuration>
|
||||||
|
<doclint>all,missing</doclint>
|
||||||
|
<excludePackageNames>io.crossplane.compositefunctions.protobuf:io.crossplane.apiextensions.*</excludePackageNames>
|
||||||
|
</configuration>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>attach-javadocs</id>
|
||||||
|
<goals>
|
||||||
|
<goal>jar</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
<licenses>
|
||||||
|
<license>
|
||||||
|
<name>The Apache License, Version 2.0</name>
|
||||||
|
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
|
||||||
|
</license>
|
||||||
|
</licenses>
|
||||||
|
|
||||||
|
|
||||||
|
<developers>
|
||||||
|
<developer>
|
||||||
|
<name>Knut-Erik Johnsen</name>
|
||||||
|
<organization>Crossplane</organization>
|
||||||
|
<organizationUrl>https://crossplane.io</organizationUrl>
|
||||||
|
</developer>
|
||||||
|
</developers>
|
||||||
|
|
||||||
|
<scm>
|
||||||
|
<connection>scm:git:git://github.com/crossplane/function-sdk-java.git</connection>
|
||||||
|
<developerConnection>scm:git:ssh://github.com:crossplane/function-sdk-java.git</developerConnection>
|
||||||
|
<url>https://github.com/crossplane/function-sdk-java/tree/main</url>
|
||||||
|
</scm>
|
||||||
|
|
||||||
|
<profiles>
|
||||||
|
<profile>
|
||||||
|
<id>deploy</id>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-gpg-plugin</artifactId>
|
||||||
|
<version>${maven-gpg-plugin.version}</version>
|
||||||
|
<configuration>
|
||||||
|
<gpgArguments>
|
||||||
|
<arg>--pinentry-mode</arg>
|
||||||
|
<arg>loopback</arg>
|
||||||
|
</gpgArguments>
|
||||||
|
</configuration>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>sign-artifacts</id>
|
||||||
|
<phase>verify</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>sign</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</profile>
|
||||||
|
</profiles>
|
||||||
|
</project>
|
||||||
Loading…
Reference in New Issue