apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
name: routedinterfaces.eos.netclab.dev
creationTimestamp: null
spec:
compositeTypeRef:
apiVersion: eos.netclab.dev/v1alpha1
kind: RoutedInterface
mode: Pipeline
pipeline:
- step: environmentConfigs
functionRef:
name: crossplane-contrib-function-environment-configs
input:
apiVersion: environmentconfigs.fn.crossplane.io/v1beta1
kind: Input
spec:
environmentConfigs:
- ref:
name: endpoint-protocols
type: Reference
- step: requests
functionRef:
name: crossplane-contrib-function-go-templating
input:
apiVersion: gotemplating.fn.crossplane.io/v1beta1
inline:
template: >
{{- $deviceUrl := "" }}
{{- $basicAuth := "" }}
{{- $address := .observed.composite.resource.spec.endpoint }}
{{- with index .context "apiextensions.crossplane.io/environment" }}
{{- $deviceUrl = printf "%s://%s:%d" .restconf.scheme $address .restconf.port }}
{{- end }}
{{- $basicAuth := ( getCredentialData . "eos-creds" ).basicAuth |
toString | b64enc }}
---
apiVersion: http.crossplane.io/v1alpha2
kind: Request
metadata:
annotations:
gotemplating.fn.crossplane.io/composition-resource-name: {{ .observed.composite.resource.spec.ifName }}-ipv4
spec:
forProvider:
insecureSkipTLSVerify: true
headers:
Accept: ["application/yang-data+json"]
Authorization: ["Basic {{ $basicAuth }}"]
payload:
baseUrl: "{{ $deviceUrl }}/restconf/data/openconfig-interfaces:interfaces/interface={{ .observed.composite.resource.spec.ifName }}/subinterfaces/subinterface=0"
body: |
{
"index": 0,
"openconfig-if-ip:ipv4": {
"config": {"enabled": true},
"addresses": {
"address": [
{
"config": {
"ip": "{{ .observed.composite.resource.spec.ipv4Address }}",
"prefix-length": {{ .observed.composite.resource.spec.ipv4PrefixLength }}
},
"ip": "{{ .observed.composite.resource.spec.ipv4Address }}"
}
]
}
}
}
mappings:
- action: CREATE
method: PUT
body: .payload.body
url: .payload.baseUrl
- action: UPDATE
method: PUT
body: .payload.body
url: .payload.baseUrl
- action: OBSERVE
url: .payload.baseUrl + "/ipv4/addresses/address={{ .observed.composite.resource.spec.ipv4Address }}"
- action: REMOVE
method: DELETE
url: .payload.baseUrl
expectedResponseCheck:
type: CUSTOM
logic: |
if .response.body."openconfig-if-ip:config".ip == "{{ .observed.composite.resource.spec.ipv4Address }}"
and .response.body."openconfig-if-ip:config"."prefix-length" == {{ .observed.composite.resource.spec.ipv4PrefixLength }}
then true
else false
end
kind: GoTemplate
source: Inline
credentials:
- name: eos-creds
source: Secret
secretRef:
name: eos-creds
namespace: crossplane-system
- step: auto-ready
functionRef:
name: crossplane-contrib-function-auto-ready