├── .github
├── ISSUE_TEMPLATE
│ ├── bug_report.md
│ ├── config.yml
│ └── feature_request.md
└── workflows
│ └── autoclose.yml
├── .gitignore
├── .gitlab-ci.yml
├── .npmrc
├── CHANGELOG.md
├── LICENSE
├── Makefile
├── README.md
├── SUPPORT.md
├── contributing
├── README.md
├── images
│ └── classDiagram.png
├── process_local_doc_build.md
└── process_release.md
├── docs
├── _static
│ └── f5-logo-solid-rgb_small.png
├── _templates
│ └── layout.html
├── api-documentation.rst
├── apidocs.rst
├── authentication.rst
├── big-iq-licensing.rst
├── clustering-managing-devices.rst
├── clustering.rst
├── components.rst
├── composing-a-declaration.rst
├── conf.py
├── declarations
│ ├── auth.rst
│ ├── basic.rst
│ ├── bigiq-examples.rst
│ ├── clustering.rst
│ ├── gslb.rst
│ ├── miscellaneous.rst
│ ├── network-objects.rst
│ ├── observability.rst
│ └── trace-response.json
├── do-on-bigiq.rst
├── examples.rst
├── faq.rst
├── http-methods.rst
├── images
│ ├── data-flow.png
│ ├── install1.png
│ ├── install2.png
│ ├── install3.png
│ ├── upgrade.png
│ ├── validate-1.png
│ ├── validate-1a.png
│ ├── validate-2.png
│ ├── validate-2a.png
│ ├── validate-3.png
│ └── validate-4.png
├── index.html
├── index.rst
├── installation.rst
├── json-pointers.rst
├── prereqs.rst
├── revision-history.rst
├── troubleshooting.rst
├── using-do.rst
└── validate.rst
├── examples
├── applicationDataSize.json
├── auditLogging.json
├── authMethods.json
├── avrStreamingSupport.json
├── banner.json
├── bgp.json
├── clusterWithIpAddresses.json
├── dagGlobals.json
├── debugTrace.json
├── deviceCertificate.json
├── deviceCertificateAndTrustCertificates.json
├── dnsResolver.json
├── dryRun.json
├── failoverMulticast.json
├── firewallPolicy.json
├── gslbDataCenter.json
├── gslbGlobals.json
├── gslbMonitor.json
├── gslbProberPool.json
├── gslbServer.json
├── httpd.json
├── ldapSslCaCertUrlRef.json
├── licenseViaBigIqPoolAuthProvider.json
├── licenseViaBigIqPoolUnreachableHEXHypervisor.json
├── licenseViaBigIqPurchasedPoolReachable.json
├── licenseViaBigIqPurchasedPoolUnreachable.json
├── licenseViaBigIqReachableASG.json
├── licenseViaBigIqRegKeyPool.json
├── licenseViaBigIqUtilityReachable.json
├── licenseViaBigIqUtilityUnreachable.json
├── localOnlyRoutes.json
├── macMasquerade.json
├── managementIp.json
├── managementIpFirewalWithAfmProvisioned.json
├── managementIpFirewall.json
├── managementRouteInterface.json
├── mgmtDhcpEnabled.json
├── mirrorIp.json
├── multipleFailoverUnicasts.json
├── onboard.json
├── onboardFailover.json
├── onboardViaBigIqAws.json
├── passwordPolicy.json
├── preserveOrigDhcpRoutes.json
├── publicKeys.json
├── reLicenseBigIp.json
├── reLicenseViaBigIqReachable.json
├── reLicenseViaBigIqUnreachable.json
├── reLicenseViaNewBigIqUnreachable.json
├── remoteRoleVariableFields.json
├── remoteRoles.json
├── restjavad.json
├── revokeViaBigIqUnreachable.json
├── routeDomains.json
├── routeInterface.json
├── routeMap.json
├── routingAccessList.json
├── routingAsPath.json
├── routingPrefixList.json
├── securityAnalytics.json
├── securityWaf.json
├── skipDeviceCertificates.json
├── snmp.json
├── sshd.json
├── syslogDestination.json
├── system.json
├── tcpForwardTunnel.json
├── trafficControl.json
├── trafficGroups.json
├── user.json
├── userAgent.json
├── viaASG.json
├── vlanAutoLastHop.json
├── vlanCmpHash.json
├── vlanFailsafe.json
└── vxlanTunnel.json
├── jsdoc.conf
├── make.bat
├── package-lock.json
├── package.json
├── public
└── index.html
├── requirements.txt
├── scripts
├── build
│ ├── Dockerfile
│ ├── Dockerfile.asg
│ ├── build.sh
│ ├── buildPostmanCollection.sh
│ ├── buildRpm.sh
│ ├── f5-declarative-onboarding.spec
│ ├── generatePostmanCollection.js
│ ├── schema-build.js
│ ├── schema-check.js
│ └── schema-to-rst.js
└── dev
│ ├── build_harness_file.sh
│ ├── collectRemoteIntegrationTestLogs.sh
│ ├── createMR.js
│ ├── get-host.sh
│ ├── install-rpm.sh
│ ├── reactivateBigIq.js
│ ├── scpRemoteFile.sh
│ └── update-do-deps.sh
├── slack-channel-statement.md
├── src
├── lib
│ ├── ajvValidator.js
│ ├── analyticsHandler.js
│ ├── authHandler.js
│ ├── bigIqSettingsValidator.js
│ ├── businessLogicValidator.js
│ ├── configItems.json
│ ├── configManager.js
│ ├── configResponse.js
│ ├── cryptoUtil.js
│ ├── customKeywords.js
│ ├── declarationHandler.js
│ ├── declarationParser.js
│ ├── deleteHandler.js
│ ├── deprovisionHandler.js
│ ├── deviceCertificateValidator.js
│ ├── diffHandler.js
│ ├── doUtil.js
│ ├── dscHandler.js
│ ├── fetchHandler.js
│ ├── gslbHandler.js
│ ├── infoResponse.js
│ ├── inspectHandler.js
│ ├── inspectResponse.js
│ ├── licensePoolValidator.js
│ ├── logger.js
│ ├── networkHandler.js
│ ├── parserUtil.js
│ ├── provisionHandler.js
│ ├── response.js
│ ├── routingAccessListValidator.js
│ ├── routingBgpValidator.js
│ ├── routingPrefixListValidator.js
│ ├── securityHandler.js
│ ├── sharedConstants.js
│ ├── sshUtil.js
│ ├── state.js
│ ├── systemHandler.js
│ ├── taskResponse.js
│ ├── traceManager.js
│ ├── userValidator.js
│ └── validator.js
├── nodejs
│ ├── manifest.json
│ └── restWorker.js
├── schema
│ ├── 1.0.0
│ │ ├── base.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── network.schema.json
│ │ └── system.schema.json
│ ├── 1.1.0
│ │ ├── base.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── network.schema.json
│ │ └── system.schema.json
│ ├── 1.10.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── network.schema.json
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ ├── 1.11.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── network.schema.json
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ ├── 1.12.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── definitions.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── network.schema.json
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ ├── 1.13.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── definitions.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── network.schema.json
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ ├── 1.14.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── definitions.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── network.schema.json
│ │ ├── openapi.yaml
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ ├── 1.15.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── network.schema.json
│ │ ├── openapi.yaml
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ ├── 1.16.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── network.schema.json
│ │ ├── openapi.yaml
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ ├── 1.17.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── definitions.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── gslb.schema.json
│ │ ├── network.schema.json
│ │ ├── openapi.yaml
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ ├── 1.18.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── definitions.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── gslb.schema.json
│ │ ├── network.schema.json
│ │ ├── openapi.yaml
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ ├── 1.19.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── definitions.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── gslb.schema.json
│ │ ├── network.schema.json
│ │ ├── openapi.yaml
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ ├── 1.2.0
│ │ ├── base.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── network.schema.json
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ ├── 1.20.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── definitions.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── gslb.schema.json
│ │ ├── network.schema.json
│ │ ├── openapi.yaml
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ ├── 1.21.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── definitions.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── gslb.schema.json
│ │ ├── network.schema.json
│ │ ├── openapi.yaml
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ ├── 1.21.1
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── definitions.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── gslb.schema.json
│ │ ├── network.schema.json
│ │ ├── openapi.yaml
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ ├── 1.22.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── definitions.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── gslb.schema.json
│ │ ├── network.schema.json
│ │ ├── openapi.yaml
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ ├── 1.23.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── definitions.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── gslb.schema.json
│ │ ├── network.schema.json
│ │ ├── openapi.yaml
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ ├── 1.24.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── definitions.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── gslb.schema.json
│ │ ├── network.schema.json
│ │ ├── openapi.yaml
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ ├── 1.25.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── definitions.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── gslb.schema.json
│ │ ├── network.schema.json
│ │ ├── openapi.yaml
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ ├── 1.26.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── definitions.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── gslb.schema.json
│ │ ├── network.schema.json
│ │ ├── openapi.yaml
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ ├── 1.27.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── definitions.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── gslb.schema.json
│ │ ├── network.schema.json
│ │ ├── openapi.yaml
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ ├── 1.27.1
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── definitions.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── gslb.schema.json
│ │ ├── network.schema.json
│ │ ├── openapi.yaml
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ ├── 1.28.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── definitions.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── gslb.schema.json
│ │ ├── network.schema.json
│ │ ├── openapi.yaml
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ ├── 1.29.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── definitions.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── gslb.schema.json
│ │ ├── network.schema.json
│ │ ├── openapi.yaml
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ ├── 1.3.0
│ │ ├── base.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── network.schema.json
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ ├── 1.3.1
│ │ ├── base.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── network.schema.json
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ ├── 1.30.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── definitions.schema.json
│ │ ├── do.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── gslb.schema.json
│ │ ├── network.schema.json
│ │ ├── openapi.yaml
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ ├── 1.31.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── definitions.schema.json
│ │ ├── do.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── gslb.schema.json
│ │ ├── network.schema.json
│ │ ├── openapi.yaml
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ ├── 1.33.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── definitions.schema.json
│ │ ├── do.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── gslb.schema.json
│ │ ├── network.schema.json
│ │ ├── openapi.yaml
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ ├── 1.34.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── definitions.schema.json
│ │ ├── do.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── gslb.schema.json
│ │ ├── network.schema.json
│ │ ├── openapi.yaml
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ ├── 1.35.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── definitions.schema.json
│ │ ├── do.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── gslb.schema.json
│ │ ├── network.schema.json
│ │ ├── openapi.yaml
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ ├── 1.36.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── definitions.schema.json
│ │ ├── do.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── gslb.schema.json
│ │ ├── network.schema.json
│ │ ├── openapi.yaml
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ ├── 1.37.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── definitions.schema.json
│ │ ├── do.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── gslb.schema.json
│ │ ├── network.schema.json
│ │ ├── openapi.yaml
│ │ ├── remote.schema.json
│ │ ├── security.schema.json
│ │ └── system.schema.json
│ ├── 1.38.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── definitions.schema.json
│ │ ├── do.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── gslb.schema.json
│ │ ├── network.schema.json
│ │ ├── openapi.yaml
│ │ ├── remote.schema.json
│ │ ├── security.schema.json
│ │ └── system.schema.json
│ ├── 1.39.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── definitions.schema.json
│ │ ├── do.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── gslb.schema.json
│ │ ├── network.schema.json
│ │ ├── openapi.yaml
│ │ ├── remote.schema.json
│ │ ├── security.schema.json
│ │ └── system.schema.json
│ ├── 1.4.0
│ │ ├── base.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── network.schema.json
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ ├── 1.4.1
│ │ ├── base.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── network.schema.json
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ ├── 1.40.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── definitions.schema.json
│ │ ├── do.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── gslb.schema.json
│ │ ├── network.schema.json
│ │ ├── openapi.yaml
│ │ ├── remote.schema.json
│ │ ├── security.schema.json
│ │ └── system.schema.json
│ ├── 1.41.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── definitions.schema.json
│ │ ├── do.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── gslb.schema.json
│ │ ├── network.schema.json
│ │ ├── openapi.yaml
│ │ ├── remote.schema.json
│ │ ├── security.schema.json
│ │ └── system.schema.json
│ ├── 1.42.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── definitions.schema.json
│ │ ├── do.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── gslb.schema.json
│ │ ├── network.schema.json
│ │ ├── openapi.yaml
│ │ ├── remote.schema.json
│ │ ├── security.schema.json
│ │ └── system.schema.json
│ ├── 1.43.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── definitions.schema.json
│ │ ├── do.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── gslb.schema.json
│ │ ├── network.schema.json
│ │ ├── openapi.yaml
│ │ ├── remote.schema.json
│ │ ├── security.schema.json
│ │ └── system.schema.json
│ ├── 1.44.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── definitions.schema.json
│ │ ├── do.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── gslb.schema.json
│ │ ├── network.schema.json
│ │ ├── openapi.yaml
│ │ ├── remote.schema.json
│ │ ├── security.schema.json
│ │ └── system.schema.json
│ ├── 1.45.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── definitions.schema.json
│ │ ├── do.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── gslb.schema.json
│ │ ├── network.schema.json
│ │ ├── openapi.yaml
│ │ ├── remote.schema.json
│ │ ├── security.schema.json
│ │ └── system.schema.json
│ ├── 1.46.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── definitions.schema.json
│ │ ├── do.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── gslb.schema.json
│ │ ├── network.schema.json
│ │ ├── openapi.yaml
│ │ ├── remote.schema.json
│ │ ├── security.schema.json
│ │ └── system.schema.json
│ ├── 1.5.0
│ │ ├── analytics.schema.json
│ │ ├── base.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── network.schema.json
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ ├── 1.6.0
│ │ ├── analytics.schema.json
│ │ ├── base.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── network.schema.json
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ ├── 1.6.1
│ │ ├── analytics.schema.json
│ │ ├── base.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── network.schema.json
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ ├── 1.7.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── network.schema.json
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ ├── 1.8.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── network.schema.json
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ ├── 1.9.0
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── network.schema.json
│ │ ├── remote.schema.json
│ │ └── system.schema.json
│ └── latest
│ │ ├── analytics.schema.json
│ │ ├── auth.schema.json
│ │ ├── base.schema.json
│ │ ├── definitions.schema.json
│ │ ├── do.schema.json
│ │ ├── dsc.schema.json
│ │ ├── formats.js
│ │ ├── gslb.schema.json
│ │ ├── network.schema.json
│ │ ├── openapi.yaml
│ │ ├── remote.schema.json
│ │ ├── security.schema.json
│ │ └── system.schema.json
└── scripts
│ └── decryptConfValue
├── stryker.conf.js
├── test
├── .eslintrc.json
├── README.md
├── env
│ └── terraform
│ │ ├── README.md
│ │ ├── modules
│ │ └── utils
│ │ │ └── main.tf
│ │ ├── onboard.yaml
│ │ └── plans
│ │ └── openstack
│ │ ├── main.tf
│ │ ├── output.tf
│ │ └── variables.tf
├── integration
│ ├── bodies
│ │ ├── bogus.json
│ │ ├── firewall.json
│ │ ├── gslb.json
│ │ ├── gslb_global_settings.json
│ │ ├── licensing_big_iq.json
│ │ ├── network.json
│ │ ├── onboard.json
│ │ ├── revoke_from_bigiq.json
│ │ └── revoking_relicensing_big_iq.json
│ ├── common.js
│ ├── constants.js
│ ├── logger.js
│ ├── misc
│ │ ├── deleteTests.js
│ │ ├── deviceCertificate.js
│ │ ├── rollback.js
│ │ ├── routeDomain.js
│ │ └── user.js
│ ├── property
│ │ ├── propertiesAuthentication.js
│ │ ├── propertiesCommon.js
│ │ ├── propertiesDnsResolver.js
│ │ ├── propertiesFirewall.js
│ │ ├── propertiesGslbGlobals.js
│ │ ├── propertiesHttpd.js
│ │ ├── propertiesManagementRoute.js
│ │ ├── propertiesNetAddressList.js
│ │ ├── propertiesNetPortList.js
│ │ ├── propertiesPasswordPolicy.js
│ │ ├── propertiesSecurityAnalytics.js
│ │ ├── propertiesSecurityWaf.js
│ │ ├── propertiesSnmp.js
│ │ ├── propertiesSystem.js
│ │ ├── propertiesTunnel.js
│ │ └── propertiesUser.js
│ ├── setup.js
│ └── test.js
├── mochaReporterConfig.json
└── unit
│ ├── lib
│ ├── analyticsHandlerTests.js
│ ├── authHandlerTests.js
│ ├── bigIqSettingsValidatorTests.js
│ ├── businessLogicValidatorTests.js
│ ├── configManagerTests.js
│ ├── configResponseTests.js
│ ├── cryptoUtilTests.js
│ ├── customKeywordsTests.js
│ ├── declarationHandlerTests.js
│ ├── declarationParserTests.js
│ ├── deleteHandlerTests.js
│ ├── deprovisionHandlerTests.js
│ ├── deviceCertificateValidatorTests.js
│ ├── diffHandlerTests.js
│ ├── doUtilTests.js
│ ├── dscHandlerTests.js
│ ├── fetchHandlerTests.js
│ ├── gslbHandlerTests.js
│ ├── infoResponseTests.js
│ ├── inspectHandlerTests.js
│ ├── inspectResponseTests.js
│ ├── licensePoolValidatorTests.js
│ ├── loggerTests.js
│ ├── networkHandlerTests.js
│ ├── parserUtilTests.js
│ ├── provisionHandlerTests.js
│ ├── responseTests.js
│ ├── routingAccessListValidatorTests.js
│ ├── routingBgpValidatorTests.js
│ ├── routingPrefixListValidatorTests.js
│ ├── securityHandlerTests.js
│ ├── sshUtilTests.js
│ ├── stateMock.js
│ ├── stateTests.js
│ ├── systemHandlerTests.js
│ ├── taskResponseTests.js
│ ├── traceManagerTests.js
│ ├── userValidatorTests.js
│ └── validatorTests.js
│ ├── nodejs
│ └── restWorkerTests.js
│ └── schema
│ ├── analyticsSchemaTests.js
│ ├── authSchemaTests.js
│ ├── baseSchemaTests.js
│ ├── doSchemaTests.js
│ ├── dscSchemaTests.js
│ ├── examplesTests.js
│ ├── formatsTests.js
│ ├── gslbSchemaTests.js
│ ├── networkSchemaTests.js
│ ├── remoteSchemaTests.js
│ ├── securitySchemaTests.js
│ └── systemSchemaTests.js
└── versions.json
/.github/ISSUE_TEMPLATE/bug_report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug report
3 | about: Report a defect in the product
4 | title: ''
5 | labels: bug, untriaged
6 | assignees: ''
7 |
8 | ---
9 |
10 |
18 |
19 | ### Environment
20 | * Declarative Onboarding Version:
21 | * BIG-IP Version:
22 |
23 | ### Summary
24 | A clear and concise description of what the bug is.
25 | Please also include information about the reproducibility and the severity/impact of the issue.
26 |
27 | ### Steps To Reproduce
28 | Steps to reproduce the behavior:
29 | 1. Submit the following declaration:
30 | ```json
31 | {
32 | "schemaVersion": "1.6.0",
33 | "class": "Device",
34 | "Common": {
35 | "class": "Tenant",
36 | "hostname": "example.local"
37 | }
38 | }
39 | ```
40 |
41 | 2. Observe the following error response:
42 | ```json
43 | {
44 | "id": "62b57a65-ad1a-4ac4-8ddb-0427fad81b79",
45 | "selfLink": "https://localhost/mgmt/shared/declarative-onboarding/task/62b57a65-ad1a-4ac4-8ddb-0427fad81b79",
46 | "code": 400,
47 | "status": "ERROR",
48 | "message": "bad declaration",
49 | "errors": [
50 | "Unable to parse request body. Should be JSON format."
51 | ],
52 | "result": {
53 | "class": "Result",
54 | "code": 400,
55 | "status": "ERROR",
56 | "message": "bad declaration",
57 | "errors": [
58 | "Unable to parse request body. Should be JSON format."
59 | ]
60 | },
61 | "declaration": {}
62 | }
63 | ```
64 |
65 | ### Expected Behavior
66 | A clear and concise description of what you expected to happen.
67 |
68 | ### Actual Behavior
69 | A clear and concise description of what actually happens.
70 | Please include any applicable error output.
71 |
72 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/config.yml:
--------------------------------------------------------------------------------
1 | blank_issues_enabled: false
2 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/feature_request.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Feature request
3 | about: Request an enhancement or new feature
4 | title: ''
5 | labels: 'enhancement, untriaged'
6 | assignees: ''
7 |
8 | ---
9 |
10 |
18 |
19 | ### Is your feature request related to a problem? Please describe.
20 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
21 |
22 | ### Describe the solution you'd like
23 | A clear and concise description of what you want to happen.
24 |
25 | ### Describe alternatives you've considered
26 | A clear and concise description of any alternative solutions or features you've considered.
27 |
28 | ### Additional context
29 | Add any other context, such as the desired tmsh configuration, about the feature request here.
30 |
--------------------------------------------------------------------------------
/.github/workflows/autoclose.yml:
--------------------------------------------------------------------------------
1 | name: No Response
2 |
3 | # Both `issue_comment` and `scheduled` event types are required for this Action
4 | # to work properly.
5 | on:
6 | issue_comment:
7 | types: [created]
8 | schedule:
9 | # Schedule for five minutes after the hour, every hour
10 | - cron: '5 * * * *'
11 |
12 | jobs:
13 | noResponse:
14 | runs-on: ubuntu-latest
15 | steps:
16 | - uses: lee-dohm/no-response@v0.5.0
17 | with:
18 | token: ${{ github.token }}
19 | daysUntilClose: 30
20 | responseRequiredLabel: question
21 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | .vscode
3 | jsconfig.json
4 | *.tfstate*
5 | .nyc_output/
6 | out/
7 | node_modules/
8 | /build/
9 | docs/_build/
10 | coverage/
11 | npm-debug.log
12 | docs/schema-reference.rst
13 | docs/do.schema.json
14 | dist/
15 | test/env/terraform/plans/openstack/.terraform*
16 | test/logs
17 | test_harness.json
18 | harness_facts.json
19 | *.swp
20 |
--------------------------------------------------------------------------------
/.npmrc:
--------------------------------------------------------------------------------
1 | git-tag-version=false
2 | lockfile-version=1
3 |
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | # Minimal makefile for Sphinx documentation
2 | #
3 |
4 | # You can set these variables from the command line.
5 | SPHINXOPTS =
6 | SPHINXBUILD = sphinx-build
7 | SPHINXPROJ = FDeclarativeOnboarding
8 | SOURCEDIR = docs
9 | BUILDDIR = docs/_build
10 |
11 | # Put it first so that "make" without argument is like "make help".
12 | help:
13 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
14 |
15 | .PHONY: help Makefile
16 |
17 | # Catch-all target: route all unknown targets to Sphinx using the new
18 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
19 | %: Makefile
20 | npm ci
21 | node scripts/build/schema-build.js
22 | node scripts/build/schema-check.js
23 | node scripts/build/schema-to-rst.js
24 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
25 |
26 | # Custom commands for building and testing project documentation
27 |
28 | # build live preview of docs locally
29 | .PHONY: preview
30 | preview:
31 | @echo "Running autobuild. View live edits at:"
32 | @echo " http://0.0.0.0:8000"
33 | @echo ""
34 | sphinx-autobuild --host 0.0.0.0 -b html $(SOURCEDIR) $(BUILDDIR)/html
35 |
36 | # run docs quality tests locally
37 | .PHONY: test
38 | test:
39 | rm -rf docs/_build
40 | ./scripts/test-docs.sh
41 |
42 | # one-time html build using a docker container
43 | .PHONY: docker-html
44 | docker-html:
45 | rm -rf docs/_build
46 | ./scripts/docker-docs.sh make html
47 |
48 | # Build live preview of docs in a docker container
49 | .PHONY: docker-preview
50 | docker-preview:
51 | rm -rf docs/_build
52 | DOCKER_RUN_ARGS="-p 127.0.0.1:8000:8000" \
53 | ./scripts/docker-docs.sh \
54 | sphinx-autobuild --host 0.0.0.0 -b html $(SOURCEDIR) $(BUILDDIR)/html
55 |
56 | # run docs quality tests in a docker container
57 | .PHONY: docker-test
58 | docker-test:
59 | rm -rf docs/_build
60 | ./scripts/docker-docs.sh ./scripts/test-docs.sh
61 |
62 | # build an RPM from the current source tree
63 | .PHONY: rpm
64 | rpm:
65 | ./scripts/rpmbuild.sh
66 |
67 | # build an RPM from the current source tree in a docker container
68 | .PHONY: docker-rpm
69 | docker-rpm:
70 | ./scripts/docker-rpmbuild.sh
71 |
72 |
--------------------------------------------------------------------------------
/contributing/images/classDiagram.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/8ac9ac5e60f2cefb56120d6c370a57b6677916c4/contributing/images/classDiagram.png
--------------------------------------------------------------------------------
/contributing/process_local_doc_build.md:
--------------------------------------------------------------------------------
1 | # How to build documentation locally
2 | 1. Create a Python virtual enviornment:
3 | ```bash
4 | virtualenv venv
5 | ```
6 | 2. Activate the virutal environemnt:
7 | ```bash
8 | source venv/bin/activate
9 | ```
10 | 3. Install Python dependencies to the virtual environment:
11 | ```bash
12 | pip install -r requirements.txt
13 | ```
14 | 4. Use the Makefile to build documentation as HTML:
15 | ```bash
16 | make html
17 | ```
18 |
19 | After the first time doing this, only steps 2 and 4 should be necessary to build documentation locally.
20 |
--------------------------------------------------------------------------------
/docs/_static/f5-logo-solid-rgb_small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/8ac9ac5e60f2cefb56120d6c370a57b6677916c4/docs/_static/f5-logo-solid-rgb_small.png
--------------------------------------------------------------------------------
/docs/api-documentation.rst:
--------------------------------------------------------------------------------
1 |
2 | .. _apidocs:
3 |
4 | OpenAPI Reference
5 | =================
6 |
7 | To see the API reference in a new browser window, click |api|.
8 |
9 | |
10 |
11 |
12 | .. |api| raw:: html
13 |
14 | API documentation
--------------------------------------------------------------------------------
/docs/apidocs.rst:
--------------------------------------------------------------------------------
1 | .. _apidocumentation:
2 |
3 | API Reference
4 | =============
5 |
6 | Internal reference, this is overwritten.
--------------------------------------------------------------------------------
/docs/authentication.rst:
--------------------------------------------------------------------------------
1 | Authentication and Authorization
2 | --------------------------------
3 |
4 | Authorization to invoke BIG-IP Declarative Onboarding includes authorization to GET declarations stored in
5 | BIG-IP Declarative Onboarding.
6 |
7 | BIG-IP Declarative Onboarding does not require its own credentials, however you must have administrator credentials for the BIG-IP that is running BIG-IP Declarative Onboarding.
8 |
9 | Because BIG-IP Declarative Onboarding is an iControl LX extension, you can authenticate by including one of the following **header** values in your HTTP requests.
10 |
11 | Basic Auth
12 | ~~~~~~~~~~
13 |
14 | To use Basic authentication, add a new request header: ``Authorization: Basic {Base64encoded value of username:password}``.
15 | (If using a RESTful API client like Postman, in the :guilabel:`Authorization` tab, type the user name and password for a BIG-IP user account with Administrator permissions, which automatically adds the encoded header.)
16 |
17 | .. _token-ref:
18 |
19 | Token Auth
20 | ~~~~~~~~~~
21 |
22 | To use Token Authentication, add a new request header: ``X-F5-Auth-Token: {tokenValue}``
23 |
24 |
25 | If you need to create a new token, use the following syntax:
26 |
27 | .. code-block:: bash
28 |
29 |
30 | POST /mgmt/shared/authn/login
31 | Host: {{bigip_host}}
32 | Authorization: Basic {Base64encoded value of username:password}
33 | Content-Type: application/json
34 | {
35 | "username":"{userWithCorrectPerms}",
36 | "password":"{userPassword}",
37 | "loginProviderName":"tmos"
38 | }
39 |
40 |
41 | By default, the token has an expiration time of 1200 seconds. To extend this time, use the following syntax:
42 |
43 | .. code-block:: bash
44 |
45 |
46 | PATCH /mgmt/shared/authz/tokens/{{bigip_auth_token}}
47 | Host: {{bigip_host}}
48 | Content-Type: application/json
49 | X-F5-Auth-Token: {{bigip_auth_token}}
50 | {
51 | "timeout":"36000" //this is the maximum
52 | }
53 |
54 |
55 |
56 |
--------------------------------------------------------------------------------
/docs/components.rst:
--------------------------------------------------------------------------------
1 | Components of BIG-IP Declarative Onboarding
2 | -------------------------------------------
3 |
4 | BIG-IP Declarative Onboarding Declaration
5 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
6 |
7 | A BIG-IP Declarative Onboarding declaration describes the desired initial configuration of an Application
8 | Delivery Controller (ADC) such as F5 BIG-IP.
9 |
10 | BIG-IP Declarative Onboarding JSON Schema
11 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
12 |
13 | The |json| schema validates the declaration, and then produces a BIG-IP
14 | configuration. The JSON Schema document prescribes the syntax of a BIG-IP Declarative Onboarding
15 | declaration. The declaration schema controls which
16 | objects may appear in a declaration, what name they may or must use, what
17 | properties they may have, which of those you must supply in the declaration, and
18 | which BIG-IP Declarative Onboarding may fill with default values. The schema also specifies the ranges of
19 | values certain properties may take.
20 |
21 | BIG-IP Declarative Onboarding contains two modules: a |rest| worker and an audit engine. The REST worker
22 | provides a |crud| interface for creating and modifying the declaration document.
23 | The audit engine is responsible for aligning BIG-IP configuration with the
24 | declaration document.
25 |
26 | **Declaration > Validated Declaration > Parser > Auditor > iControl > BIG-IP**
27 |
28 |
29 |
30 | .. |json| raw:: html
31 |
32 | JSON
33 |
34 | .. |rest| raw:: html
35 |
36 | REST
37 |
38 | .. |crud| raw:: html
39 |
40 | CRUD
41 |
--------------------------------------------------------------------------------
/docs/examples.rst:
--------------------------------------------------------------------------------
1 | Example Declarations
2 | ====================
3 |
4 | This section contains a number of additional example declarations you can use. Use the following index, or the links on the right to go to a specific category of declaration.
5 |
6 | The following categories were introduced with the release of BIG-IP DO 1.17.
7 |
8 | .. IMPORTANT:: The following examples include passwords that may not be valid for BIG-IP v14.0 and later. See |pass| for specific requirements.
9 |
10 | .. NOTE:: All of the examples will work on BIG-IP and BIG-IQ, however, when using BIG-IP DO on a BIG-IQ, you must add the BIG-IQ section to the declaration (see :doc:`do-on-bigiq` and the :ref:`BIG-IQ examples` for details).
11 |
12 |
13 | Basic Examples
14 | --------------
15 |
16 | .. toctree::
17 | :maxdepth: 2
18 | :includehidden:
19 | :glob:
20 |
21 | declarations/basic
22 |
23 | Network Objects
24 | ---------------
25 |
26 | .. toctree::
27 | :maxdepth: 2
28 | :includehidden:
29 | :glob:
30 |
31 | declarations/network-objects
32 |
33 | Clustering
34 | ----------
35 |
36 | .. toctree::
37 | :maxdepth: 2
38 | :includehidden:
39 | :glob:
40 |
41 | declarations/clustering
42 |
43 | Authentication
44 | --------------
45 |
46 | .. toctree::
47 | :maxdepth: 2
48 | :includehidden:
49 | :glob:
50 |
51 | declarations/auth
52 |
53 | Observability
54 | -------------
55 |
56 | .. toctree::
57 | :maxdepth: 2
58 | :includehidden:
59 | :glob:
60 |
61 | declarations/observability
62 |
63 | BIG-IQ Examples
64 | ---------------
65 |
66 | .. toctree::
67 | :maxdepth: 2
68 | :includehidden:
69 | :glob:
70 |
71 | declarations/bigiq-examples
72 |
73 | GSLB Examples
74 | -------------
75 |
76 | .. toctree::
77 | :maxdepth: 2
78 | :includehidden:
79 | :glob:
80 |
81 | declarations/gslb
82 |
83 | Miscellaneous
84 | -------------
85 |
86 | .. toctree::
87 | :maxdepth: 2
88 | :includehidden:
89 | :glob:
90 |
91 | declarations/miscellaneous
92 |
93 |
94 |
95 |
96 | .. |pass| raw:: html
97 |
98 | BIG-IP Secure Password Policy
--------------------------------------------------------------------------------
/docs/images/data-flow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/8ac9ac5e60f2cefb56120d6c370a57b6677916c4/docs/images/data-flow.png
--------------------------------------------------------------------------------
/docs/images/install1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/8ac9ac5e60f2cefb56120d6c370a57b6677916c4/docs/images/install1.png
--------------------------------------------------------------------------------
/docs/images/install2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/8ac9ac5e60f2cefb56120d6c370a57b6677916c4/docs/images/install2.png
--------------------------------------------------------------------------------
/docs/images/install3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/8ac9ac5e60f2cefb56120d6c370a57b6677916c4/docs/images/install3.png
--------------------------------------------------------------------------------
/docs/images/upgrade.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/8ac9ac5e60f2cefb56120d6c370a57b6677916c4/docs/images/upgrade.png
--------------------------------------------------------------------------------
/docs/images/validate-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/8ac9ac5e60f2cefb56120d6c370a57b6677916c4/docs/images/validate-1.png
--------------------------------------------------------------------------------
/docs/images/validate-1a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/8ac9ac5e60f2cefb56120d6c370a57b6677916c4/docs/images/validate-1a.png
--------------------------------------------------------------------------------
/docs/images/validate-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/8ac9ac5e60f2cefb56120d6c370a57b6677916c4/docs/images/validate-2.png
--------------------------------------------------------------------------------
/docs/images/validate-2a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/8ac9ac5e60f2cefb56120d6c370a57b6677916c4/docs/images/validate-2a.png
--------------------------------------------------------------------------------
/docs/images/validate-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/8ac9ac5e60f2cefb56120d6c370a57b6677916c4/docs/images/validate-3.png
--------------------------------------------------------------------------------
/docs/images/validate-4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/8ac9ac5e60f2cefb56120d6c370a57b6677916c4/docs/images/validate-4.png
--------------------------------------------------------------------------------
/docs/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 | F5 Declarative Onboarding
12 |
13 |
14 |
23 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/docs/using-do.rst:
--------------------------------------------------------------------------------
1 | Using BIG-IP Declarative Onboarding
2 | ===================================
3 |
4 | As mentioned in the prerequisites, to transmit BIG-IP Declarative Onboarding declarations you can use a
5 | RESTful API client like Postman or a universal client such as cURL. You can use the HTTP request methods POST and GET with BIG-IP Declarative Onboarding.
6 |
7 | A client may supply a declaration with a POST request, and other request methods (currently only GET) work with the declaration previously
8 | supplied via POST and retained by BIG-IP Declarative Onboarding.
9 |
10 | Using BIG-IP Declarative Onboarding Index
11 | -----------------------------------------
12 |
13 | .. toctree::
14 | :maxdepth: 2
15 | :includehidden:
16 | :glob:
17 |
18 | http-methods
19 | components
20 | authentication
21 | installation
22 | composing-a-declaration
23 | validate
24 | clustering
25 | clustering-managing-devices
26 | big-iq-licensing
27 | do-on-bigiq
28 | json-pointers
29 | troubleshooting
30 |
--------------------------------------------------------------------------------
/examples/applicationDataSize.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.14.0",
3 | "class": "Device",
4 | "async": "true",
5 | "Common": {
6 | "class": "Tenant",
7 | "disk": {
8 | "class": "Disk",
9 | "applicationData": "130985984"
10 | }
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/examples/auditLogging.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.13.0",
3 | "class": "Device",
4 | "async": false,
5 | "Common": {
6 | "class": "Tenant",
7 | "mySys": {
8 | "class": "System",
9 | "tmshAuditLog": true,
10 | "guiAuditLog": true,
11 | "mcpAuditLog": "enable"
12 | }
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/examples/avrStreamingSupport.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.5.0",
3 | "class": "Device",
4 | "label": "Adding support for AVR streaming",
5 | "async": true,
6 | "Common": {
7 | "class": "Tenant",
8 | "hostname": "avr.example.com",
9 | "myLicense": {
10 | "class": "License",
11 | "licenseType": "regKey",
12 | "regKey": "AAAAA-BBBBB-CCCCC-DDDDD-EEEEEEE"
13 | },
14 | "myProvisioning": {
15 | "class": "Provision",
16 | "ltm": "nominal",
17 | "avr": "nominal"
18 | },
19 | "analytics": {
20 | "class": "Analytics",
21 | "debugEnabled": true,
22 | "interval": 60,
23 | "offboxProtocol": "tcp",
24 | "offboxTcpAddresses": [
25 | "192.0.2.1"
26 | ],
27 | "offboxTcpPort": 80,
28 | "offboxEnabled": true
29 | }
30 | }
31 | }
--------------------------------------------------------------------------------
/examples/banner.json:
--------------------------------------------------------------------------------
1 | {
2 | "class": "DO",
3 | "declaration": {
4 | "schemaVersion": "1.11.0",
5 | "class": "Device",
6 | "async": true,
7 | "Common": {
8 | "class": "Tenant",
9 | "myDbVariables": {
10 | "class": "DbVariables",
11 | "ui.advisory.enabled": "true",
12 | "ui.advisory.color": "red",
13 | "ui.advisory.text": "Configuration deployed with AS3. Do not make any change directly on the BIG-IP or those changes may be lost."
14 | }
15 | }
16 | }
17 | }
--------------------------------------------------------------------------------
/examples/clusterWithIpAddresses.json:
--------------------------------------------------------------------------------
1 | {
2 | "class": "Device",
3 | "schemaVersion": "1.0.0",
4 | "async": true,
5 | "label": "BIG-IP declaration for declarative onboarding",
6 | "Common": {
7 | "class": "Tenant",
8 | "hostname": "do.example.1",
9 | "configSync": {
10 | "class": "ConfigSync",
11 | "configsyncIp": "10.0.0.1"
12 | },
13 | "failoverAddress": {
14 | "class": "FailoverUnicast",
15 | "address": "10.0.0.1"
16 | },
17 | "trust": {
18 | "class": "DeviceTrust",
19 | "localUsername": "exampleUsername",
20 | "localPassword": "examplePassword",
21 | "remoteHost": "10.0.0.1",
22 | "remoteUsername": "exampleUsername",
23 | "remotePassword": "examplePassword"
24 | },
25 | "failoverGroup": {
26 | "class": "DeviceGroup",
27 | "type": "sync-failover",
28 | "members": [
29 | "10.0.0.1",
30 | "10.0.0.2"
31 | ],
32 | "owner": "/Common/failoverGroup/members/0",
33 | "autoSync": true,
34 | "saveOnAutoSync": false,
35 | "networkFailover": false,
36 | "fullLoadOnSync": false,
37 | "asmSync": false
38 | }
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/examples/dagGlobals.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.0.0",
3 | "class": "Device",
4 | "async": false,
5 | "Common": {
6 | "class": "Tenant",
7 | "dagGlobals": {
8 | "class": "DagGlobals",
9 | "icmpHash": "ipicmp",
10 | "ipv6PrefixLength": 101,
11 | "roundRobinMode": "local"
12 | }
13 | }
14 | }
--------------------------------------------------------------------------------
/examples/debugTrace.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.15.0",
3 | "class": "Device",
4 | "async": true,
5 | "webhook": "https://example.com/myHook",
6 | "label": "my BIG-IP declaration for declarative onboarding",
7 | "controls": {
8 | "trace": true,
9 | "traceResponse": true
10 | },
11 | "Common": {
12 | "class": "Tenant",
13 | "mySystem": {
14 | "class": "System",
15 | "hostname": "bigip.example.com",
16 | "cliInactivityTimeout": 1200,
17 | "consoleInactivityTimeout": 1200,
18 | "autoPhonehome": false
19 | }
20 | }
21 | }
--------------------------------------------------------------------------------
/examples/deviceCertificate.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.0.0",
3 | "class": "Device",
4 | "Common": {
5 | "class": "Tenant",
6 | "hostname": "bigip.example.com",
7 | "deviceCertificate": {
8 | "class": "DeviceCertificate",
9 | "certificate": {
10 | "base64": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCkY1IEZBS0UgQ0VSVElGSUNBVEUKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ=="
11 | },
12 | "privateKey": {
13 | "base64": "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpGNSBGQUtFIFBSSVZBVEUgS0VZCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0t"
14 | }
15 | }
16 | }
17 | }
--------------------------------------------------------------------------------
/examples/deviceCertificateAndTrustCertificates.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.41.0",
3 | "class": "Device",
4 | "Common": {
5 | "class": "Tenant",
6 | "hostname": "bigip.example.com",
7 | "deviceCertificate": {
8 | "class": "DeviceCertificate",
9 | "certificate": {
10 | "base64": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCkY1IEZBS0UgQ0VSVElGSUNBVEUKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ=="
11 | },
12 | "privateKey": {
13 | "base64": "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpGNSBGQUtFIFBSSVZBVEUgS0VZCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0t"
14 | },
15 | "updateTrustCerts": true
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/examples/dnsResolver.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.0.0",
3 | "class": "Device",
4 | "async": false,
5 | "Common": {
6 | "class": "Tenant",
7 | "myResolver": {
8 | "class": "DNS_Resolver",
9 | "answerDefaultZones": false,
10 | "cacheSize": 5767168,
11 | "randomizeQueryNameCase": true,
12 | "routeDomain": "0",
13 | "forwardZones": [
14 | {
15 | "name": "forward.net",
16 | "nameservers": [
17 | "10.10.10.10:53",
18 | "10.10.10.11:53"
19 | ]
20 | }
21 | ],
22 | "useIpv4": true,
23 | "useIpv6": true,
24 | "useTcp": true,
25 | "useUdp": true
26 | }
27 | }
28 | }
--------------------------------------------------------------------------------
/examples/dryRun.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.23.0",
3 | "class": "Device",
4 | "async": true,
5 | "label": "my BIG-IP declaration for declarative onboarding",
6 | "controls": {
7 | "trace": true,
8 | "traceResponse": true,
9 | "dryRun": true
10 | },
11 | "Common": {
12 | "class": "Tenant",
13 | "mySystem": {
14 | "class": "System",
15 | "hostname": "bigip.example.com",
16 | "cliInactivityTimeout": 1200,
17 | "consoleInactivityTimeout": 1200,
18 | "autoPhonehome": false
19 | }
20 | }
21 | }
--------------------------------------------------------------------------------
/examples/failoverMulticast.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.17.0",
3 | "class": "Device",
4 | "controls": {
5 | "traceResponse": true
6 | },
7 | "label": "Configuring System",
8 | "Common": {
9 | "class": "Tenant",
10 | "failoverMulticastTest": {
11 | "class": "FailoverMulticast",
12 | "interface": "eth0",
13 | "address": "10.2.3.4",
14 | "port": 1029
15 | }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/examples/gslbDataCenter.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.17.0",
3 | "class": "Device",
4 | "async": true,
5 | "Common": {
6 | "class": "Tenant",
7 | "provisioning": {
8 | "class": "Provision",
9 | "gtm": "nominal"
10 | },
11 | "newDataCenter": {
12 | "class": "GSLBDataCenter",
13 | "enabled": true,
14 | "contact": "dataCenterContact",
15 | "location": "dataCenterLocation",
16 | "proberFallback": "outside-datacenter",
17 | "proberPreferred": "pool",
18 | "proberPool": "/Common/proberPool"
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/examples/gslbGlobals.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.0.0",
3 | "class": "Device",
4 | "async": true,
5 | "Common": {
6 | "class": "Tenant",
7 | "provisioning": {
8 | "class": "Provision",
9 | "gtm": "nominal"
10 | },
11 | "gslbGlobals": {
12 | "class": "GSLBGlobals",
13 | "general": {
14 | "synchronizationEnabled": true,
15 | "synchronizationGroupName": "newGroup",
16 | "synchronizationTimeTolerance": 123,
17 | "synchronizationTimeout": 1234,
18 | "synchronizeZoneFiles": true
19 | }
20 | }
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/examples/gslbProberPool.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.19.0",
3 | "class": "Device",
4 | "Common": {
5 | "class": "Tenant",
6 | "gslbDataCenter": {
7 | "class": "GSLBDataCenter"
8 | },
9 | "gslbServer": {
10 | "class": "GSLBServer",
11 | "label": "Example of all GSLB server properties",
12 | "remark": "GSLB server description",
13 | "devices": [
14 | {
15 | "address": "10.10.10.10",
16 | "addressTranslation": "192.0.2.12",
17 | "remark": "GSLB server device description"
18 | }
19 | ],
20 | "dataCenter": "/Common/gslbDataCenter",
21 | "serverType": "bigip",
22 | "enabled": false,
23 | "proberPreferred": "inside-datacenter",
24 | "proberFallback": "any-available",
25 | "bpsLimit": 10,
26 | "bpsLimitEnabled": true,
27 | "ppsLimit": 10,
28 | "ppsLimitEnabled": true,
29 | "connectionsLimit": 10,
30 | "connectionsLimitEnabled": true,
31 | "serviceCheckProbeEnabled": false,
32 | "pathProbeEnabled": false,
33 | "snmpProbeEnabled": false,
34 | "virtualServerDiscoveryMode": "enabled",
35 | "exposeRouteDomainsEnabled": true,
36 | "cpuUsageLimit": 10,
37 | "cpuUsageLimitEnabled": true,
38 | "memoryLimit": 10,
39 | "memoryLimitEnabled": true
40 | },
41 | "gslbProberPool": {
42 | "class": "GSLBProberPool",
43 | "label": "Example of all GSLB prober pool properties",
44 | "remark": "GSLB prober pool description",
45 | "enabled": false,
46 | "lbMode": "round-robin",
47 | "members": [
48 | {
49 | "server": "/Common/gslbServer",
50 | "label": "Example of all GSLB prober pool member properties",
51 | "remark": "GSLB prober pool member description",
52 | "enabled": false
53 | }
54 | ]
55 | }
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/examples/gslbServer.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.19.0",
3 | "class": "Device",
4 | "Common": {
5 | "class": "Tenant",
6 | "gslbDataCenter": {
7 | "class": "GSLBDataCenter"
8 | },
9 | "gslbProberPool": {
10 | "class": "GSLBProberPool"
11 | },
12 | "gslbServer": {
13 | "class": "GSLBServer",
14 | "label": "Example of all GSLB server properties",
15 | "remark": "GSLB server description",
16 | "devices": [
17 | {
18 | "address": "10.10.10.10",
19 | "addressTranslation": "192.0.2.12",
20 | "remark": "GSLB server device description"
21 | }
22 | ],
23 | "dataCenter": "/Common/gslbDataCenter",
24 | "serverType": "generic-host",
25 | "enabled": false,
26 | "proberPreferred": "pool",
27 | "proberFallback": "any-available",
28 | "proberPool": "/Common/gslbProberPool",
29 | "bpsLimit": 10,
30 | "bpsLimitEnabled": true,
31 | "ppsLimit": 10,
32 | "ppsLimitEnabled": true,
33 | "connectionsLimit": 10,
34 | "connectionsLimitEnabled": true,
35 | "serviceCheckProbeEnabled": false,
36 | "pathProbeEnabled": false,
37 | "snmpProbeEnabled": false,
38 | "virtualServerDiscoveryMode": "enabled",
39 | "exposeRouteDomainsEnabled": true,
40 | "cpuUsageLimit": 10,
41 | "cpuUsageLimitEnabled": true,
42 | "memoryLimit": 10,
43 | "memoryLimitEnabled": true,
44 | "virtualServers": [
45 | {
46 | "address": "10.0.20.1"
47 | },
48 | {
49 | "name": "virtualServer",
50 | "label": "Example of all GSLB server virtual server properties",
51 | "remark": "GSLB server virtual server description",
52 | "enabled": false,
53 | "address": "a989:1c34:009c:0000:0000:b099:c1c7:8bfe",
54 | "port": 8080,
55 | "addressTranslation": "1:0:1:0:0:0:0:0",
56 | "addressTranslationPort": 80,
57 | "monitors": [
58 | "/Common/tcp",
59 | "/Common/http"
60 | ]
61 | }
62 | ]
63 | }
64 | }
65 | }
66 |
--------------------------------------------------------------------------------
/examples/httpd.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.8.0",
3 | "class": "Device",
4 | "async": false,
5 | "Common": {
6 | "class": "Tenant",
7 | "httpdSettings": {
8 | "class": "HTTPD",
9 | "allow": [
10 | "10.10.0.0/24",
11 | "10.11.1.2"
12 | ],
13 | "authPamIdleTimeout": 86400,
14 | "maxClients": 10,
15 | "sslCiphersuite": [
16 | "ECDHE-RSA-AES128-GCM-SHA256",
17 | "ECDHE-RSA-AES256-GCM-SHA384",
18 | "ECDHE-RSA-AES128-SHA",
19 | "ECDHE-RSA-AES256-SHA",
20 | "ECDHE-RSA-AES128-SHA256",
21 | "ECDHE-RSA-AES256-SHA384",
22 | "ECDHE-ECDSA-AES128-GCM-SHA256",
23 | "ECDHE-ECDSA-AES256-GCM-SHA384",
24 | "ECDHE-ECDSA-AES128-SHA",
25 | "ECDHE-ECDSA-AES256-SHA",
26 | "ECDHE-ECDSA-AES128-SHA256",
27 | "ECDHE-ECDSA-AES256-SHA384",
28 | "AES128-GCM-SHA256",
29 | "AES256-GCM-SHA384",
30 | "AES128-SHA",
31 | "AES256-SHA",
32 | "AES128-SHA256",
33 | "!ADH",
34 | "!MEDIUM",
35 | "!EXPORT",
36 | "!eNULL"
37 | ],
38 | "sslProtocol": "all -SSLv2 -SSLv3 -TLSv1"
39 | }
40 | }
41 | }
--------------------------------------------------------------------------------
/examples/ldapSslCaCertUrlRef.json:
--------------------------------------------------------------------------------
1 | {
2 | "class": "Device",
3 | "schemaVersion": "1.38.0",
4 | "async": true,
5 | "Common": {
6 | "class": "Tenant",
7 | "test_item-foo.2345678901234567890123456789012345": {
8 | "class": "Authentication",
9 | "enabledSourceType": "ldap",
10 | "ldap": {
11 | "bindTimeout": 40,
12 | "checkBindPassword": true,
13 | "checkRemoteRole": true,
14 | "idleTimeout": 20,
15 | "ignoreAuthInfoUnavailable": true,
16 | "ignoreUnknownUser": true,
17 | "port": 654,
18 | "searchScope": "base",
19 | "searchTimeout": 687,
20 | "servers": [
21 | "a.host.com",
22 | "192.0.2.10",
23 | "FE80:0000:0000:0000:0202:B3FF:FE1E:8329"
24 | ],
25 | "ssl": "enabled",
26 | "sslCaCert": {
27 | "certificate": {
28 | "url": "https://exampleUrl/cert"
29 | }
30 | },
31 | "sslCheckPeer": true,
32 | "sslCiphers": [
33 | "ECDHE-RSA-AES128-CBC-SHA",
34 | "ECDHE-RSA-AES128-SHA256"
35 | ],
36 | "userTemplate": "uid=%s,ou=people,dc=siterequest,dc=com",
37 | "version": 2
38 | }
39 | }
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/examples/licenseViaBigIqPoolAuthProvider.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.18.0",
3 | "class": "Device",
4 | "async": true,
5 | "label": "License BIG-IP via BIG-IQ using an external auth provider",
6 | "Common": {
7 | "class": "Tenant",
8 | "hostname": "bigip.example.com",
9 | "myLicense": {
10 | "class": "License",
11 | "licenseType": "licensePool",
12 | "bigIqHost": "10.0.1.200",
13 | "bigIqUsername": "myLdapUser",
14 | "bigIqPassword": "myLdapPassword",
15 | "bigIqAuthProvider": "myLdapAuthProvider",
16 | "licensePool": "myUtilityLicense",
17 | "skuKeyword1": "key1",
18 | "skuKeyword2": "key2",
19 | "unitOfMeasure": "hourly",
20 | "reachable": true,
21 | "bigIpUsername": "admin",
22 | "bigIpPassword": "asdfjkl"
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/examples/licenseViaBigIqPoolUnreachableHEXHypervisor.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.22.0",
3 | "class": "Device",
4 | "async": true,
5 | "label": "License BIG-IP via BIG-IQ purchased pool license when BIG-IP is not reachable from BIG-IQ",
6 | "Common": {
7 | "class": "Tenant",
8 | "hostname": "bigip.example.com",
9 | "myLicense": {
10 | "class": "License",
11 | "licenseType": "licensePool",
12 | "bigIqHost": "10.0.1.200",
13 | "bigIqUsername": "admin",
14 | "bigIqPassword": "myPassword1",
15 | "licensePool": "myPurchasedPool",
16 | "regKey": "ABCDE-FGHIJ-KLMNO-PQRST-UVWXYZZ",
17 | "reachable": false,
18 | "hypervisor": "0x01000013",
19 | "tenant": "Optional custom descriptor"
20 | }
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/examples/localOnlyRoutes.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.15.0",
3 | "class": "Device",
4 | "async": true,
5 | "Common": {
6 | "class": "Tenant",
7 | "hostname": "bigip.example.com",
8 | "newVlan": {
9 | "class": "VLAN",
10 | "tag": 100,
11 | "interfaces": [
12 | {
13 | "name": "1.1",
14 | "tagged": true
15 | }
16 | ]
17 | },
18 | "localRoute": {
19 | "class": "Route",
20 | "target": "newVlan",
21 | "network": "10.1.0.244/32",
22 | "localOnly": true
23 | },
24 | "newSelfIp": {
25 | "class": "SelfIp",
26 | "address": "10.1.0.20/32",
27 | "vlan": "newVlan"
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/examples/macMasquerade.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.13.0",
3 | "class": "Device",
4 | "async": false,
5 | "Common": {
6 | "class": "Tenant",
7 | "myMac": {
8 | "class": "MAC_Masquerade",
9 | "source": {
10 | "interface": "1.1"
11 | },
12 | "trafficGroup": "traffic-group-1"
13 | }
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/examples/managementIp.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.23.0",
3 | "class": "Device",
4 | "async": true,
5 | "Common": {
6 | "class": "Tenant",
7 | "hostname": "bigip.example.com",
8 | "myManagementIp": {
9 | "class": "ManagementIp",
10 | "address": "10.10.10.1/18",
11 | "remark": "this is my management ip"
12 | }
13 | }
14 | }
--------------------------------------------------------------------------------
/examples/managementIpFirewalWithAfmProvisioned.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.30.0",
3 | "class": "Device",
4 | "async": true,
5 | "Common": {
6 | "class": "Tenant",
7 | "myProvisioning": {
8 | "class": "Provision",
9 | "ltm": "nominal",
10 | "afm": "nominal"
11 | },
12 | "firewallAddressList1": {
13 | "class": "FirewallAddressList",
14 | "addresses": ["192.0.2.10", "233.252.0.0/24"]
15 | },
16 | "firewallPortList1": {
17 | "class": "FirewallPortList",
18 | "ports": [8080, 8888]
19 | },
20 | "firewallPortList2": {
21 | "class": "FirewallPortList",
22 | "ports": ["8123", "8234", "8300-8350"]
23 | },
24 | "managementIpFirewall": {
25 | "class": "ManagementIpFirewall",
26 | "label": "Example of all management IP firewall properties",
27 | "remark": "management IP firewall description",
28 | "rules": [
29 | {
30 | "name": "firewallRule",
31 | "label": "Example of all firewall rule properties",
32 | "remark": "firewall rule description",
33 | "action": "reject",
34 | "protocol": "tcp",
35 | "loggingEnabled": true,
36 | "source": {
37 | "addressLists": [
38 | "/Common/firewallAddressList1"
39 | ],
40 | "portLists": [
41 | "/Common/firewallPortList1",
42 | "/Common/firewallPortList2"
43 | ]
44 | },
45 | "destination": {
46 | "addressLists": [
47 | "/Common/firewallAddressList1"
48 | ],
49 | "portLists": [
50 | "/Common/firewallPortList1",
51 | "/Common/firewallPortList2"
52 | ]
53 | }
54 | }
55 | ]
56 | }
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/examples/managementIpFirewall.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.30.0",
3 | "class": "Device",
4 | "async": true,
5 | "Common": {
6 | "class": "Tenant",
7 | "netAddressList1": {
8 | "class": "NetAddressList",
9 | "addresses": ["192.0.2.10", "233.252.0.0/24"]
10 | },
11 | "netPortList1": {
12 | "class": "NetPortList",
13 | "ports": [8080, 8888]
14 | },
15 | "netPortList2": {
16 | "class": "NetPortList",
17 | "ports": ["8123", "8234", "8300-8350"]
18 | },
19 | "managementIpFirewall": {
20 | "class": "ManagementIpFirewall",
21 | "label": "Example of all management IP firewall properties",
22 | "remark": "management IP firewall description",
23 | "rules": [
24 | {
25 | "name": "firewallRule",
26 | "label": "Example of all firewall rule properties",
27 | "remark": "firewall rule description",
28 | "action": "reject",
29 | "protocol": "tcp",
30 | "loggingEnabled": true,
31 | "source": {
32 | "addressLists": [
33 | "/Common/netAddressList1"
34 | ],
35 | "portLists": [
36 | "/Common/netPortList1",
37 | "/Common/netPortList2"
38 | ]
39 | },
40 | "destination": {
41 | "addressLists": [
42 | "/Common/netAddressList1"
43 | ],
44 | "portLists": [
45 | "/Common/netPortList1",
46 | "/Common/netPortList2"
47 | ]
48 | }
49 | }
50 | ]
51 | }
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/examples/managementRouteInterface.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.23.0",
3 | "class": "Device",
4 | "async": true,
5 | "Common": {
6 | "class": "Tenant",
7 | "hostname": "bigip.example.com",
8 | "myManagementRoute": {
9 | "class": "ManagementRoute",
10 | "network": "10.10.10.1/32",
11 | "type": "interface"
12 | }
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/examples/mgmtDhcpEnabled.json:
--------------------------------------------------------------------------------
1 | {
2 | "async": true,
3 | "schemaVersion": "1.28.0",
4 | "class": "Device",
5 | "Common": {
6 | "class": "Tenant",
7 | "system": {
8 | "class": "System",
9 | "mgmtDhcpEnabled": true,
10 | "preserveOrigDhcpRoutes": true
11 | }
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/examples/mirrorIp.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.16.0",
3 | "class": "Device",
4 | "async": true,
5 | "Common": {
6 | "class": "Tenant",
7 | "hostname": "bigip.example.com",
8 | "newVlan": {
9 | "class": "VLAN",
10 | "tag": 100,
11 | "interfaces": [
12 | {
13 | "name": "1.1",
14 | "tagged": true
15 | }
16 | ]
17 | },
18 | "newSelfIp": {
19 | "class": "SelfIp",
20 | "address": "10.1.0.20/0",
21 | "vlan": "newVlan"
22 | },
23 | "myMirror": {
24 | "class": "MirrorIp",
25 | "primaryIp": "10.1.0.20",
26 | "secondaryIp": "any6"
27 | }
28 | }
29 | }
--------------------------------------------------------------------------------
/examples/multipleFailoverUnicasts.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.15.0",
3 | "class": "Device",
4 | "label": "Configuring System",
5 | "Common": {
6 | "class": "Tenant",
7 | "failoverUnicastMgmt": {
8 | "class": "FailoverUnicast",
9 | "addressPorts": [
10 | {
11 | "address": "10.0.0.0",
12 | "port": 356
13 | },
14 | {
15 | "address": "10.1.1.0"
16 | }
17 | ]
18 | },
19 | "external": {
20 | "class": "VLAN",
21 | "tag": 4094,
22 | "mtu": 1500,
23 | "interfaces": [
24 | {
25 | "name": "1.1",
26 | "tagged": true
27 | }
28 | ],
29 | "cmpHash": "src-ip"
30 | },
31 | "external-self": {
32 | "class": "SelfIp",
33 | "address": "10.0.0.0/24",
34 | "vlan": "external",
35 | "allowService": "none",
36 | "trafficGroup": "traffic-group-local-only"
37 | },
38 | "external-self2": {
39 | "class": "SelfIp",
40 | "address": "10.1.1.0/24",
41 | "vlan": "external",
42 | "allowService": "none",
43 | "trafficGroup": "traffic-group-local-only"
44 | }
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/examples/onboardViaBigIqAws.json:
--------------------------------------------------------------------------------
1 | {
2 | "class": "DO",
3 | "declaration": {
4 | "schemaVersion": "1.5.0",
5 | "class": "Device",
6 | "async": true,
7 | "Common": {
8 | "class": "Tenant",
9 | "myLicense": {
10 | "class": "License",
11 | "licenseType": "regKey",
12 | "regKey": "AAAAA-BBBBB-CCCCC-DDDDD-EEEEEEE"
13 | },
14 | "myProvision": {
15 | "class": "Provision",
16 | "ltm": "nominal"
17 | },
18 | "myNtp": {
19 | "class": "NTP",
20 | "servers": [
21 | "time.nist.gov"
22 | ],
23 | "timezone": "UTC"
24 | },
25 | "admin": {
26 | "class": "User",
27 | "userType": "regular",
28 | "partitionAccess": {
29 | "all-partitions": {
30 | "role": "admin"
31 | }
32 | },
33 | "shell": "tmsh",
34 | "password": "adminpass1word"
35 | },
36 | "root": {
37 | "class": "User",
38 | "userType": "root",
39 | "newPassword": "rootpass1word",
40 | "oldPassword": "adminpass1word"
41 | }
42 | }
43 | },
44 | "targetHost": "192.0.2.10",
45 | "targetUsername": "admin",
46 | "targetSshKey": {
47 | "path": "/var/ssh/restnoded/privatessh.key"
48 | },
49 | "bigIqSettings": {
50 | "failImportOnConflict": false,
51 | "conflictPolicy": "USE_BIGIQ",
52 | "deviceConflictPolicy": "USE_BIGIP",
53 | "versionedConflictPolicy": "KEEP_VERSION",
54 | "statsConfig": {
55 | "enabled": true,
56 | "zone": "default"
57 | },
58 | "snapshotWorkingConfig": false
59 | }
60 | }
--------------------------------------------------------------------------------
/examples/passwordPolicy.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.33.0",
3 | "class": "Device",
4 | "async": true,
5 | "Common": {
6 | "class": "Tenant",
7 | "myPasswordPolicy": {
8 | "class": "PasswordPolicy",
9 | "expirationWarningDays": 1,
10 | "minLength": 15,
11 | "minDurationDays": 14,
12 | "maxDurationDays": 60,
13 | "lockoutDurationSeconds": 120,
14 | "maxLoginFailures": 10,
15 | "passwordMemory": 8,
16 | "policyEnforcementEnabled": true,
17 | "requiredUppercase": 2,
18 | "requiredLowercase": 3,
19 | "requiredNumeric": 4,
20 | "requiredSpecial": 5
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/examples/preserveOrigDhcpRoutes.json:
--------------------------------------------------------------------------------
1 | {
2 | "class": "Device",
3 | "async": true,
4 | "schemaVersion": "1.23.0",
5 | "Common": {
6 | "class": "Tenant",
7 | "system": {
8 | "class": "System",
9 | "preserveOrigDhcpRoutes": true
10 | },
11 | "newManagementRoute": {
12 | "class": "ManagementRoute",
13 | "network": "192.0.2.4",
14 | "gw": "192.0.2.1"
15 | }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/examples/publicKeys.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.0.0",
3 | "class": "Device",
4 | "async": true,
5 | "Common": {
6 | "class": "Tenant",
7 | "hostname": "bigip.example.com",
8 | "root": {
9 | "class": "User",
10 | "userType": "root",
11 | "oldPassword": "examplePass",
12 | "newPassword": "examplePass",
13 | "keys": [
14 | "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCwHJLJY+/U/ioAAAADAQABAAACAQCwHJLJY+z0Rb85in7Ean6JS2J9dzo1nSssm7ZyQvGgc1e7EVtztbVpHThsvw92+1hx9wlSogXN6Co5zrtqlN8/mvlQkRRQ+sp2To8PcSMeEVI+TqBOg6BWbwwNQLz9/eUJq2o4vBfSpsn7GSDIf6C3F9EahRPGCR/z0kw5GZob3Q== test2",
15 | "ssh-rsa AAAAB3NzaC1yc2EAu2Gr14xRiVLnG8KxNp2fO1/U/ioAz0Rb85in7Ean6JS2J9dzo1nSssm7ZyQvGgc1e7EVtztbVpHThsvw92+/mvlQkRRQ+sp2To8PcSMeEVI+TqBOg6BWbwwNQLzu2Gr14xRiVLnG8KxNp2fO19/eUJq2o4vBfSpsn7GSDIf6C3F9EahRPGCR/z0kw5GZob3Q== test"
16 | ]
17 | },
18 | "guestUser": {
19 | "class": "User",
20 | "userType": "regular",
21 | "password": "guestNewPass1",
22 | "partitionAccess": {
23 | "Common": {
24 | "role": "guest"
25 | }
26 | },
27 | "keys": [
28 | "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCwHJLJY+/U/ioAAAADAQABAAACAQCwHJLJY+z0Rb85in7Ean6JS2J9dzo1nSssm7ZyQvGgc1e7EVtztbVpHThsvw92+1hx9wlSogXN6Co5zrtqlN8/mvlQkRRQ+sp2To8PcSMeEVI+TqBOg6BWbwwNQLz9/eUJq2o4vBfSpsn7GSDIf6C3F9EahRPGCR/z0kw5GZob3Q== test2",
29 | "ssh-rsa AAAAB3NzaC1yc2EAu2Gr14xRiVLnG8KxNp2fO1/U/ioAz0Rb85in7Ean6JS2J9dzo1nSssm7ZyQvGgc1e7EVtztbVpHThsvw92+/mvlQkRRQ+sp2To8PcSMeEVI+TqBOg6BWbwwNQLzu2Gr14xRiVLnG8KxNp2fO19/eUJq2o4vBfSpsn7GSDIf6C3F9EahRPGCR/z0kw5GZob3Q== test"
30 | ]
31 | }
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/examples/reLicenseBigIp.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.38.0",
3 | "class": "Device",
4 | "async": true,
5 | "label": "Re-license BIG-IP while revoking the current license",
6 | "Common": {
7 | "class": "Tenant",
8 | "hostname": "bigip.example.com",
9 | "myLicense": {
10 | "class": "License",
11 | "licenseType": "regKey",
12 | "regKey": "ABCDE-FGHIJ-KLMNO-PQRST-UVWXYZZ",
13 | "revokeCurrent": true
14 | }
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/examples/remoteRoleVariableFields.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.17.0",
3 | "class": "Device",
4 | "async": true,
5 | "Common": {
6 | "class": "Tenant",
7 | "remoteAuthRole": {
8 | "class": "RemoteAuthRole",
9 | "attribute": "F5-LTM-User-Info-1=rad-admins",
10 | "console": "%F5-LTM-User-Shell",
11 | "lineOrder": 1001,
12 | "remoteAccess": true,
13 | "role": "%F5-LTM-User-Role",
14 | "userPartition": "%F5-LTM-User-Partition"
15 | }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/examples/remoteRoles.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.7.0",
3 | "class": "Device",
4 | "async": true,
5 | "Common": {
6 | "class": "Tenant",
7 | "TEAM1": {
8 | "class": "RemoteAuthRole",
9 | "attribute": "memberOF=CN=Team-1,add-ldap-path",
10 | "console": "tmsh",
11 | "lineOrder": 925,
12 | "role": "admin",
13 | "remoteAccess": false,
14 | "userPartition": "all"
15 | },
16 | "TEAM2": {
17 | "class": "RemoteAuthRole",
18 | "attribute": "memberOF=CN=Team-2,add-ldap-path",
19 | "console": "tmsh",
20 | "lineOrder": 940,
21 | "role": "guest",
22 | "remoteAccess": true,
23 | "userPartition": "all"
24 | }
25 | }
26 | }
--------------------------------------------------------------------------------
/examples/restjavad.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.0.0",
3 | "class": "Device",
4 | "async": "true",
5 | "Common": {
6 | "class": "Tenant",
7 | "dbvars": {
8 | "class": "DbVariables",
9 | "provision.extramb": 1000,
10 | "restjavad.useextramb": true
11 | }
12 | }
13 | }
--------------------------------------------------------------------------------
/examples/routeDomains.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.0.0",
3 | "class": "Device",
4 | "async": true,
5 | "Common": {
6 | "class": "Tenant",
7 | "hostname": "bigip.example.com",
8 | "newVlan": {
9 | "class": "VLAN",
10 | "tag": 100,
11 | "interfaces": [
12 | {
13 | "name": "1.1",
14 | "tagged": true
15 | }
16 | ]
17 | },
18 | "Route": {
19 | "class": "Route",
20 | "gw": "10.1.0.1%100",
21 | "network": "192.168.0.0%100/16"
22 | },
23 | "newSelfIp": {
24 | "class": "SelfIp",
25 | "address": "10.1.0.20%100/0",
26 | "vlan": "newVlan"
27 | },
28 | "theRouteDomain": {
29 | "class": "RouteDomain",
30 | "id": 100,
31 | "connectionLimit": 5432991,
32 | "flowEvictionPolicy": "default-eviction-policy",
33 | "ipIntelligencePolicy": "ip-intelligence",
34 | "strict": false,
35 | "routingProtocols": [
36 | "BGP"
37 | ],
38 | "vlans": [
39 | "newVlan"
40 | ]
41 | },
42 | "AnotherRouteDomain": {
43 | "class": "RouteDomain",
44 | "id": 101,
45 | "parent": "theRouteDomain",
46 | "strict": false
47 | }
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/examples/routeInterface.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.14.0",
3 | "class": "Device",
4 | "async": true,
5 | "Common": {
6 | "class": "Tenant",
7 | "hostname": "bigip.example.com",
8 | "myRoute": {
9 | "class": "Route",
10 | "network": "default",
11 | "target": "external"
12 | }
13 | }
14 | }
--------------------------------------------------------------------------------
/examples/routingAccessList.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.24.0",
3 | "class": "Device",
4 | "async": true,
5 | "Common": {
6 | "class": "Tenant",
7 | "hostname": "bigip.example.com",
8 | "exampleRoutingAccessList1": {
9 | "class": "RoutingAccessList",
10 | "entries": [
11 | {
12 | "name": "11",
13 | "action": "permit",
14 | "destination": "192.0.2.0/25",
15 | "exactMatchEnabled": false,
16 | "source": "192.0.2.80/25"
17 | },
18 | {
19 | "name": "22",
20 | "action": "deny",
21 | "destination": "192.0.2.10",
22 | "exactMatchEnabled": false,
23 | "source": "192.0.2.11"
24 | }
25 | ]
26 | },
27 | "exampleRoutingAccessList2": {
28 | "class": "RoutingAccessList",
29 | "entries": [
30 | {
31 | "name": "33",
32 | "action": "permit",
33 | "exactMatchEnabled": true,
34 | "source": "2001:db8::/65"
35 | },
36 | {
37 | "name": 44,
38 | "action": "permit",
39 | "source": "2001:db9::/65"
40 | }
41 | ]
42 | }
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/examples/routingAsPath.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.16.0",
3 | "class": "Device",
4 | "async": true,
5 | "Common": {
6 | "class": "Tenant",
7 | "hostname": "bigip.example.com",
8 | "exampleRoutingAsPath": {
9 | "class": "RoutingAsPath",
10 | "entries": [
11 | {
12 | "name": 10,
13 | "regex": "^165001 *"
14 | }
15 | ]
16 | },
17 | "exampleMultipleRoutingAsPath": {
18 | "class": "RoutingAsPath",
19 | "entries": [
20 | {
21 | "name": 10,
22 | "regex": "^1$"
23 | },
24 | {
25 | "name": 20,
26 | "regex": "^165005$"
27 | }
28 | ]
29 | }
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/examples/routingPrefixList.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.40.0",
3 | "class": "Device",
4 | "async": true,
5 | "Common": {
6 | "class": "Tenant",
7 | "hostname": "bigip.example.com",
8 | "exampleVlan": {
9 | "class": "VLAN",
10 | "tag": 100,
11 | "interfaces": [
12 | {
13 | "name": "1.1",
14 | "tagged": true
15 | }
16 | ]
17 | },
18 | "exampleRouteDomain": {
19 | "class": "RouteDomain",
20 | "id": 102,
21 | "connectionLimit": 5432991,
22 | "flowEvictionPolicy": "default-eviction-policy",
23 | "strict": false,
24 | "vlans": [
25 | "exampleVlan"
26 | ]
27 | },
28 | "exampleRoutingPrefixList1": {
29 | "class": "RoutingPrefixList",
30 | "entries": [
31 | {
32 | "name": 10,
33 | "action": "permit",
34 | "prefix": "2001:db8::/127",
35 | "prefixLengthRange": "128"
36 | },
37 | {
38 | "name": 15,
39 | "action": "deny",
40 | "prefix": "2001:db8::/64",
41 | "prefixLengthRange": "80:"
42 | }
43 | ],
44 | "routeDomain": "0"
45 | },
46 | "exampleRoutingPrefixList2": {
47 | "class": "RoutingPrefixList",
48 | "entries": [
49 | {
50 | "name": 20,
51 | "action": "permit",
52 | "prefix": "192.0.2.0/24",
53 | "prefixLengthRange": ":30"
54 | },
55 | {
56 | "name": 30,
57 | "action": "deny",
58 | "prefix": "192.0.2.1/24",
59 | "prefixLengthRange": "25:27"
60 | }
61 | ],
62 | "routeDomain": "exampleRouteDomain"
63 | }
64 | }
65 | }
66 |
--------------------------------------------------------------------------------
/examples/securityAnalytics.json:
--------------------------------------------------------------------------------
1 | {
2 | "async": true,
3 | "schemaVersion": "1.37.0",
4 | "class": "Device",
5 | "Common": {
6 | "class": "Tenant",
7 | "currentSecurityAnalytics": {
8 | "class": "SecurityAnalytics",
9 | "aclRules": {
10 | "collectClientIpEnabled": true,
11 | "collectClientPortEnabled": false,
12 | "collectDestinationIpEnabled": true,
13 | "collectDestinationPortEnabled": true,
14 | "collectServerSideStatsEnabled": false
15 | },
16 | "collectAllDosStatsEnabled": false,
17 | "collectedStatsExternalLoggingEnabled": false,
18 | "collectedStatsInternalLoggingEnabled": false,
19 | "dns": {
20 | "collectClientIpEnabled": true,
21 | "collectDestinationIpEnabled": true
22 | },
23 | "collectDnsStatsEnabled": true,
24 | "dosL2L4": {
25 | "collectClientIpEnabled": true,
26 | "collectDestinationGeoEnabled": true
27 | },
28 | "collectDosL3StatsEnabled": true,
29 | "collectFirewallAclStatsEnabled": true,
30 | "collectFirewallDropsStatsEnabled": true,
31 | "collectIpReputationStatsEnabled": true,
32 | "l3L4Errors": {
33 | "collectClientIpEnabled": true,
34 | "collectDestinationIpEnabled": true
35 | },
36 | "collectSipStatsEnabled": true,
37 | "collectStaleRulesEnabled": true,
38 | "publisher": "none",
39 | "smtpConfig": "none"
40 | }
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/examples/securityWaf.json:
--------------------------------------------------------------------------------
1 | {
2 | "async": true,
3 | "schemaVersion": "1.40.0",
4 | "class": "Device",
5 | "Common": {
6 | "class": "Tenant",
7 | "securityWaf": {
8 | "class": "SecurityWaf",
9 | "antiVirusProtection": {
10 | "guaranteeEnforcementEnabled": true,
11 | "hostname": "test.hostname",
12 | "port": 123
13 | },
14 | "advancedSettings": [
15 | {
16 | "name": "max_json_policy_size",
17 | "value": 5000
18 | },
19 | {
20 | "name": "send_content_events",
21 | "value": 1
22 | },
23 | {
24 | "name": "WhiteHatIP1",
25 | "value": "192.0.2.10/8"
26 | }
27 | ]
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/examples/skipDeviceCertificates.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.15.0",
3 | "class": "Device",
4 | "Common": {
5 | "class": "Tenant",
6 | "hostname": "bigip.example.com",
7 | "deviceCertificate": {
8 | "class": "DeviceCertificate",
9 | "skipDeviceCertificates": true,
10 | "certificate": {
11 | "base64": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCkY1IEZBS0UgQ0VSVElGSUNBVEUKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ=="
12 | },
13 | "privateKey": {
14 | "base64": "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpGNSBGQUtFIFBSSVZBVEUgS0VZCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0t"
15 | }
16 | }
17 | }
18 | }
--------------------------------------------------------------------------------
/examples/sshd.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.8.0",
3 | "class": "Device",
4 | "async": false,
5 | "label": "Configuring SSHD settings",
6 | "Common": {
7 | "class": "Tenant",
8 | "sshSettings": {
9 | "class": "SSHD",
10 | "allow": [
11 | "10.0.0.1",
12 | "10.0.1.0/28",
13 | "192.168.1.*"
14 | ],
15 | "banner": "Banner to display",
16 | "inactivityTimeout": 123,
17 | "ciphers": [
18 | "aes128-ctr",
19 | "aes192-ctr",
20 | "aes256-ctr"
21 | ],
22 | "loginGraceTime": 100,
23 | "MACS": [
24 | "hmac-sha1",
25 | "hmac-ripemd160",
26 | "hmac-md5"
27 | ],
28 | "kexAlgorithms": [
29 | "ecdh-sha2-nistp256",
30 | "ecdh-sha2-nistp384",
31 | "ecdh-sha2-nistp521"
32 | ],
33 | "maxAuthTries": 10,
34 | "maxStartups": "5",
35 | "protocol": 1
36 | }
37 | }
38 | }
--------------------------------------------------------------------------------
/examples/syslogDestination.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.7.0",
3 | "class": "Device",
4 | "async": true,
5 | "Common": {
6 | "class": "Tenant",
7 | "LocalDCSyslog": {
8 | "class": "SyslogRemoteServer",
9 | "host": "local-ip",
10 | "localIp": "172.28.68.42",
11 | "remotePort": 514
12 | },
13 | "DRDCSyslog": {
14 | "class": "SyslogRemoteServer",
15 | "host": "dr-ip",
16 | "localIp": "172.28.68.42",
17 | "remotePort": 514
18 | }
19 | }
20 | }
--------------------------------------------------------------------------------
/examples/system.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.13.0",
3 | "class": "Device",
4 | "label": "Configuring System",
5 | "async": true,
6 | "Common": {
7 | "class": "Tenant",
8 | "mySystem": {
9 | "class": "System",
10 | "hostname": "my.bigip.com",
11 | "cliInactivityTimeout": 1200,
12 | "consoleInactivityTimeout": 1200,
13 | "autoCheck": false,
14 | "autoPhonehome": true,
15 | "guiSecurityBanner": true,
16 | "guiSecurityBannerText": "Authorized access only\n\nLogin on the left",
17 | "usernamePrompt": "Your username:",
18 | "passwordPrompt": "Your password:"
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/examples/tcpForwardTunnel.json:
--------------------------------------------------------------------------------
1 | {
2 | "class": "Device",
3 | "schemaVersion": "1.14.0",
4 | "async": true,
5 | "Common": {
6 | "class": "Tenant",
7 | "newTcpForwardTunnel": {
8 | "class": "Tunnel",
9 | "tunnelType": "tcp-forward",
10 | "mtu": 2000,
11 | "usePmtu": false,
12 | "typeOfService": 123,
13 | "autoLastHop": "default"
14 | }
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/examples/trafficControl.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.7.0",
3 | "class": "Device",
4 | "label": "Configuring traffic control",
5 | "async": true,
6 | "Common": {
7 | "class": "Tenant",
8 | "myglobals": {
9 | "class": "TrafficControl",
10 | "acceptIpOptions": true,
11 | "acceptIpSourceRoute": true,
12 | "allowIpSourceRoute": true,
13 | "continueMatching": true,
14 | "maxIcmpRate": 867,
15 | "maxPortFindLinear": 867,
16 | "maxPortFindRandom": 867,
17 | "maxRejectRate": 867,
18 | "maxRejectRateTimeout": 200,
19 | "minPathMtu": 867,
20 | "pathMtuDiscovery": false,
21 | "portFindThresholdWarning": false,
22 | "portFindThresholdTrigger": 10,
23 | "portFindThresholdTimeout": 200,
24 | "rejectUnmatched": false
25 | }
26 | }
27 | }
--------------------------------------------------------------------------------
/examples/trafficGroups.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.14.0",
3 | "class": "Device",
4 | "label": "Configuring System",
5 | "async": false,
6 | "Common": {
7 | "class": "Tenant",
8 | "hostname": "do.example.com",
9 | "failoverGroup": {
10 | "class": "DeviceGroup",
11 | "type": "sync-failover",
12 | "members": [
13 | "do.example.com"
14 | ],
15 | "owner": "do.example.com",
16 | "autoSync": true,
17 | "saveOnAutoSync": false,
18 | "networkFailover": true,
19 | "fullLoadOnSync": false,
20 | "asmSync": false
21 | },
22 | "testTrafficGroup": {
23 | "class": "TrafficGroup",
24 | "autoFailbackEnabled": false,
25 | "autoFailbackTime": 50,
26 | "failoverMethod": "ha-order",
27 | "haLoadFactor": 1,
28 | "haOrder": [
29 | "do.example.com"
30 | ]
31 | }
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/examples/user.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.0.0",
3 | "class": "Device",
4 | "async": true,
5 | "webhook": "https://example.com/myHook",
6 | "label": "user class",
7 | "Common": {
8 | "class": "Tenant",
9 | "root": {
10 | "class": "User",
11 | "userType": "root",
12 | "oldPassword": "foo",
13 | "newPassword": "bar"
14 | },
15 | "admin": {
16 | "class": "User",
17 | "userType": "regular",
18 | "password": "asdfjkl",
19 | "shell": "bash"
20 | },
21 | "guestUser": {
22 | "class": "User",
23 | "userType": "regular",
24 | "password": "foobar",
25 | "partitionAccess": {
26 | "Common": {
27 | "role": "guest"
28 | }
29 | }
30 | },
31 | "anotherUser": {
32 | "class": "User",
33 | "userType": "regular",
34 | "password": "foobar",
35 | "shell": "none",
36 | "partitionAccess": {
37 | "all-partitions": {
38 | "role": "guest"
39 | }
40 | },
41 | "forceInitialPasswordChange": false
42 | }
43 | }
44 | }
--------------------------------------------------------------------------------
/examples/userAgent.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.12.0",
3 | "class": "Device",
4 | "label": "Configuring System",
5 | "async": true,
6 | "controls": {
7 | "class": "Controls",
8 | "userAgent": "BIG-IQ/7.1 Configured by API"
9 | },
10 | "Common": {
11 | "class": "Tenant",
12 | "mySystem": {
13 | "class": "System",
14 | "hostname": "my.bigip.com",
15 | "cliInactivityTimeout": 1200,
16 | "consoleInactivityTimeout": 1200,
17 | "autoPhonehome": true
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/examples/vlanAutoLastHop.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.22.0",
3 | "class": "Device",
4 | "async": true,
5 | "Common": {
6 | "class": "Tenant",
7 | "external": {
8 | "class": "VLAN",
9 | "tag": 4094,
10 | "mtu": 1500,
11 | "interfaces": [
12 | {
13 | "name": "1.1",
14 | "tagged": true
15 | }
16 | ],
17 | "autoLastHop": "disabled"
18 | },
19 | "internal": {
20 | "class": "VLAN",
21 | "tag": 4093,
22 | "mtu": 1500,
23 | "interfaces": [
24 | {
25 | "name": "1.2",
26 | "tagged": true
27 | }
28 | ],
29 | "autoLastHop": "default"
30 | }
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/examples/vlanCmpHash.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.7.0",
3 | "class": "Device",
4 | "async": true,
5 | "webhook": "https://example.com/myHook",
6 | "Common": {
7 | "class": "Tenant",
8 | "external": {
9 | "class": "VLAN",
10 | "tag": 4094,
11 | "mtu": 1500,
12 | "interfaces": [
13 | {
14 | "name": "1.1",
15 | "tagged": true
16 | }
17 | ],
18 | "cmpHash": "src-ip"
19 | }
20 | }
21 | }
--------------------------------------------------------------------------------
/examples/vlanFailsafe.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.14.0",
3 | "class": "Device",
4 | "async": true,
5 | "Common": {
6 | "class": "Tenant",
7 | "external": {
8 | "class": "VLAN",
9 | "tag": 4094,
10 | "mtu": 1500,
11 | "interfaces": [
12 | {
13 | "name": "1.1",
14 | "tagged": true
15 | }
16 | ],
17 | "failsafeEnabled": true,
18 | "failsafeAction": "reboot",
19 | "failsafeTimeout": 300
20 | }
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/examples/vxlanTunnel.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.25.0",
3 | "class": "Device",
4 | "async": true,
5 | "label": "Configuring System",
6 | "Common": {
7 | "class": "Tenant",
8 | "testTunnel": {
9 | "class": "Tunnel",
10 | "description": "none",
11 | "autoLasthop": "default",
12 | "mtu": 0,
13 | "tunnelType": "vxlan",
14 | "tos": "preserve",
15 | "usePmtu": true,
16 | "localAddress": "192.0.2.1",
17 | "remoteAddress": "233.252.0.2",
18 | "secondaryAddress": "any6",
19 | "key": 0,
20 | "mode": "bidirectional",
21 | "transparent": false,
22 | "trafficGroup": "none",
23 | "defaultsFrom": "vxlan",
24 | "port": 4789,
25 | "floodingType": "multicast",
26 | "encapsulationType": "vxlan"
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/jsdoc.conf:
--------------------------------------------------------------------------------
1 | {
2 | "opts": {
3 | "recurse": true,
4 | "readme": "README.md",
5 | "destination": "out"
6 | },
7 | "source": {
8 | "include": "nodejs"
9 | },
10 | "templates": {
11 | "default": {
12 | "outputSourceFiles": false,
13 | "includeDate": false
14 | }
15 | },
16 | "plugins": ["plugins/markdown"]
17 | }
--------------------------------------------------------------------------------
/make.bat:
--------------------------------------------------------------------------------
1 | @ECHO OFF
2 |
3 | pushd %~dp0
4 |
5 | REM Command file for Sphinx documentation
6 |
7 | if "%SPHINXBUILD%" == "" (
8 | set SPHINXBUILD=sphinx-build
9 | )
10 | set SOURCEDIR=docs
11 | set BUILDDIR=docs/_build
12 | set SPHINXPROJ=F5DeclarativeOnboarding
13 |
14 | if "%1" == "" goto help
15 |
16 |
17 | %SPHINXBUILD% >NUL 2>NUL
18 | if errorlevel 9009 (
19 | echo.
20 | echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
21 | echo.installed, then set the SPHINXBUILD environment variable to point
22 | echo.to the full path of the 'sphinx-build' executable. Alternatively you
23 | echo.may add the Sphinx directory to PATH.
24 | echo.
25 | echo.If you don't have Sphinx installed, grab it from
26 | echo.http://sphinx-doc.org/
27 | exit /b 1
28 | )
29 |
30 | %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
31 | goto end
32 |
33 | :help
34 | %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
35 | goto end
36 |
37 | if "%1" == "preview" (
38 | echo.Running sphinx-autobuild. View live edits at:
39 | echo. http://0.0.0.0:8000
40 | sphinx-autobuild --host 0.0.0.0 -b html $(SOURCEDIR) $(BUILDDIR)/html
41 | if errorlevel 1 exit /b 1
42 | goto end
43 | )
44 | if "%1" == "test" (
45 | echo.Running test script.
46 | echo.View results below.
47 | ./scripts/test-docs.sh
48 | if errorlevel 1 exit /b 1
49 | goto end
50 | )
51 | if "%1" == "docker-html" (
52 | echo.Running test script in docker.
53 | echo.View results below.
54 | ./scripts/docker-docs.sh make html
55 | if errorlevel 1 exit /b 1
56 | goto end
57 | )
58 | if "%1" == "docker-preview" (
59 | echo.Running sphinx-autobuild in docker.
60 | DOCKER_RUN_ARGS="-p 127.0.0.1:8000:8000" ./scripts/docker-docs.sh \
61 |
62 | if errorlevel 1 exit /b 1
63 | echo.
64 | echo.Build finished. View live edits at:
65 | echo. http://127.0.0.1:8000/index.html
66 | goto end
67 | )
68 | if "%1" == "docker-test" (
69 | echo.Running test script in docker.
70 | echo.View results below.
71 | ./scripts/docker-docs.sh ./scripts/test-docs.sh
72 | if errorlevel 1 exit /b 1
73 | goto end
74 | )
75 |
76 | :end
77 | popd
78 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "f5-declarative-onboarding",
3 | "version": "1.46.0-7",
4 | "description": "F5 Declarative Onboarding",
5 | "main": "index.js",
6 | "repository": {
7 | "type": "git",
8 | "url": "git+https://github.com/F5Networks/f5-declarative-onboarding.git"
9 | },
10 | "keywords": [
11 | "f5",
12 | "declarative",
13 | "onboarding",
14 | "bigip",
15 | "big-ip",
16 | "bigiq",
17 | "big-iq"
18 | ],
19 | "author": "F5 Networks",
20 | "license": "Apache-2.0",
21 | "dependencies": {
22 | "@f5devcentral/atg-shared-utilities": "^0.10.7",
23 | "@f5devcentral/f5-cloud-libs": "^4.29.0",
24 | "@f5devcentral/f5-teem": "^1.6.1",
25 | "ajv": "6.12.6",
26 | "deep-diff": "^1.0.2",
27 | "is-in-subnet": "^4.0.1",
28 | "uuid": "3.4.0"
29 | },
30 | "devDependencies": {
31 | "@f5devcentral/atg-shared-utilities-dev": "^0.2.20",
32 | "@f5devcentral/eslint-config-f5-atg": "^0.1.8",
33 | "@stryker-mutator/core": "^8.5.0",
34 | "@stryker-mutator/mocha-runner": "^8.5.0",
35 | "chai": "^4.3.10",
36 | "chai-as-promised": "^7.1.2",
37 | "colors": "^1.4.0",
38 | "eslint": "^8.56.0",
39 | "json-schema-ref-parser": "^9.0.9",
40 | "mkdirp": "^3.0.1",
41 | "mocha": "^10.7.3",
42 | "mocha-multi-reporters": "^1.5.1",
43 | "nock": "10.0.0",
44 | "nyc": "^17.0.0",
45 | "sinon": "7.5.0",
46 | "winston": "^2.4.7",
47 | "@redocly/cli": "^1.25.0"
48 | },
49 | "scripts": {
50 | "build": "scripts/build/build.sh",
51 | "test": "mocha --recursive test/unit",
52 | "integration": "mocha test/integration/test.js",
53 | "property": "mocha test/integration/property test/integration/misc",
54 | "make-api-docs": "redocly build-docs src/schema/latest/openapi.yaml",
55 | "coverage": "nyc npm test",
56 | "lint": "eslint src test",
57 | "test-mutation": "npx stryker run"
58 | },
59 | "nyc": {
60 | "reporter": [
61 | "html",
62 | "text",
63 | "json-summary"
64 | ]
65 | },
66 | "eslintConfig": {
67 | "extends": "@f5devcentral/eslint-config-f5-atg"
68 | },
69 | "optionalDependencies": {
70 | "node-ssh": "^13.2.0"
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | awscli
2 | f5-sphinx-theme>=1.0.9
3 | sphinx==1.8.5
4 | recommonmark
5 | sphinxjp.themes.basicstrap
6 | cloud_sptheme
7 | sphinx_copybutton
8 |
--------------------------------------------------------------------------------
/scripts/build/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM node:8-alpine
2 |
3 | RUN apk add rpm bash
4 |
--------------------------------------------------------------------------------
/scripts/build/Dockerfile.asg:
--------------------------------------------------------------------------------
1 | FROM f5devcentral/f5-api-services-gateway:latest as builder
2 | ARG TARGET
3 | COPY $TARGET /tmp
4 | RUN rpm --nodeps -i /tmp/$(basename $TARGET)
5 | RUN rm /tmp/$(basename $TARGET)
6 |
7 | FROM f5devcentral/f5-api-services-gateway:latest
8 | COPY --from=builder /var/config/rest/iapps/ /var/config/rest/iapps
9 |
--------------------------------------------------------------------------------
/scripts/build/build.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | set -e
3 | mkdir -p dist
4 |
5 | scripts/build/buildRpm.sh
6 | scripts/build/buildPostmanCollection.sh
7 |
--------------------------------------------------------------------------------
/scripts/build/buildPostmanCollection.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | set -e
3 | mkdir -p dist
4 |
5 | node scripts/build/generatePostmanCollection.js
--------------------------------------------------------------------------------
/scripts/build/buildRpm.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | set -e
3 | mkdir -p dist
4 | VERSION_RELEASE=$(npm version | grep f5-declarative-onboarding | cut -d : -f 2 | awk -F \' '{print $2}')
5 | VERSION=$(echo $VERSION_RELEASE | cut -d - -f 1)
6 | RELEASE=$(echo $VERSION_RELEASE | cut -d - -f 2)
7 | RPM_NAME=f5-declarative-onboarding-${VERSION}-${RELEASE}.noarch.rpm
8 | npm ci --production --no-optional
9 | rpmbuild -bb \
10 | --define "main $(pwd)" \
11 | --define '_topdir %{main}/build' \
12 | --define "_version ${VERSION}" \
13 | --define "_release ${RELEASE}" \
14 | scripts/build/f5-declarative-onboarding.spec
15 | pushd build/RPMS/noarch
16 | sha256sum ${RPM_NAME} > ${RPM_NAME}.sha256
17 | OUTPUT=$(ls -t *.rpm 2>/dev/null | head -1)
18 | cp ${OUTPUT} ../../../dist/
19 | cp ${OUTPUT}.sha256 ../../../dist/
20 | popd
21 | #rm -rf build/*
22 |
--------------------------------------------------------------------------------
/scripts/build/f5-declarative-onboarding.spec:
--------------------------------------------------------------------------------
1 | Summary: F5 Declarative Onboarding iControlLX extension
2 | Name: f5-declarative-onboarding
3 | Version: %{_version}
4 | Release: %{_release}
5 | BuildArch: noarch
6 | Group: Development/Tools
7 | License: Commercial
8 | Packager: F5 Networks
9 |
10 | AutoReqProv: no
11 |
12 | %description
13 | Declarative onboarding for BIG-IP
14 |
15 | %global __os_install_post %{nil}
16 |
17 | %define _rpmfilename %%{ARCH}/%%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm
18 | %define IAPP_INSTALL_DIR /var/config/rest/iapps/%{name}
19 |
20 | %prep
21 | rm -rf %{_builddir}/*
22 | mkdir -p %{_builddir}/schema
23 | cp %{main}/package.json %{_builddir}
24 | cp -r %{main}/src %{_builddir}
25 | cp -r %{main}/node_modules %{_builddir}
26 | cp -r %{main}/examples %{_builddir}
27 | printf "%s" "%{version}-%{release}" > %{_builddir}/version
28 |
29 | %install
30 | rm -rf $RPM_BUILD_ROOT
31 | mkdir -p $RPM_BUILD_ROOT%{IAPP_INSTALL_DIR}
32 | mkdir -p $RPM_BUILD_ROOT%{IAPP_INSTALL_DIR}/schema/latest
33 | cp %{_builddir}/package.json $RPM_BUILD_ROOT%{IAPP_INSTALL_DIR}
34 | cp %{_builddir}/version $RPM_BUILD_ROOT%{IAPP_INSTALL_DIR}
35 | cp -r %{_builddir}/src/lib $RPM_BUILD_ROOT%{IAPP_INSTALL_DIR}
36 | cp -r %{_builddir}/src/nodejs $RPM_BUILD_ROOT%{IAPP_INSTALL_DIR}
37 | cp -r %{_builddir}/src/scripts $RPM_BUILD_ROOT%{IAPP_INSTALL_DIR}
38 | cp -r %{_builddir}/src/schema/latest $RPM_BUILD_ROOT%{IAPP_INSTALL_DIR}/schema
39 | cp -r %{_builddir}/examples $RPM_BUILD_ROOT%{IAPP_INSTALL_DIR}
40 | $(cd $RPM_BUILD_ROOT%{IAPP_INSTALL_DIR}/schema; ln -s latest/*.json .)
41 | cp -r %{_builddir}/node_modules $RPM_BUILD_ROOT%{IAPP_INSTALL_DIR}
42 | mv $RPM_BUILD_ROOT%{IAPP_INSTALL_DIR}/nodejs/manifest.json $RPM_BUILD_ROOT%{IAPP_INSTALL_DIR}
43 |
44 | %clean
45 | rm -rf $RPM_BUILD_ROOT
46 |
47 | %files
48 | %defattr(-,root,root)
49 | %{IAPP_INSTALL_DIR}
50 |
--------------------------------------------------------------------------------
/scripts/dev/build_harness_file.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | set -e
4 |
5 | # Colors
6 | RED='\033[0;31m'
7 | NC='\033[0m' # No Color
8 |
9 | if [ -z "$BIGIPS_ADDRESSES" ]; then
10 | echo -e "${RED}BIGIPS_ADDRESSES is required.${NC}"
11 | exit 1
12 | fi
13 |
14 | IPS_ARRAY=($(echo $BIGIPS_ADDRESSES))
15 |
16 | echo '[' | tr -d '\n'
17 | for i in "${IPS_ARRAY[@]}"
18 | do
19 | jq -n \
20 | --arg ip "$i" \
21 | --arg admin_username "$ADMIN_USERNAME" \
22 | --arg admin_password "$ADMIN_PASSWORD" \
23 | --arg root_password "$ADMIN_PASSWORD" \
24 | '{ admin_ip: $ip,
25 | f5_rest_user: { username: $admin_username,
26 | password: $admin_password },
27 | ssh_user: { username: "root",
28 | password: $root_password }
29 | }' | tr -d '\n'
30 | if [ "$i" != "${IPS_ARRAY[${#IPS_ARRAY[@]}-1]}" ]
31 | then echo ','
32 | fi
33 | done
34 | echo ']'
35 |
--------------------------------------------------------------------------------
/scripts/dev/collectRemoteIntegrationTestLogs.sh:
--------------------------------------------------------------------------------
1 | #! /bin/bash
2 |
3 | if [[ "$#" -ne 1 ]]; then
4 | echo "usage: [info script] "
5 | exit 1
6 | fi
7 |
8 | # Colors
9 | RED='\033[0;31m'
10 | NC='\033[0m' # No Color
11 |
12 | SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
13 |
14 | TEST_HARNESS_FILE=$1
15 |
16 | if [ -z "$TEST_HARNESS_FILE" ]; then
17 | echo -e "${RED}TEST_HARNESS_FILE is required as a parameter.${NC}"
18 | exit 1
19 | fi
20 |
21 | TEST_IPS=($(cat "$TEST_HARNESS_FILE" | jq -r .[].admin_ip))
22 | TEST_USERS=($(cat "$TEST_HARNESS_FILE" | jq -r .[].ssh_user.username))
23 | TEST_PASSWORDS=($(cat "$TEST_HARNESS_FILE" | jq -r .[].ssh_user.password))
24 |
25 | i=0
26 | for IP in "${TEST_IPS[@]}"; do
27 | USER=${TEST_USERS[$i]}
28 | PASSWORD=${TEST_PASSWORDS[$i]}
29 | "$SCRIPT_DIR"/scpRemoteFile.sh $IP $USER $PASSWORD /var/log/restnoded/restnoded.log test/logs/restnoded.bigip_$i.log
30 | "$SCRIPT_DIR"/scpRemoteFile.sh $IP $USER $PASSWORD /var/log/restnoded/restnoded1.log test/logs/restnoded1.bigip_$i.log
31 | "$SCRIPT_DIR"/scpRemoteFile.sh $IP $USER $PASSWORD /var/log/restnoded/restnoded2.log test/logs/restnoded2.bigip_$i.log
32 | "$SCRIPT_DIR"/scpRemoteFile.sh $IP $USER $PASSWORD /var/log/restnoded/restnoded3.log test/logs/restnoded3.bigip_$i.log
33 | i=$((i+1))
34 | done
35 |
--------------------------------------------------------------------------------
/scripts/dev/createMR.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright 2024 F5, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | 'use strict';
18 |
19 | const https = require('https');
20 |
21 | const postData = {
22 | id: process.env.CI_PROJECT_ID,
23 | source_branch: process.env.UPDATE_BRANCH_NAME,
24 | target_branch: 'develop',
25 | title: 'AUTOTOOL dependency updates',
26 | remove_source_branch: true,
27 | squash: true
28 | };
29 |
30 | const url = `https://${process.env.CI_SERVER_HOST}/api/v4/projects/${process.env.CI_PROJECT_ID}/merge_requests`;
31 |
32 | const opts = {
33 | method: 'POST',
34 | headers: {
35 | 'Content-Type': 'application/json',
36 | 'Content-Length': Buffer.byteLength(JSON.stringify(postData)),
37 | 'PRIVATE-TOKEN': process.env.DO_ACCESS_TOKEN.split(':')[1]
38 | }
39 | };
40 |
41 | const req = https.request(url, opts, (res) => {
42 | let resBody = '';
43 | console.log(`STATUS: ${res.statusCode}`);
44 | console.log(`HEADERS: ${JSON.stringify(res.headers, null, 4)}`);
45 | res.setEncoding('utf8');
46 | res.on('data', (chunk) => { resBody += chunk; });
47 | res.on('end', () => {
48 | console.log(`BODY: ${JSON.stringify(JSON.parse(resBody), null, 4)}}`);
49 | });
50 | });
51 |
52 | req.on('error', (e) => { console.error(`problem with request: ${e.message}`); });
53 | req.write(JSON.stringify(postData));
54 | req.end();
55 |
--------------------------------------------------------------------------------
/scripts/dev/get-host.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # Colors
4 | RED='\033[0;31m'
5 | NC='\033[0m' # No Color
6 |
7 | if [ -z "$1" ]; then
8 | echo -e "${RED}Target machine name is required${NC}"
9 | exit 1
10 | fi
11 |
12 | target_machine="$1"
13 | MAX_TRIES=5
14 | current_try=0
15 |
16 | while [[ -z $ip && $current_try < $MAX_TRIES ]]; do
17 | if SERVER_INFO=$(openstack server --insecure show $target_machine -c addresses -f value 2>/dev/null); then
18 | ip=$(echo $SERVER_INFO | cut -d ';' -f 1 | cut -d '=' -f 2)
19 | else
20 | (( current_try = current_try + 1 ))
21 | sleep 5
22 | fi
23 | done
24 |
25 | if [[ $staus == UNKNOWN ]]; then
26 | openstack_output=null
27 | fi
28 |
29 | echo "$ip"
--------------------------------------------------------------------------------
/scripts/dev/scpRemoteFile.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/expect -f
2 |
3 | if { $argc < 5 } {
4 | puts "usage: [info script] "
5 | exit 1
6 | }
7 |
8 | set IP [lindex $argv 0]
9 | set ADMIN_USER [lindex $argv 1]
10 | set ADMIN_PASS [lindex $argv 2]
11 | set SOURCE [lindex $argv 3]
12 | set DEST [lindex $argv 4]
13 |
14 | # Do root user
15 | while (1) {
16 | spawn scp -o "StrictHostKeyChecking no" admin@$IP:$SOURCE "$DEST"
17 | set timeout 5
18 | expect {
19 | "Password:" {
20 | send -- "$ADMIN_PASS\r"
21 | exp_continue
22 | }
23 |
24 | eof {
25 | break
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/scripts/dev/update-do-deps.sh:
--------------------------------------------------------------------------------
1 | # Update deps to latest using npm-check-updates
2 | # exlude version-pinned deps
3 | # ---------------------------------------------
4 | # Go to the link in '${CONFLUENCE_URL}/display/PDESETEAM/Package+Dependencies+-+Pinned' to see a list
5 | npx npm-check-updates -u -x ajv,uuid,sinon,winston,nock,chai,eslint
6 | npm i
7 | npm upgrade
8 |
9 | # Colors
10 | RED='\033[0;31m'
11 | NC='\033[0m' # No Color
12 |
13 | if [ -z "$CI_COMMIT_REF_NAME" ]; then
14 | echo -e "${RED}CI_COMMIT_REF_NAME is required.${NC}"
15 | exit 1
16 | fi
17 |
18 | if [ -z "$DO_ACCESS_TOKEN" ]; then
19 | echo -e "${RED}DO_ACCESS_TOKEN is required.${NC}"
20 | exit 1
21 | fi
22 |
23 | if [ -z "$CI_SERVER_HOST" ]; then
24 | echo -e "${RED}CI_SERVER_HOST is required.${NC}"
25 | exit 1
26 | fi
27 |
28 | if [ -z "$CI_PROJECT_PATH" ]; then
29 | echo -e "${RED}CI_PROJECT_PATH is required.${NC}"
30 | exit 1
31 | fi
32 |
33 | if [ -z "$UPDATE_BRANCH_NAME" ]; then
34 | echo -e "${RED}UPDATE_BRANCH_NAME is required.${NC}"
35 | exit 1
36 | fi
37 |
38 | git config --global user.email "DO_NOT_REPLY@f5.com"
39 | git config --global user.name "F5 DO Pipeline"
40 |
41 | git checkout $CI_COMMIT_REF_NAME
42 | git remote set-url origin https://$DO_ACCESS_TOKEN@$CI_SERVER_HOST/$CI_PROJECT_PATH.git
43 |
44 | if [ -z "$(git status --porcelain)" ]; then
45 | echo "No DO dependency updates detected..."
46 | else
47 | export AUTOTOOL_DIFF=true
48 | echo "DO dependency updates detected!"
49 |
50 | git checkout $UPDATE_BRANCH_NAME 2>/dev/null || git checkout -b $UPDATE_BRANCH_NAME;
51 |
52 | git add .
53 | git status
54 | git commit -m "Auto-update to DO deps"
55 | fi
56 |
57 | git checkout $CI_COMMIT_REF_NAME
58 |
--------------------------------------------------------------------------------
/slack-channel-statement.md:
--------------------------------------------------------------------------------
1 | ## F5 Slack Channel Information
2 |
3 | F5 has created a [Slack channel](https://f5cloudsolutions.herokuapp.com) for community discussion and assistance on F5 solutions, including the Declarative Onboarding Extension (use the **declarative-onboard** channel). This page is to clarify what to expect from the Slack channel and provide guidelines on usage.
4 |
5 | There are F5 employees who are members of the Slack channel community who typically monitor the channel Monday to Friday, from 9am to 5pm PST, and will offer ***best-effort assistance***. This slack channel community support should **not** be considered a substitute for F5 Technical Support.
6 |
7 | On the Slack channel, you should **NEVER**:
8 | - Enter any private or personally identifying information about you, your network, organization, and so on.
9 | - Enter any passwords/credentials, logs, or IP addresses.
10 | - Try to open a F5 technical support case through the Slack Channel.
11 | - Expect that F5 technical support monitors or uses this channel; they do not.
12 | - Expect that an F5 employee will always immediately respond on Slack. Employees will offer best-effort assistance, but there may be times when responses are delayed.
13 |
14 | ### Getting F5 technical support
15 | You can contact [F5 Technical Support](https://support.f5.com/csp/article/K25327565) using your typical method.
16 |
17 |
18 | ### Providing feedback on AS3
19 | - Use the **Issues** link on the GitHub menu bar in this repository for items such as enhancement or feature requests and non-urgent bug fixes. Tell us as much as you can about what you found and how you found it.
20 | - Contact us at [solutionsfeedback@f5.com](mailto:solutionsfeedback@f5.com?subject=DO%20Feedback) for general feedback or enhancement requests.
--------------------------------------------------------------------------------
/src/lib/bigIqSettingsValidator.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright 2024 F5, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | 'use strict';
18 |
19 | const doUtil = require('./doUtil');
20 |
21 | class BigIqSettingsValidator {
22 | validate(data) {
23 | if (!data.bigIqSettings) {
24 | return Promise.resolve({
25 | isValid: true
26 | });
27 | }
28 |
29 | let isValid = true;
30 | const errors = [];
31 |
32 | const deviceGroup = doUtil.getClassObjects(data.declaration, 'DeviceGroup');
33 | if (deviceGroup && !data.bigIqSettings.clusterName) {
34 | isValid = false;
35 | errors.push("When onboarding from BIG-IQ, 'clusterName' is required if the BIG-IP will be a member of a device group");
36 | }
37 |
38 | // technically we can have more than one provision object, but there really should just be one
39 | const provisionObjects = doUtil.getClassObjects(data.declaration, 'Provision');
40 | if (provisionObjects) {
41 | const provision = provisionObjects[Object.keys(provisionObjects)[0]];
42 | if (provision.apm && provision.apm !== 'none') {
43 | if (!data.bigIqSettings.accessModuleProperties) {
44 | isValid = false;
45 | errors.push("When onboarding from BIG-IQ, 'accessModuleProperties' is required if the apm module will be provisioned");
46 | }
47 | }
48 | }
49 |
50 | return Promise.resolve({
51 | isValid,
52 | errors
53 | });
54 | }
55 | }
56 |
57 | module.exports = BigIqSettingsValidator;
58 |
--------------------------------------------------------------------------------
/src/lib/businessLogicValidator.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright 2024 F5, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | 'use strict';
18 |
19 | const doUtil = require('./doUtil');
20 |
21 | class BusinessLogicValidator {
22 | validate(data) {
23 | let isValid = true;
24 | const errors = [];
25 |
26 | if (!data || !data.declaration) {
27 | return Promise.resolve({ isValid });
28 | }
29 |
30 | // no System class
31 | const sysWrapper = doUtil.getClassObjects(data.declaration, 'System');
32 | if (!sysWrapper) {
33 | return Promise.resolve({ isValid });
34 | }
35 |
36 | const sysClassKey = Object.keys(sysWrapper).find((key) => sysWrapper[key].class === 'System');
37 | if (sysClassKey && typeof sysWrapper[sysClassKey].mgmtDhcpEnabled !== 'undefined'
38 | && typeof sysWrapper[sysClassKey].preserveOrigDhcpRoutes !== 'undefined'
39 | && sysWrapper[sysClassKey].mgmtDhcpEnabled !== sysWrapper[sysClassKey].preserveOrigDhcpRoutes) {
40 | isValid = false;
41 | errors.push('the values of mgmtDhcpEnabled and preserveOrigDhcpRoutes must match');
42 | }
43 |
44 | // hostname is in Common and System is present but not default value ('bigip1')
45 | const common = data.declaration.Common;
46 | if (common.hostname && sysClassKey && sysWrapper[sysClassKey].hostname
47 | && sysWrapper[sysClassKey].hostname !== 'bigip1') {
48 | isValid = false;
49 | errors.push('multiple hostnames in declaration');
50 | }
51 |
52 | return Promise.resolve({
53 | isValid,
54 | errors
55 | });
56 | }
57 | }
58 |
59 | module.exports = BusinessLogicValidator;
60 |
--------------------------------------------------------------------------------
/src/lib/configResponse.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright 2024 F5, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | 'use strict';
18 |
19 | const BASE_URL = require('./sharedConstants').BASE_URL;
20 | const ENDPOINTS = require('./sharedConstants').ENDPOINTS;
21 | const STATUS = require('./sharedConstants').STATUS;
22 |
23 | class ConfigResponse {
24 | constructor(state) {
25 | this.state = state;
26 | }
27 |
28 | // Many of these methods do not need 'this' as they return constants
29 | // but the must be instance methods for consistency with other responders
30 | getSelfLink(id) {
31 | return `${BASE_URL}/${ENDPOINTS.CONFIG}/${id}`;
32 | }
33 |
34 | exists(id) {
35 | return !!this.state.getOriginalConfigByConfigId(id);
36 | }
37 |
38 | getIds() {
39 | return this.state.getOriginalConfigIds();
40 | }
41 |
42 | getCode() {
43 | return 200;
44 | }
45 |
46 | getStatus() {
47 | return STATUS.STATUS_OK;
48 | }
49 |
50 | getMessage() {
51 | return '';
52 | }
53 |
54 | getErrors() {
55 | return [];
56 | }
57 |
58 | getData(id) {
59 | if (!this.exists(id)) {
60 | return { httpStatus: 404 };
61 | }
62 |
63 | const data = this.state.getOriginalConfigByConfigId(id);
64 | return data;
65 | }
66 | }
67 |
68 | module.exports = ConfigResponse;
69 |
--------------------------------------------------------------------------------
/src/lib/customKeywords.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright 2024 F5, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | 'use strict';
18 |
19 | const keywords = [
20 | {
21 | name: 'f5fetch',
22 | definition: (that) => ({
23 | type: 'object',
24 | errors: true,
25 | modifying: true,
26 | metaSchema: {
27 | type: 'string',
28 | enum: ['pki-cert', 'pki-key']
29 | },
30 | validate(schema, data, parentSchema, dataPath, parentData, pptyName, rootData) {
31 | that.fetches.push({
32 | schema,
33 | data,
34 | dataPath,
35 | parentData,
36 | pptyName,
37 | rootData
38 | });
39 | return true;
40 | }
41 | })
42 |
43 | }
44 | ];
45 |
46 | module.exports = {
47 | keywords
48 | };
49 |
--------------------------------------------------------------------------------
/src/lib/deprovisionHandler.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright 2024 F5, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | 'use strict';
18 |
19 | const ProvisionHandler = require('./provisionHandler');
20 | /**
21 | * Handles provisioning parts of a declaration.
22 | *
23 | * @class
24 | */
25 | class DeprovisionHandler extends ProvisionHandler {
26 | /**
27 | * Constructor
28 | *
29 | * @param {Object} declaration - Parsed declaration.
30 | * @param {Object} bigIp - BigIp object.
31 | * @param {EventEmitter} - DO event emitter.
32 | * @param {State} - The doState.
33 | */
34 | constructor(declaration, bigIp, eventEmitter, state) {
35 | super(declaration, bigIp, eventEmitter, state);
36 | this.isDeprovisioning = true;
37 | }
38 | }
39 |
40 | module.exports = DeprovisionHandler;
41 |
--------------------------------------------------------------------------------
/src/lib/deviceCertificateValidator.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright 2024 F5, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | 'use strict';
18 |
19 | const doUtil = require('./doUtil');
20 |
21 | class DeviceCertificateValidator {
22 | validate(data) {
23 | if (!data || !data.declaration) {
24 | return Promise.resolve({
25 | isValid: true
26 | });
27 | }
28 |
29 | const deviceCertificateWrapper = doUtil.getClassObjects(data.declaration, 'DeviceCertificate');
30 | if (!deviceCertificateWrapper) {
31 | return Promise.resolve({
32 | isValid: true
33 | });
34 | }
35 |
36 | const deviceCertificate = deviceCertificateWrapper[Object.keys(deviceCertificateWrapper)[0]];
37 |
38 | let isValid = true;
39 | const errors = [];
40 |
41 | function addError(propertyName) {
42 | isValid = false;
43 | errors.push(`DeviceCertificate base64 decoded ${propertyName} property is missing BEGIN and/or END delimiters`);
44 | }
45 |
46 | const certificate = Buffer.from(
47 | deviceCertificate.certificate.base64,
48 | 'base64'
49 | ).toString();
50 |
51 | if (!certificate.includes('BEGIN') || !certificate.includes('END')) {
52 | addError('certificate');
53 | }
54 |
55 | if (deviceCertificate.privateKey) {
56 | const key = Buffer.from(
57 | deviceCertificate.privateKey.base64,
58 | 'base64'
59 | ).toString();
60 |
61 | if (!key.includes('BEGIN') || !key.includes('END')) {
62 | addError('privateKey');
63 | }
64 | }
65 |
66 | return Promise.resolve({
67 | isValid,
68 | errors
69 | });
70 | }
71 | }
72 |
73 | module.exports = DeviceCertificateValidator;
74 |
--------------------------------------------------------------------------------
/src/lib/infoResponse.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright 2024 F5, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | 'use strict';
18 |
19 | const BASE_URL = require('./sharedConstants').BASE_URL;
20 | const ENDPOINTS = require('./sharedConstants').ENDPOINTS;
21 | const STATUS = require('./sharedConstants').STATUS;
22 |
23 | const doUtil = require('./doUtil');
24 | const schema = require('../schema/latest/base.schema.json');
25 |
26 | class InfoResponse {
27 | // Many of these methods do not need 'this' as they return constants
28 | // but the must be instance methods for consistency with other responders
29 | getSelfLink() {
30 | return `${BASE_URL}/${ENDPOINTS.INFO}`;
31 | }
32 |
33 | exists() {
34 | return true;
35 | }
36 |
37 | getIds() {
38 | return [0];
39 | }
40 |
41 | getCode() {
42 | return 200;
43 | }
44 |
45 | getStatus() {
46 | return STATUS.STATUS_OK;
47 | }
48 |
49 | getMessage() {
50 | return '';
51 | }
52 |
53 | getErrors() {
54 | return [];
55 | }
56 |
57 | getData(id) {
58 | const schemaVersions = schema.properties.schemaVersion.enum;
59 | const versionInfo = doUtil.getDoVersion(id);
60 | return {
61 | version: versionInfo.VERSION,
62 | release: versionInfo.RELEASE,
63 | schemaCurrent: schemaVersions[0],
64 | schemaMinimum: schemaVersions[schemaVersions.length - 1]
65 | };
66 | }
67 | }
68 |
69 | module.exports = InfoResponse;
70 |
--------------------------------------------------------------------------------
/src/lib/inspectResponse.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright 2024 F5, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | 'use strict';
18 |
19 | const querystring = require('querystring');
20 |
21 | const InspectHandler = require('./inspectHandler');
22 | const BASE_URL = require('./sharedConstants').BASE_URL;
23 | const ENDPOINTS = require('./sharedConstants').ENDPOINTS;
24 |
25 | /**
26 | * Inspect Response Class
27 | *
28 | * @class
29 | *
30 | * @param {Object} queryParams - query params
31 | * @param {String} [taskId] - The id of the task
32 | */
33 | class InspectResponse {
34 | constructor(queryParams, taskId) {
35 | this.queryParams = queryParams || {};
36 | this.inspectHandler = new InspectHandler(this.queryParams, taskId);
37 | }
38 |
39 | getSelfLink() {
40 | const query = querystring.stringify(this.queryParams);
41 | return `${BASE_URL}/${ENDPOINTS.INSPECT}${query ? '?' : ''}${query}`;
42 | }
43 |
44 | exists() {
45 | return true;
46 | }
47 |
48 | getIds() {
49 | return [0];
50 | }
51 |
52 | getCode() {
53 | return this.inspectHandler.getCode();
54 | }
55 |
56 | getStatus() {
57 | return this.inspectHandler.getStatus();
58 | }
59 |
60 | getMessage() {
61 | return this.inspectHandler.getMessage();
62 | }
63 |
64 | getErrors() {
65 | return this.inspectHandler.getErrors();
66 | }
67 |
68 | getData() {
69 | return this.inspectHandler.process();
70 | }
71 | }
72 |
73 | module.exports = InspectResponse;
74 |
--------------------------------------------------------------------------------
/src/lib/userValidator.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright 2024 F5, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | 'use strict';
18 |
19 | const doUtil = require('./doUtil');
20 |
21 | class UserValidator {
22 | validate(data) {
23 | if (!data || !data.declaration) {
24 | return Promise.resolve({
25 | isValid: true
26 | });
27 | }
28 |
29 | const userWrapper = doUtil.getClassObjects(data.declaration, 'User');
30 | if (!userWrapper) {
31 | return Promise.resolve({
32 | isValid: true
33 | });
34 | }
35 |
36 | let isValid = true;
37 | const errors = [];
38 |
39 | Object.keys(userWrapper).forEach((user) => {
40 | if (user === 'root' && userWrapper[user].userType === 'regular') {
41 | isValid = false;
42 | errors.push('root must have userType root');
43 | }
44 | if (user !== 'root') {
45 | if (userWrapper[user].userType === 'root') {
46 | isValid = false;
47 | errors.push(`${user} must have userType regular`);
48 | }
49 |
50 | if (user.length > 31) {
51 | isValid = false;
52 | errors.push(`${user} is too long. User names must be less than 32 characters`);
53 | }
54 | }
55 | });
56 |
57 | return Promise.resolve({
58 | isValid,
59 | errors
60 | });
61 | }
62 | }
63 |
64 | module.exports = UserValidator;
65 |
--------------------------------------------------------------------------------
/src/nodejs/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "tags":["PLUGIN"]
3 | }
--------------------------------------------------------------------------------
/src/schema/1.0.0/formats.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright 2024 F5, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | 'use strict';
18 |
19 | /* eslint-disable max-len */
20 | const IPv4rex = /^(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))(%(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]\d{4}|[1-9]\d{3}|[1-9]\d{2}|[1-9]?\d))?(\x2f(3[012]|2\d|\d))?$/;
21 |
22 | const IPv6rex = /^(::(([0-9a-f]{1,4}:){0,5}((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))))?)|([0-9a-f]{1,4}::(([0-9a-f]{1,4}:){0,4}((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))))?)|([0-9a-f]{1,4}:[0-9a-f]{1,4}::(([0-9a-f]{1,4}:){0,3}((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))))?)|([0-9a-f]{1,4}(:[0-9a-f]{1,4}){2}::(([0-9a-f]{1,4}:){0,2}((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))))?)|([0-9a-f]{1,4}(:[0-9a-f]{1,4}){3}::(([0-9a-f]{1,4}:)?((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))))?)|([0-9a-f]{1,4}(:[0-9a-f]{1,4}){4}::((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)))?)|([0-9a-f]{1,4}(:[0-9a-f]{1,4}){5}::([0-9a-f]{1,4})?)|([0-9a-f]{1,4}(:[0-9a-f]{1,4}){0,6}::)|(([0-9a-f]{1,4}:){7}[0-9a-f]{1,4})(%(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]\d{4}|[1-9]\d{3}|[1-9]\d{2}|[1-9]?\d))?(\x2f(12[0-8]|1[01]\d|[1-9]?\d))?$/;
23 | /* eslint-enable max-len */
24 |
25 | module.exports = {
26 | f5ip: (address) => {
27 | const lowerAddress = address.toLowerCase();
28 | return (!lowerAddress.length
29 | || ((lowerAddress.length > 1)
30 | && (lowerAddress.match(/[^0-9a-f:.%\x2f]/) === null)
31 | && (IPv4rex.test(lowerAddress) || IPv6rex.test(lowerAddress))));
32 | }
33 | };
34 |
--------------------------------------------------------------------------------
/src/schema/1.1.0/formats.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright 2024 F5, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | 'use strict';
18 |
19 | /* eslint-disable max-len */
20 | const IPv4rex = /^(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))(%(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]\d{4}|[1-9]\d{3}|[1-9]\d{2}|[1-9]?\d))?(\x2f(3[012]|2\d|\d))?$/;
21 |
22 | const IPv6rex = /^(::(([0-9a-f]{1,4}:){0,5}((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))))?)|([0-9a-f]{1,4}::(([0-9a-f]{1,4}:){0,4}((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))))?)|([0-9a-f]{1,4}:[0-9a-f]{1,4}::(([0-9a-f]{1,4}:){0,3}((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))))?)|([0-9a-f]{1,4}(:[0-9a-f]{1,4}){2}::(([0-9a-f]{1,4}:){0,2}((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))))?)|([0-9a-f]{1,4}(:[0-9a-f]{1,4}){3}::(([0-9a-f]{1,4}:)?((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))))?)|([0-9a-f]{1,4}(:[0-9a-f]{1,4}){4}::((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)))?)|([0-9a-f]{1,4}(:[0-9a-f]{1,4}){5}::([0-9a-f]{1,4})?)|([0-9a-f]{1,4}(:[0-9a-f]{1,4}){0,6}::)|(([0-9a-f]{1,4}:){7}[0-9a-f]{1,4})(%(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]\d{4}|[1-9]\d{3}|[1-9]\d{2}|[1-9]?\d))?(\x2f(12[0-8]|1[01]\d|[1-9]?\d))?$/;
23 | /* eslint-enable max-len */
24 |
25 | module.exports = {
26 | f5ip: (address) => {
27 | const lowerAddress = address.toLowerCase();
28 | return (!lowerAddress.length
29 | || ((lowerAddress.length > 1)
30 | && (lowerAddress.match(/[^0-9a-f:.%\x2f]/) === null)
31 | && (IPv4rex.test(lowerAddress) || IPv6rex.test(lowerAddress))));
32 | }
33 | };
34 |
--------------------------------------------------------------------------------
/src/schema/1.12.0/definitions.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/schema/definitions.schema.json",
4 | "title": "F5 Declarative Onboarding schema common definitions",
5 | "description": "Common definitions for use in Declarative Onboarding schemas.",
6 | "definitions": {
7 | "F5string": {
8 | "description": "String value in base64",
9 | "type": "object",
10 | "properties": {
11 | "base64": {
12 | "description": "Base64-encoded value (in JSON string)",
13 | "type": "string",
14 | "format": "f5base64"
15 | }
16 | }
17 | },
18 | "additionalProperties": false
19 | }
20 | }
--------------------------------------------------------------------------------
/src/schema/1.13.0/definitions.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/schema/definitions.schema.json",
4 | "title": "F5 Declarative Onboarding schema common definitions",
5 | "description": "Common definitions for use in Declarative Onboarding schemas.",
6 | "definitions": {
7 | "F5string": {
8 | "description": "String value in base64",
9 | "type": "object",
10 | "properties": {
11 | "base64": {
12 | "description": "Base64-encoded value (in JSON string)",
13 | "type": "string",
14 | "format": "f5base64"
15 | }
16 | }
17 | },
18 | "additionalProperties": false
19 | }
20 | }
--------------------------------------------------------------------------------
/src/schema/1.14.0/definitions.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/schema/definitions.schema.json",
4 | "title": "F5 Declarative Onboarding schema common definitions",
5 | "description": "Common definitions for use in Declarative Onboarding schemas.",
6 | "definitions": {
7 | "F5string": {
8 | "description": "String value in base64",
9 | "type": "object",
10 | "properties": {
11 | "base64": {
12 | "description": "Base64-encoded value (in JSON string)",
13 | "type": "string",
14 | "format": "f5base64"
15 | }
16 | }
17 | },
18 | "additionalProperties": false
19 | }
20 | }
--------------------------------------------------------------------------------
/src/schema/1.17.0/definitions.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/schema/definitions.schema.json",
4 | "title": "F5 Declarative Onboarding Definitions declaration",
5 | "description": "Shared definitions for onboarding a BIG-IP.",
6 | "type": "object",
7 | "definitions": {
8 | "F5string": {
9 | "description": "String value in base64",
10 | "type": "object",
11 | "properties": {
12 | "base64": {
13 | "description": "Base64-encoded value (in JSON string)",
14 | "type": "string",
15 | "format": "f5base64"
16 | }
17 | }
18 | },
19 | "pkiCertificate": {
20 | "description": "PKI certificate with optional chain",
21 | "required": ["certificate"],
22 | "properties": {
23 | "certificate": {
24 | "description": "X.509 public-key certificate",
25 | "allOf": [
26 | { "$ref": "#/definitions/F5string" }
27 | ]
28 | },
29 | "privateKey": {
30 | "description": "Private key matching certificate's public key (optional)",
31 | "allOf": [
32 | { "$ref": "#/definitions/F5string" }
33 | ]
34 | }
35 | }
36 | }
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/src/schema/1.18.0/definitions.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/schema/definitions.schema.json",
4 | "title": "F5 Declarative Onboarding Definitions declaration",
5 | "description": "Shared definitions for onboarding a BIG-IP.",
6 | "type": "object",
7 | "definitions": {
8 | "F5string": {
9 | "description": "String value in base64",
10 | "type": "object",
11 | "properties": {
12 | "base64": {
13 | "description": "Base64-encoded value (in JSON string)",
14 | "type": "string",
15 | "format": "f5base64"
16 | }
17 | }
18 | },
19 | "pkiCertificate": {
20 | "description": "PKI certificate with optional chain",
21 | "required": ["certificate"],
22 | "properties": {
23 | "certificate": {
24 | "description": "X.509 public-key certificate",
25 | "allOf": [
26 | { "$ref": "#/definitions/F5string" }
27 | ]
28 | },
29 | "privateKey": {
30 | "description": "Private key matching certificate's public key (optional)",
31 | "allOf": [
32 | { "$ref": "#/definitions/F5string" }
33 | ]
34 | }
35 | }
36 | },
37 | "Label": {
38 | "title": "Label",
39 | "description": "Optional friendly name for this object",
40 | "type": "string",
41 | "format": "f5label"
42 | },
43 | "Remark": {
44 | "title": "Remark",
45 | "description": "Arbitrary (brief) text pertaining to this object (optional)",
46 | "type": "string",
47 | "format": "f5remark"
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/src/schema/1.19.0/definitions.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/schema/definitions.schema.json",
4 | "title": "F5 Declarative Onboarding Definitions declaration",
5 | "description": "Shared definitions for onboarding a BIG-IP.",
6 | "type": "object",
7 | "definitions": {
8 | "F5string": {
9 | "description": "String value in base64",
10 | "type": "object",
11 | "properties": {
12 | "base64": {
13 | "description": "Base64-encoded value (in JSON string)",
14 | "type": "string",
15 | "format": "f5base64"
16 | }
17 | }
18 | },
19 | "pkiCertificate": {
20 | "description": "PKI certificate with optional chain",
21 | "required": ["certificate"],
22 | "properties": {
23 | "certificate": {
24 | "description": "X.509 public-key certificate",
25 | "allOf": [
26 | { "$ref": "#/definitions/F5string" }
27 | ]
28 | },
29 | "privateKey": {
30 | "description": "Private key matching certificate's public key (optional)",
31 | "allOf": [
32 | { "$ref": "#/definitions/F5string" }
33 | ]
34 | }
35 | }
36 | },
37 | "Label": {
38 | "title": "Label",
39 | "description": "Optional friendly name for this object",
40 | "type": "string",
41 | "format": "f5label"
42 | },
43 | "Remark": {
44 | "title": "Remark",
45 | "description": "Arbitrary (brief) text pertaining to this object (optional)",
46 | "type": "string",
47 | "format": "f5remark"
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/src/schema/1.2.0/formats.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright 2024 F5, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | 'use strict';
18 |
19 | /* eslint-disable max-len */
20 | const IPv4rex = /^(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))(%(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]\d{4}|[1-9]\d{3}|[1-9]\d{2}|[1-9]?\d))?(\x2f(3[012]|[12]?\d))?$/;
21 |
22 | const IPv6rex = /^(::(([0-9a-f]{1,4}:){0,5}((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))))?)|([0-9a-f]{1,4}::(([0-9a-f]{1,4}:){0,4}((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))))?)|([0-9a-f]{1,4}:[0-9a-f]{1,4}::(([0-9a-f]{1,4}:){0,3}((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))))?)|([0-9a-f]{1,4}(:[0-9a-f]{1,4}){2}::(([0-9a-f]{1,4}:){0,2}((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))))?)|([0-9a-f]{1,4}(:[0-9a-f]{1,4}){3}::(([0-9a-f]{1,4}:)?((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))))?)|([0-9a-f]{1,4}(:[0-9a-f]{1,4}){4}::((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)))?)|([0-9a-f]{1,4}(:[0-9a-f]{1,4}){5}::([0-9a-f]{1,4})?)|([0-9a-f]{1,4}(:[0-9a-f]{1,4}){0,6}::)|(([0-9a-f]{1,4}:){7}[0-9a-f]{1,4})(%(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]\d{4}|[1-9]\d{3}|[1-9]\d{2}|[1-9]?\d))?(\x2f(12[0-8]|1[01]\d|[1-9]?\d))?$/;
23 | /* eslint-enable max-len */
24 |
25 | module.exports = {
26 | f5ip: (address) => {
27 | const lowerAddress = address.toLowerCase();
28 | return (!lowerAddress.length
29 | || ((lowerAddress.length > 1)
30 | && (lowerAddress.match(/[^0-9a-f:.%\x2f]/) === null)
31 | && (IPv4rex.test(lowerAddress) || IPv6rex.test(lowerAddress))));
32 | }
33 | };
34 |
--------------------------------------------------------------------------------
/src/schema/1.20.0/definitions.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/schema/definitions.schema.json",
4 | "title": "F5 Declarative Onboarding Definitions declaration",
5 | "description": "Shared definitions for onboarding a BIG-IP.",
6 | "type": "object",
7 | "definitions": {
8 | "F5string": {
9 | "description": "String value in base64",
10 | "type": "object",
11 | "properties": {
12 | "base64": {
13 | "description": "Base64-encoded value (in JSON string)",
14 | "type": "string",
15 | "format": "f5base64"
16 | }
17 | }
18 | },
19 | "pkiCertificate": {
20 | "description": "PKI certificate with optional chain",
21 | "required": ["certificate"],
22 | "properties": {
23 | "certificate": {
24 | "description": "X.509 public-key certificate",
25 | "allOf": [
26 | { "$ref": "#/definitions/F5string" }
27 | ]
28 | },
29 | "privateKey": {
30 | "description": "Private key matching certificate's public key (optional)",
31 | "allOf": [
32 | { "$ref": "#/definitions/F5string" }
33 | ]
34 | }
35 | }
36 | },
37 | "Label": {
38 | "title": "Label",
39 | "description": "Optional friendly name for this object",
40 | "type": "string",
41 | "format": "f5label"
42 | },
43 | "Remark": {
44 | "title": "Remark",
45 | "description": "Arbitrary (brief) text pertaining to this object (optional)",
46 | "type": "string",
47 | "format": "f5remark"
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/src/schema/1.21.0/definitions.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/schema/definitions.schema.json",
4 | "title": "F5 Declarative Onboarding Definitions declaration",
5 | "description": "Shared definitions for onboarding a BIG-IP.",
6 | "type": "object",
7 | "definitions": {
8 | "F5string": {
9 | "description": "String value in base64",
10 | "type": "object",
11 | "properties": {
12 | "base64": {
13 | "description": "Base64-encoded value (in JSON string)",
14 | "type": "string",
15 | "format": "f5base64"
16 | }
17 | }
18 | },
19 | "pkiCertificate": {
20 | "description": "PKI certificate with optional chain",
21 | "required": ["certificate"],
22 | "properties": {
23 | "certificate": {
24 | "description": "X.509 public-key certificate",
25 | "allOf": [
26 | { "$ref": "#/definitions/F5string" }
27 | ]
28 | },
29 | "privateKey": {
30 | "description": "Private key matching certificate's public key (optional)",
31 | "allOf": [
32 | { "$ref": "#/definitions/F5string" }
33 | ]
34 | }
35 | }
36 | },
37 | "Label": {
38 | "title": "Label",
39 | "description": "Optional friendly name for this object",
40 | "type": "string",
41 | "format": "f5label"
42 | },
43 | "Remark": {
44 | "title": "Remark",
45 | "description": "Arbitrary (brief) text pertaining to this object (optional)",
46 | "type": "string",
47 | "format": "f5remark"
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/src/schema/1.21.1/definitions.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/schema/definitions.schema.json",
4 | "title": "F5 Declarative Onboarding Definitions declaration",
5 | "description": "Shared definitions for onboarding a BIG-IP.",
6 | "type": "object",
7 | "definitions": {
8 | "F5string": {
9 | "description": "String value in base64",
10 | "type": "object",
11 | "properties": {
12 | "base64": {
13 | "description": "Base64-encoded value (in JSON string)",
14 | "type": "string",
15 | "format": "f5base64"
16 | }
17 | }
18 | },
19 | "pkiCertificate": {
20 | "description": "PKI certificate with optional chain",
21 | "required": ["certificate"],
22 | "properties": {
23 | "certificate": {
24 | "description": "X.509 public-key certificate",
25 | "allOf": [
26 | { "$ref": "#/definitions/F5string" }
27 | ]
28 | },
29 | "privateKey": {
30 | "description": "Private key matching certificate's public key (optional)",
31 | "allOf": [
32 | { "$ref": "#/definitions/F5string" }
33 | ]
34 | }
35 | }
36 | },
37 | "Label": {
38 | "title": "Label",
39 | "description": "Optional friendly name for this object",
40 | "type": "string",
41 | "format": "f5label"
42 | },
43 | "Remark": {
44 | "title": "Remark",
45 | "description": "Arbitrary (brief) text pertaining to this object (optional)",
46 | "type": "string",
47 | "format": "f5remark"
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/src/schema/1.22.0/definitions.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/schema/definitions.schema.json",
4 | "title": "F5 Declarative Onboarding Definitions declaration",
5 | "description": "Shared definitions for onboarding a BIG-IP.",
6 | "type": "object",
7 | "definitions": {
8 | "F5string": {
9 | "description": "String value in base64",
10 | "type": "object",
11 | "properties": {
12 | "base64": {
13 | "description": "Base64-encoded value (in JSON string)",
14 | "type": "string",
15 | "format": "f5base64"
16 | }
17 | }
18 | },
19 | "pkiCertificate": {
20 | "description": "PKI certificate with optional chain",
21 | "required": ["certificate"],
22 | "properties": {
23 | "certificate": {
24 | "description": "X.509 public-key certificate",
25 | "allOf": [
26 | { "$ref": "#/definitions/F5string" }
27 | ]
28 | },
29 | "privateKey": {
30 | "description": "Private key matching certificate's public key (optional)",
31 | "allOf": [
32 | { "$ref": "#/definitions/F5string" }
33 | ]
34 | }
35 | }
36 | },
37 | "Label": {
38 | "title": "Label",
39 | "description": "Optional friendly name for this object",
40 | "type": "string",
41 | "format": "f5label"
42 | },
43 | "Remark": {
44 | "title": "Remark",
45 | "description": "Arbitrary (brief) text pertaining to this object (optional)",
46 | "type": "string",
47 | "format": "f5remark"
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/src/schema/1.23.0/definitions.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/schema/definitions.schema.json",
4 | "title": "F5 Declarative Onboarding Definitions declaration",
5 | "description": "Shared definitions for onboarding a BIG-IP.",
6 | "type": "object",
7 | "definitions": {
8 | "F5string": {
9 | "description": "String value in base64",
10 | "type": "object",
11 | "properties": {
12 | "base64": {
13 | "description": "Base64-encoded value (in JSON string)",
14 | "type": "string",
15 | "format": "f5base64"
16 | }
17 | }
18 | },
19 | "pkiCertificate": {
20 | "description": "PKI certificate with optional chain",
21 | "required": ["certificate"],
22 | "properties": {
23 | "certificate": {
24 | "description": "X.509 public-key certificate",
25 | "allOf": [
26 | { "$ref": "#/definitions/F5string" }
27 | ]
28 | },
29 | "privateKey": {
30 | "description": "Private key matching certificate's public key (optional)",
31 | "allOf": [
32 | { "$ref": "#/definitions/F5string" }
33 | ]
34 | }
35 | }
36 | },
37 | "Label": {
38 | "title": "Label",
39 | "description": "Optional friendly name for this object",
40 | "type": "string",
41 | "format": "f5label"
42 | },
43 | "Remark": {
44 | "title": "Remark",
45 | "description": "Arbitrary (brief) text pertaining to this object (optional)",
46 | "type": "string",
47 | "format": "f5remark"
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/src/schema/1.24.0/definitions.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/schema/definitions.schema.json",
4 | "title": "F5 Declarative Onboarding Definitions declaration",
5 | "description": "Shared definitions for onboarding a BIG-IP.",
6 | "type": "object",
7 | "definitions": {
8 | "F5string": {
9 | "description": "String value in base64",
10 | "type": "object",
11 | "properties": {
12 | "base64": {
13 | "description": "Base64-encoded value (in JSON string)",
14 | "type": "string",
15 | "format": "f5base64"
16 | }
17 | }
18 | },
19 | "pkiCertificate": {
20 | "description": "PKI certificate with optional chain",
21 | "required": ["certificate"],
22 | "properties": {
23 | "certificate": {
24 | "description": "X.509 public-key certificate",
25 | "allOf": [
26 | { "$ref": "#/definitions/F5string" }
27 | ]
28 | },
29 | "privateKey": {
30 | "description": "Private key matching certificate's public key (optional)",
31 | "allOf": [
32 | { "$ref": "#/definitions/F5string" }
33 | ]
34 | }
35 | }
36 | },
37 | "Label": {
38 | "title": "Label",
39 | "description": "Optional friendly name for this object",
40 | "type": "string",
41 | "format": "f5label"
42 | },
43 | "Remark": {
44 | "title": "Remark",
45 | "description": "Arbitrary (brief) text pertaining to this object (optional)",
46 | "type": "string",
47 | "format": "f5remark"
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/src/schema/1.25.0/definitions.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/schema/definitions.schema.json",
4 | "title": "F5 Declarative Onboarding Definitions declaration",
5 | "description": "Shared definitions for onboarding a BIG-IP.",
6 | "type": "object",
7 | "definitions": {
8 | "F5string": {
9 | "description": "String value in base64",
10 | "type": "object",
11 | "properties": {
12 | "base64": {
13 | "description": "Base64-encoded value (in JSON string)",
14 | "type": "string",
15 | "format": "f5base64"
16 | }
17 | }
18 | },
19 | "pkiCertificate": {
20 | "description": "PKI certificate with optional chain",
21 | "required": ["certificate"],
22 | "properties": {
23 | "certificate": {
24 | "description": "X.509 public-key certificate",
25 | "allOf": [
26 | { "$ref": "#/definitions/F5string" }
27 | ]
28 | },
29 | "privateKey": {
30 | "description": "Private key matching certificate's public key (optional)",
31 | "allOf": [
32 | { "$ref": "#/definitions/F5string" }
33 | ]
34 | }
35 | }
36 | },
37 | "Label": {
38 | "title": "Label",
39 | "description": "Optional friendly name for this object",
40 | "type": "string",
41 | "format": "f5label"
42 | },
43 | "Remark": {
44 | "title": "Remark",
45 | "description": "Arbitrary (brief) text pertaining to this object (optional)",
46 | "type": "string",
47 | "format": "f5remark"
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/src/schema/1.26.0/definitions.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/schema/definitions.schema.json",
4 | "title": "F5 Declarative Onboarding Definitions declaration",
5 | "description": "Shared definitions for onboarding a BIG-IP.",
6 | "type": "object",
7 | "definitions": {
8 | "F5string": {
9 | "description": "String value in base64",
10 | "type": "object",
11 | "properties": {
12 | "base64": {
13 | "description": "Base64-encoded value (in JSON string)",
14 | "type": "string",
15 | "format": "f5base64"
16 | }
17 | }
18 | },
19 | "pkiCertificate": {
20 | "description": "PKI certificate with optional chain",
21 | "required": ["certificate"],
22 | "properties": {
23 | "certificate": {
24 | "description": "X.509 public-key certificate",
25 | "allOf": [
26 | { "$ref": "#/definitions/F5string" }
27 | ]
28 | },
29 | "privateKey": {
30 | "description": "Private key matching certificate's public key (optional)",
31 | "allOf": [
32 | { "$ref": "#/definitions/F5string" }
33 | ]
34 | }
35 | }
36 | },
37 | "Label": {
38 | "title": "Label",
39 | "description": "Optional friendly name for this object",
40 | "type": "string",
41 | "format": "f5label"
42 | },
43 | "Remark": {
44 | "title": "Remark",
45 | "description": "Arbitrary (brief) text pertaining to this object (optional)",
46 | "type": "string",
47 | "format": "f5remark"
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/src/schema/1.27.0/definitions.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/schema/definitions.schema.json",
4 | "title": "F5 Declarative Onboarding Definitions declaration",
5 | "description": "Shared definitions for onboarding a BIG-IP.",
6 | "type": "object",
7 | "definitions": {
8 | "F5string": {
9 | "description": "String value in base64",
10 | "type": "object",
11 | "properties": {
12 | "base64": {
13 | "description": "Base64-encoded value (in JSON string)",
14 | "type": "string",
15 | "format": "f5base64"
16 | }
17 | }
18 | },
19 | "pkiCertificate": {
20 | "description": "PKI certificate with optional chain",
21 | "required": ["certificate"],
22 | "properties": {
23 | "certificate": {
24 | "description": "X.509 public-key certificate",
25 | "allOf": [
26 | { "$ref": "#/definitions/F5string" }
27 | ]
28 | },
29 | "privateKey": {
30 | "description": "Private key matching certificate's public key (optional)",
31 | "allOf": [
32 | { "$ref": "#/definitions/F5string" }
33 | ]
34 | }
35 | }
36 | },
37 | "Label": {
38 | "title": "Label",
39 | "description": "Optional friendly name for this object",
40 | "type": "string",
41 | "format": "f5label"
42 | },
43 | "Remark": {
44 | "title": "Remark",
45 | "description": "Arbitrary (brief) text pertaining to this object (optional)",
46 | "type": "string",
47 | "format": "f5remark"
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/src/schema/1.27.1/definitions.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/schema/definitions.schema.json",
4 | "title": "F5 Declarative Onboarding Definitions declaration",
5 | "description": "Shared definitions for onboarding a BIG-IP.",
6 | "type": "object",
7 | "definitions": {
8 | "F5string": {
9 | "description": "String value in base64",
10 | "type": "object",
11 | "properties": {
12 | "base64": {
13 | "description": "Base64-encoded value (in JSON string)",
14 | "type": "string",
15 | "format": "f5base64"
16 | }
17 | }
18 | },
19 | "pkiCertificate": {
20 | "description": "PKI certificate with optional chain",
21 | "required": ["certificate"],
22 | "properties": {
23 | "certificate": {
24 | "description": "X.509 public-key certificate",
25 | "allOf": [
26 | { "$ref": "#/definitions/F5string" }
27 | ]
28 | },
29 | "privateKey": {
30 | "description": "Private key matching certificate's public key (optional)",
31 | "allOf": [
32 | { "$ref": "#/definitions/F5string" }
33 | ]
34 | }
35 | }
36 | },
37 | "Label": {
38 | "title": "Label",
39 | "description": "Optional friendly name for this object",
40 | "type": "string",
41 | "format": "f5label"
42 | },
43 | "Remark": {
44 | "title": "Remark",
45 | "description": "Arbitrary (brief) text pertaining to this object (optional)",
46 | "type": "string",
47 | "format": "f5remark"
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/src/schema/1.28.0/definitions.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/src/schema/latest/definitions.schema.json",
4 | "title": "F5 Declarative Onboarding Definitions declaration",
5 | "description": "Shared definitions for onboarding a BIG-IP.",
6 | "type": "object",
7 | "definitions": {
8 | "F5string": {
9 | "description": "String value in base64",
10 | "type": "object",
11 | "properties": {
12 | "base64": {
13 | "description": "Base64-encoded value (in JSON string)",
14 | "type": "string",
15 | "format": "f5base64"
16 | }
17 | }
18 | },
19 | "pkiCertificate": {
20 | "description": "PKI certificate with optional chain",
21 | "required": ["certificate"],
22 | "properties": {
23 | "certificate": {
24 | "description": "X.509 public-key certificate",
25 | "allOf": [
26 | { "$ref": "#/definitions/F5string" }
27 | ]
28 | },
29 | "privateKey": {
30 | "description": "Private key matching certificate's public key (optional)",
31 | "allOf": [
32 | { "$ref": "#/definitions/F5string" }
33 | ]
34 | }
35 | }
36 | },
37 | "Label": {
38 | "title": "Label",
39 | "description": "Optional friendly name for this object",
40 | "type": "string",
41 | "format": "f5label"
42 | },
43 | "Remark": {
44 | "title": "Remark",
45 | "description": "Arbitrary (brief) text pertaining to this object (optional)",
46 | "type": "string",
47 | "format": "f5remark"
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/src/schema/1.29.0/definitions.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/src/schema/latest/definitions.schema.json",
4 | "title": "F5 Declarative Onboarding Definitions declaration",
5 | "description": "Shared definitions for onboarding a BIG-IP.",
6 | "type": "object",
7 | "definitions": {
8 | "F5string": {
9 | "description": "String value in base64",
10 | "type": "object",
11 | "properties": {
12 | "base64": {
13 | "description": "Base64-encoded value (in JSON string)",
14 | "type": "string",
15 | "format": "f5base64"
16 | }
17 | }
18 | },
19 | "pkiCertificate": {
20 | "description": "PKI certificate with optional chain",
21 | "required": ["certificate"],
22 | "properties": {
23 | "certificate": {
24 | "description": "X.509 public-key certificate",
25 | "allOf": [
26 | { "$ref": "#/definitions/F5string" }
27 | ]
28 | },
29 | "privateKey": {
30 | "description": "Private key matching certificate's public key (optional)",
31 | "allOf": [
32 | { "$ref": "#/definitions/F5string" }
33 | ]
34 | }
35 | }
36 | },
37 | "Label": {
38 | "title": "Label",
39 | "description": "Optional friendly name for this object",
40 | "type": "string",
41 | "format": "f5label"
42 | },
43 | "Remark": {
44 | "title": "Remark",
45 | "description": "Arbitrary (brief) text pertaining to this object (optional)",
46 | "type": "string",
47 | "format": "f5remark"
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/src/schema/1.3.0/formats.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright 2024 F5, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | 'use strict';
18 |
19 | /* eslint-disable max-len */
20 | const IPv4rex = /^(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))(%(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]\d{4}|[1-9]\d{3}|[1-9]\d{2}|[1-9]?\d))?(\x2f(3[012]|[12]?\d))?$/;
21 |
22 | const IPv6rex = /^(::(([0-9a-f]{1,4}:){0,5}((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))))?)|([0-9a-f]{1,4}::(([0-9a-f]{1,4}:){0,4}((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))))?)|([0-9a-f]{1,4}:[0-9a-f]{1,4}::(([0-9a-f]{1,4}:){0,3}((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))))?)|([0-9a-f]{1,4}(:[0-9a-f]{1,4}){2}::(([0-9a-f]{1,4}:){0,2}((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))))?)|([0-9a-f]{1,4}(:[0-9a-f]{1,4}){3}::(([0-9a-f]{1,4}:)?((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))))?)|([0-9a-f]{1,4}(:[0-9a-f]{1,4}){4}::((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)))?)|([0-9a-f]{1,4}(:[0-9a-f]{1,4}){5}::([0-9a-f]{1,4})?)|([0-9a-f]{1,4}(:[0-9a-f]{1,4}){0,6}::)|(([0-9a-f]{1,4}:){7}[0-9a-f]{1,4})(%(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]\d{4}|[1-9]\d{3}|[1-9]\d{2}|[1-9]?\d))?(\x2f(12[0-8]|1[01]\d|[1-9]?\d))?$/;
23 | /* eslint-enable max-len */
24 |
25 | module.exports = {
26 | f5ip: (address) => {
27 | const lowerAddress = address.toLowerCase();
28 | return (!lowerAddress.length
29 | || ((lowerAddress.length > 1)
30 | && (lowerAddress.match(/[^0-9a-f:.%\x2f]/) === null)
31 | && (IPv4rex.test(lowerAddress) || IPv6rex.test(lowerAddress))));
32 | }
33 | };
34 |
--------------------------------------------------------------------------------
/src/schema/1.30.0/definitions.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/src/schema/latest/definitions.schema.json",
4 | "title": "F5 Declarative Onboarding Definitions declaration",
5 | "description": "Shared definitions for onboarding a BIG-IP.",
6 | "type": "object",
7 | "definitions": {
8 | "F5string": {
9 | "description": "String value in base64",
10 | "type": "object",
11 | "properties": {
12 | "base64": {
13 | "description": "Base64-encoded value (in JSON string)",
14 | "type": "string",
15 | "format": "f5base64"
16 | }
17 | }
18 | },
19 | "pkiCertificate": {
20 | "description": "PKI certificate with optional chain",
21 | "required": ["certificate"],
22 | "properties": {
23 | "certificate": {
24 | "description": "X.509 public-key certificate",
25 | "allOf": [
26 | { "$ref": "#/definitions/F5string" }
27 | ]
28 | },
29 | "privateKey": {
30 | "description": "Private key matching certificate's public key (optional)",
31 | "allOf": [
32 | { "$ref": "#/definitions/F5string" }
33 | ]
34 | }
35 | }
36 | },
37 | "Label": {
38 | "title": "Label",
39 | "description": "Optional friendly name for this object",
40 | "type": "string",
41 | "format": "f5label"
42 | },
43 | "Remark": {
44 | "title": "Remark",
45 | "description": "Arbitrary (brief) text pertaining to this object (optional)",
46 | "type": "string",
47 | "format": "f5remark"
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/src/schema/1.30.0/do.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/src/schema/latest/do.schema.json",
4 | "title": "F5 Declarative Onboarding base declaration",
5 | "description": "Schema for onboarding a BIG-IP.",
6 | "type": "object",
7 | "required": ["class"],
8 | "properties": {
9 | "class": {
10 | "description": "Top level class. Indicates whether this is a deployment directly to a BIG-IP or to some other system such as BIG-IQ.",
11 | "enum": [
12 | "Device",
13 | "DO"
14 | ]
15 | }
16 | },
17 | "allOf": [
18 | {
19 | "if": {
20 | "required": ["class"],
21 | "properties": { "class": { "const": "Device" } }
22 | },
23 | "then": {
24 | "description": "Indicates that this is a deployment directly to a BIG-IP.",
25 | "$ref": "base.schema.json#"
26 | }
27 | },
28 | {
29 | "if": {
30 | "required": ["class"],
31 | "properties": { "class": { "const": "DO" } }
32 | },
33 | "then": {
34 | "description": "Indicates that this is a deployment through an intermediary like BIG-IQ.",
35 | "$ref": "remote.schema.json#"
36 | }
37 | }
38 | ]
39 | }
40 |
--------------------------------------------------------------------------------
/src/schema/1.31.0/definitions.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/src/schema/latest/definitions.schema.json",
4 | "title": "F5 Declarative Onboarding Definitions declaration",
5 | "description": "Shared definitions for onboarding a BIG-IP.",
6 | "type": "object",
7 | "definitions": {
8 | "F5string": {
9 | "description": "String value in base64",
10 | "type": "object",
11 | "properties": {
12 | "base64": {
13 | "description": "Base64-encoded value (in JSON string)",
14 | "type": "string",
15 | "format": "f5base64"
16 | }
17 | }
18 | },
19 | "pkiCertificate": {
20 | "description": "PKI certificate with optional chain",
21 | "required": ["certificate"],
22 | "properties": {
23 | "certificate": {
24 | "description": "X.509 public-key certificate",
25 | "allOf": [
26 | { "$ref": "#/definitions/F5string" }
27 | ]
28 | },
29 | "privateKey": {
30 | "description": "Private key matching certificate's public key (optional)",
31 | "allOf": [
32 | { "$ref": "#/definitions/F5string" }
33 | ]
34 | }
35 | }
36 | },
37 | "Label": {
38 | "title": "Label",
39 | "description": "Optional friendly name for this object",
40 | "type": "string",
41 | "format": "f5label"
42 | },
43 | "Remark": {
44 | "title": "Remark",
45 | "description": "Arbitrary (brief) text pertaining to this object (optional)",
46 | "type": "string",
47 | "format": "f5remark"
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/src/schema/1.31.0/do.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/src/schema/latest/do.schema.json",
4 | "title": "F5 Declarative Onboarding base declaration",
5 | "description": "Schema for onboarding a BIG-IP.",
6 | "type": "object",
7 | "required": ["class"],
8 | "properties": {
9 | "class": {
10 | "description": "Top level class. Indicates whether this is a deployment directly to a BIG-IP or to some other system such as BIG-IQ.",
11 | "enum": [
12 | "Device",
13 | "DO"
14 | ]
15 | }
16 | },
17 | "allOf": [
18 | {
19 | "if": {
20 | "required": ["class"],
21 | "properties": { "class": { "const": "Device" } }
22 | },
23 | "then": {
24 | "description": "Indicates that this is a deployment directly to a BIG-IP.",
25 | "$ref": "base.schema.json#"
26 | }
27 | },
28 | {
29 | "if": {
30 | "required": ["class"],
31 | "properties": { "class": { "const": "DO" } }
32 | },
33 | "then": {
34 | "description": "Indicates that this is a deployment through an intermediary like BIG-IQ.",
35 | "$ref": "remote.schema.json#"
36 | }
37 | }
38 | ]
39 | }
40 |
--------------------------------------------------------------------------------
/src/schema/1.33.0/definitions.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/src/schema/latest/definitions.schema.json",
4 | "title": "F5 BIG-IP Declarative Onboarding Definitions declaration",
5 | "description": "Shared definitions for onboarding a BIG-IP.",
6 | "type": "object",
7 | "definitions": {
8 | "F5string": {
9 | "description": "String value in base64",
10 | "type": "object",
11 | "properties": {
12 | "base64": {
13 | "description": "Base64-encoded value (in JSON string)",
14 | "type": "string",
15 | "format": "f5base64"
16 | }
17 | }
18 | },
19 | "pkiCertificate": {
20 | "description": "PKI certificate with optional chain",
21 | "required": ["certificate"],
22 | "properties": {
23 | "certificate": {
24 | "description": "X.509 public-key certificate",
25 | "allOf": [
26 | { "$ref": "#/definitions/F5string" }
27 | ]
28 | },
29 | "privateKey": {
30 | "description": "Private key matching certificate's public key (optional)",
31 | "allOf": [
32 | { "$ref": "#/definitions/F5string" }
33 | ]
34 | }
35 | }
36 | },
37 | "Label": {
38 | "title": "Label",
39 | "description": "Optional friendly name for this object",
40 | "type": "string",
41 | "format": "f5label"
42 | },
43 | "Remark": {
44 | "title": "Remark",
45 | "description": "Arbitrary (brief) text pertaining to this object (optional)",
46 | "type": "string",
47 | "format": "f5remark"
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/src/schema/1.33.0/do.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/src/schema/latest/do.schema.json",
4 | "title": "F5 BIG-IP Declarative Onboarding base declaration",
5 | "description": "Schema for onboarding a BIG-IP.",
6 | "type": "object",
7 | "required": ["class"],
8 | "properties": {
9 | "class": {
10 | "description": "Top level class. Indicates whether this is a deployment directly to a BIG-IP or to some other system such as BIG-IQ.",
11 | "enum": [
12 | "Device",
13 | "DO"
14 | ]
15 | }
16 | },
17 | "allOf": [
18 | {
19 | "if": {
20 | "required": ["class"],
21 | "properties": { "class": { "const": "Device" } }
22 | },
23 | "then": {
24 | "description": "Indicates that this is a deployment directly to a BIG-IP.",
25 | "$ref": "base.schema.json#"
26 | }
27 | },
28 | {
29 | "if": {
30 | "required": ["class"],
31 | "properties": { "class": { "const": "DO" } }
32 | },
33 | "then": {
34 | "description": "Indicates that this is a deployment through an intermediary like BIG-IQ.",
35 | "$ref": "remote.schema.json#"
36 | }
37 | }
38 | ]
39 | }
40 |
--------------------------------------------------------------------------------
/src/schema/1.34.0/definitions.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/src/schema/latest/definitions.schema.json",
4 | "title": "F5 BIG-IP Declarative Onboarding Definitions declaration",
5 | "description": "Shared definitions for onboarding a BIG-IP.",
6 | "type": "object",
7 | "definitions": {
8 | "F5string": {
9 | "description": "String value in base64",
10 | "type": "object",
11 | "properties": {
12 | "base64": {
13 | "description": "Base64-encoded value (in JSON string)",
14 | "type": "string",
15 | "format": "f5base64"
16 | }
17 | }
18 | },
19 | "pkiCertificate": {
20 | "description": "PKI certificate with optional chain",
21 | "required": ["certificate"],
22 | "properties": {
23 | "certificate": {
24 | "description": "X.509 public-key certificate",
25 | "allOf": [
26 | { "$ref": "#/definitions/F5string" }
27 | ]
28 | },
29 | "privateKey": {
30 | "description": "Private key matching certificate's public key (optional)",
31 | "allOf": [
32 | { "$ref": "#/definitions/F5string" }
33 | ]
34 | }
35 | }
36 | },
37 | "Label": {
38 | "title": "Label",
39 | "description": "Optional friendly name for this object",
40 | "type": "string",
41 | "format": "f5label"
42 | },
43 | "Remark": {
44 | "title": "Remark",
45 | "description": "Arbitrary (brief) text pertaining to this object (optional)",
46 | "type": "string",
47 | "format": "f5remark"
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/src/schema/1.34.0/do.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/src/schema/latest/do.schema.json",
4 | "title": "F5 BIG-IP Declarative Onboarding base declaration",
5 | "description": "Schema for onboarding a BIG-IP.",
6 | "type": "object",
7 | "required": ["class"],
8 | "properties": {
9 | "class": {
10 | "description": "Top level class. Indicates whether this is a deployment directly to a BIG-IP or to some other system such as BIG-IQ.",
11 | "enum": [
12 | "Device",
13 | "DO"
14 | ]
15 | }
16 | },
17 | "allOf": [
18 | {
19 | "if": {
20 | "required": ["class"],
21 | "properties": { "class": { "const": "Device" } }
22 | },
23 | "then": {
24 | "description": "Indicates that this is a deployment directly to a BIG-IP.",
25 | "$ref": "base.schema.json#"
26 | }
27 | },
28 | {
29 | "if": {
30 | "required": ["class"],
31 | "properties": { "class": { "const": "DO" } }
32 | },
33 | "then": {
34 | "description": "Indicates that this is a deployment through an intermediary like BIG-IQ.",
35 | "$ref": "remote.schema.json#"
36 | }
37 | }
38 | ]
39 | }
40 |
--------------------------------------------------------------------------------
/src/schema/1.35.0/definitions.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/src/schema/latest/definitions.schema.json",
4 | "title": "F5 BIG-IP Declarative Onboarding Definitions declaration",
5 | "description": "Shared definitions for onboarding a BIG-IP.",
6 | "type": "object",
7 | "definitions": {
8 | "F5string": {
9 | "description": "String value in base64",
10 | "type": "object",
11 | "properties": {
12 | "base64": {
13 | "description": "Base64-encoded value (in JSON string)",
14 | "type": "string",
15 | "format": "f5base64"
16 | }
17 | }
18 | },
19 | "pkiCertificate": {
20 | "description": "PKI certificate with optional chain",
21 | "required": ["certificate"],
22 | "properties": {
23 | "certificate": {
24 | "description": "X.509 public-key certificate",
25 | "allOf": [
26 | { "$ref": "#/definitions/F5string" }
27 | ]
28 | },
29 | "privateKey": {
30 | "description": "Private key matching certificate's public key (optional)",
31 | "allOf": [
32 | { "$ref": "#/definitions/F5string" }
33 | ]
34 | }
35 | }
36 | },
37 | "Label": {
38 | "title": "Label",
39 | "description": "Optional friendly name for this object",
40 | "type": "string",
41 | "format": "f5label"
42 | },
43 | "Remark": {
44 | "title": "Remark",
45 | "description": "Arbitrary (brief) text pertaining to this object (optional)",
46 | "type": "string",
47 | "format": "f5remark"
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/src/schema/1.35.0/do.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/src/schema/latest/do.schema.json",
4 | "title": "F5 BIG-IP Declarative Onboarding base declaration",
5 | "description": "Schema for onboarding a BIG-IP.",
6 | "type": "object",
7 | "required": ["class"],
8 | "properties": {
9 | "class": {
10 | "description": "Top level class. Indicates whether this is a deployment directly to a BIG-IP or to some other system such as BIG-IQ.",
11 | "enum": [
12 | "Device",
13 | "DO"
14 | ]
15 | }
16 | },
17 | "allOf": [
18 | {
19 | "if": {
20 | "required": ["class"],
21 | "properties": { "class": { "const": "Device" } }
22 | },
23 | "then": {
24 | "description": "Indicates that this is a deployment directly to a BIG-IP.",
25 | "$ref": "base.schema.json#"
26 | }
27 | },
28 | {
29 | "if": {
30 | "required": ["class"],
31 | "properties": { "class": { "const": "DO" } }
32 | },
33 | "then": {
34 | "description": "Indicates that this is a deployment through an intermediary like BIG-IQ.",
35 | "$ref": "remote.schema.json#"
36 | }
37 | }
38 | ]
39 | }
40 |
--------------------------------------------------------------------------------
/src/schema/1.36.0/definitions.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/src/schema/latest/definitions.schema.json",
4 | "title": "F5 BIG-IP Declarative Onboarding Definitions declaration",
5 | "description": "Shared definitions for onboarding a BIG-IP.",
6 | "type": "object",
7 | "definitions": {
8 | "F5string": {
9 | "description": "String value in base64",
10 | "type": "object",
11 | "properties": {
12 | "base64": {
13 | "description": "Base64-encoded value (in JSON string)",
14 | "type": "string",
15 | "format": "f5base64"
16 | }
17 | }
18 | },
19 | "pkiCertificate": {
20 | "description": "PKI certificate with optional chain",
21 | "required": ["certificate"],
22 | "properties": {
23 | "certificate": {
24 | "description": "X.509 public-key certificate",
25 | "allOf": [
26 | { "$ref": "#/definitions/F5string" }
27 | ]
28 | },
29 | "privateKey": {
30 | "description": "Private key matching certificate's public key (optional)",
31 | "allOf": [
32 | { "$ref": "#/definitions/F5string" }
33 | ]
34 | }
35 | }
36 | },
37 | "Label": {
38 | "title": "Label",
39 | "description": "Optional friendly name for this object",
40 | "type": "string",
41 | "format": "f5label"
42 | },
43 | "Remark": {
44 | "title": "Remark",
45 | "description": "Arbitrary (brief) text pertaining to this object (optional)",
46 | "type": "string",
47 | "format": "f5remark"
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/src/schema/1.36.0/do.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/src/schema/latest/do.schema.json",
4 | "title": "F5 BIG-IP Declarative Onboarding base declaration",
5 | "description": "Schema for onboarding a BIG-IP.",
6 | "type": "object",
7 | "required": ["class"],
8 | "properties": {
9 | "class": {
10 | "description": "Top level class. Indicates whether this is a deployment directly to a BIG-IP or to some other system such as BIG-IQ.",
11 | "enum": [
12 | "Device",
13 | "DO"
14 | ]
15 | }
16 | },
17 | "allOf": [
18 | {
19 | "if": {
20 | "required": ["class"],
21 | "properties": { "class": { "const": "Device" } }
22 | },
23 | "then": {
24 | "description": "Indicates that this is a deployment directly to a BIG-IP.",
25 | "$ref": "base.schema.json#"
26 | }
27 | },
28 | {
29 | "if": {
30 | "required": ["class"],
31 | "properties": { "class": { "const": "DO" } }
32 | },
33 | "then": {
34 | "description": "Indicates that this is a deployment through an intermediary like BIG-IQ.",
35 | "$ref": "remote.schema.json#"
36 | }
37 | }
38 | ]
39 | }
40 |
--------------------------------------------------------------------------------
/src/schema/1.37.0/definitions.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/src/schema/latest/definitions.schema.json",
4 | "title": "F5 BIG-IP Declarative Onboarding Definitions declaration",
5 | "description": "Shared definitions for onboarding a BIG-IP.",
6 | "type": "object",
7 | "definitions": {
8 | "F5string": {
9 | "description": "String value in base64",
10 | "type": "object",
11 | "properties": {
12 | "base64": {
13 | "description": "Base64-encoded value (in JSON string)",
14 | "type": "string",
15 | "format": "f5base64"
16 | }
17 | }
18 | },
19 | "pkiCertificate": {
20 | "description": "PKI certificate with optional chain",
21 | "required": ["certificate"],
22 | "properties": {
23 | "certificate": {
24 | "description": "X.509 public-key certificate",
25 | "allOf": [
26 | { "$ref": "#/definitions/F5string" }
27 | ]
28 | },
29 | "privateKey": {
30 | "description": "Private key matching certificate's public key (optional)",
31 | "allOf": [
32 | { "$ref": "#/definitions/F5string" }
33 | ]
34 | }
35 | }
36 | },
37 | "Label": {
38 | "title": "Label",
39 | "description": "Optional friendly name for this object",
40 | "type": "string",
41 | "format": "f5label"
42 | },
43 | "Remark": {
44 | "title": "Remark",
45 | "description": "Arbitrary (brief) text pertaining to this object (optional)",
46 | "type": "string",
47 | "format": "f5remark"
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/src/schema/1.37.0/do.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/src/schema/latest/do.schema.json",
4 | "title": "F5 BIG-IP Declarative Onboarding base declaration",
5 | "description": "Schema for onboarding a BIG-IP.",
6 | "type": "object",
7 | "required": ["class"],
8 | "properties": {
9 | "class": {
10 | "description": "Top level class. Indicates whether this is a deployment directly to a BIG-IP or to some other system such as BIG-IQ.",
11 | "enum": [
12 | "Device",
13 | "DO"
14 | ]
15 | }
16 | },
17 | "allOf": [
18 | {
19 | "if": {
20 | "required": ["class"],
21 | "properties": { "class": { "const": "Device" } }
22 | },
23 | "then": {
24 | "description": "Indicates that this is a deployment directly to a BIG-IP.",
25 | "$ref": "base.schema.json#"
26 | }
27 | },
28 | {
29 | "if": {
30 | "required": ["class"],
31 | "properties": { "class": { "const": "DO" } }
32 | },
33 | "then": {
34 | "description": "Indicates that this is a deployment through an intermediary like BIG-IQ.",
35 | "$ref": "remote.schema.json#"
36 | }
37 | }
38 | ]
39 | }
40 |
--------------------------------------------------------------------------------
/src/schema/1.38.0/do.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/src/schema/latest/do.schema.json",
4 | "title": "F5 BIG-IP Declarative Onboarding base declaration",
5 | "description": "Schema for onboarding a BIG-IP.",
6 | "type": "object",
7 | "required": ["class"],
8 | "properties": {
9 | "class": {
10 | "description": "Top level class. Indicates whether this is a deployment directly to a BIG-IP or to some other system such as BIG-IQ.",
11 | "enum": [
12 | "Device",
13 | "DO"
14 | ]
15 | }
16 | },
17 | "allOf": [
18 | {
19 | "if": {
20 | "required": ["class"],
21 | "properties": { "class": { "const": "Device" } }
22 | },
23 | "then": {
24 | "description": "Indicates that this is a deployment directly to a BIG-IP.",
25 | "$ref": "base.schema.json#"
26 | }
27 | },
28 | {
29 | "if": {
30 | "required": ["class"],
31 | "properties": { "class": { "const": "DO" } }
32 | },
33 | "then": {
34 | "description": "Indicates that this is a deployment through an intermediary like BIG-IQ.",
35 | "$ref": "remote.schema.json#"
36 | }
37 | }
38 | ]
39 | }
40 |
--------------------------------------------------------------------------------
/src/schema/1.39.0/do.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/main/src/schema/latest/do.schema.json",
4 | "title": "F5 BIG-IP Declarative Onboarding base declaration",
5 | "description": "Schema for onboarding a BIG-IP.",
6 | "type": "object",
7 | "required": ["class"],
8 | "properties": {
9 | "class": {
10 | "description": "Top level class. Indicates whether this is a deployment directly to a BIG-IP or to some other system such as BIG-IQ.",
11 | "enum": [
12 | "Device",
13 | "DO"
14 | ]
15 | }
16 | },
17 | "allOf": [
18 | {
19 | "if": {
20 | "required": ["class"],
21 | "properties": { "class": { "const": "Device" } }
22 | },
23 | "then": {
24 | "description": "Indicates that this is a deployment directly to a BIG-IP.",
25 | "$ref": "base.schema.json#"
26 | }
27 | },
28 | {
29 | "if": {
30 | "required": ["class"],
31 | "properties": { "class": { "const": "DO" } }
32 | },
33 | "then": {
34 | "description": "Indicates that this is a deployment through an intermediary like BIG-IQ.",
35 | "$ref": "remote.schema.json#"
36 | }
37 | }
38 | ]
39 | }
40 |
--------------------------------------------------------------------------------
/src/schema/1.40.0/do.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/main/src/schema/latest/do.schema.json",
4 | "title": "F5 BIG-IP Declarative Onboarding base declaration",
5 | "description": "Schema for onboarding a BIG-IP.",
6 | "type": "object",
7 | "required": ["class"],
8 | "properties": {
9 | "class": {
10 | "description": "Top level class. Indicates whether this is a deployment directly to a BIG-IP or to some other system such as BIG-IQ.",
11 | "enum": [
12 | "Device",
13 | "DO"
14 | ]
15 | }
16 | },
17 | "allOf": [
18 | {
19 | "if": {
20 | "required": ["class"],
21 | "properties": { "class": { "const": "Device" } }
22 | },
23 | "then": {
24 | "description": "Indicates that this is a deployment directly to a BIG-IP.",
25 | "$ref": "base.schema.json#"
26 | }
27 | },
28 | {
29 | "if": {
30 | "required": ["class"],
31 | "properties": { "class": { "const": "DO" } }
32 | },
33 | "then": {
34 | "description": "Indicates that this is a deployment through an intermediary like BIG-IQ.",
35 | "$ref": "remote.schema.json#"
36 | }
37 | }
38 | ]
39 | }
40 |
--------------------------------------------------------------------------------
/src/schema/1.41.0/do.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/main/src/schema/latest/do.schema.json",
4 | "title": "F5 BIG-IP Declarative Onboarding base declaration",
5 | "description": "Schema for onboarding a BIG-IP.",
6 | "type": "object",
7 | "required": ["class"],
8 | "properties": {
9 | "class": {
10 | "description": "Top level class. Indicates whether this is a deployment directly to a BIG-IP or to some other system such as BIG-IQ.",
11 | "enum": [
12 | "Device",
13 | "DO"
14 | ]
15 | }
16 | },
17 | "allOf": [
18 | {
19 | "if": {
20 | "required": ["class"],
21 | "properties": { "class": { "const": "Device" } }
22 | },
23 | "then": {
24 | "description": "Indicates that this is a deployment directly to a BIG-IP.",
25 | "$ref": "base.schema.json#"
26 | }
27 | },
28 | {
29 | "if": {
30 | "required": ["class"],
31 | "properties": { "class": { "const": "DO" } }
32 | },
33 | "then": {
34 | "description": "Indicates that this is a deployment through an intermediary like BIG-IQ.",
35 | "$ref": "remote.schema.json#"
36 | }
37 | }
38 | ]
39 | }
40 |
--------------------------------------------------------------------------------
/src/schema/1.42.0/do.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/main/src/schema/latest/do.schema.json",
4 | "title": "F5 BIG-IP Declarative Onboarding base declaration",
5 | "description": "Schema for onboarding a BIG-IP.",
6 | "type": "object",
7 | "required": ["class"],
8 | "properties": {
9 | "class": {
10 | "description": "Top level class. Indicates whether this is a deployment directly to a BIG-IP or to some other system such as BIG-IQ.",
11 | "enum": [
12 | "Device",
13 | "DO"
14 | ]
15 | }
16 | },
17 | "allOf": [
18 | {
19 | "if": {
20 | "required": ["class"],
21 | "properties": { "class": { "const": "Device" } }
22 | },
23 | "then": {
24 | "description": "Indicates that this is a deployment directly to a BIG-IP.",
25 | "$ref": "base.schema.json#"
26 | }
27 | },
28 | {
29 | "if": {
30 | "required": ["class"],
31 | "properties": { "class": { "const": "DO" } }
32 | },
33 | "then": {
34 | "description": "Indicates that this is a deployment through an intermediary like BIG-IQ.",
35 | "$ref": "remote.schema.json#"
36 | }
37 | }
38 | ]
39 | }
40 |
--------------------------------------------------------------------------------
/src/schema/1.43.0/do.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/main/src/schema/latest/do.schema.json",
4 | "title": "F5 BIG-IP Declarative Onboarding base declaration",
5 | "description": "Schema for onboarding a BIG-IP.",
6 | "type": "object",
7 | "required": ["class"],
8 | "properties": {
9 | "class": {
10 | "description": "Top level class. Indicates whether this is a deployment directly to a BIG-IP or to some other system such as BIG-IQ.",
11 | "enum": [
12 | "Device",
13 | "DO"
14 | ]
15 | }
16 | },
17 | "allOf": [
18 | {
19 | "if": {
20 | "required": ["class"],
21 | "properties": { "class": { "const": "Device" } }
22 | },
23 | "then": {
24 | "description": "Indicates that this is a deployment directly to a BIG-IP.",
25 | "$ref": "base.schema.json#"
26 | }
27 | },
28 | {
29 | "if": {
30 | "required": ["class"],
31 | "properties": { "class": { "const": "DO" } }
32 | },
33 | "then": {
34 | "description": "Indicates that this is a deployment through an intermediary like BIG-IQ.",
35 | "$ref": "remote.schema.json#"
36 | }
37 | }
38 | ]
39 | }
40 |
--------------------------------------------------------------------------------
/src/schema/1.44.0/do.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/main/src/schema/latest/do.schema.json",
4 | "title": "F5 BIG-IP Declarative Onboarding base declaration",
5 | "description": "Schema for onboarding a BIG-IP.",
6 | "type": "object",
7 | "required": ["class"],
8 | "properties": {
9 | "class": {
10 | "description": "Top level class. Indicates whether this is a deployment directly to a BIG-IP or to some other system such as BIG-IQ.",
11 | "enum": [
12 | "Device",
13 | "DO"
14 | ]
15 | }
16 | },
17 | "allOf": [
18 | {
19 | "if": {
20 | "required": ["class"],
21 | "properties": { "class": { "const": "Device" } }
22 | },
23 | "then": {
24 | "description": "Indicates that this is a deployment directly to a BIG-IP.",
25 | "$ref": "base.schema.json#"
26 | }
27 | },
28 | {
29 | "if": {
30 | "required": ["class"],
31 | "properties": { "class": { "const": "DO" } }
32 | },
33 | "then": {
34 | "description": "Indicates that this is a deployment through an intermediary like BIG-IQ.",
35 | "$ref": "remote.schema.json#"
36 | }
37 | }
38 | ]
39 | }
40 |
--------------------------------------------------------------------------------
/src/schema/1.45.0/do.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/main/src/schema/latest/do.schema.json",
4 | "title": "F5 BIG-IP Declarative Onboarding base declaration",
5 | "description": "Schema for onboarding a BIG-IP.",
6 | "type": "object",
7 | "required": ["class"],
8 | "properties": {
9 | "class": {
10 | "description": "Top level class. Indicates whether this is a deployment directly to a BIG-IP or to some other system such as BIG-IQ.",
11 | "enum": [
12 | "Device",
13 | "DO"
14 | ]
15 | }
16 | },
17 | "allOf": [
18 | {
19 | "if": {
20 | "required": ["class"],
21 | "properties": { "class": { "const": "Device" } }
22 | },
23 | "then": {
24 | "description": "Indicates that this is a deployment directly to a BIG-IP.",
25 | "$ref": "base.schema.json#"
26 | }
27 | },
28 | {
29 | "if": {
30 | "required": ["class"],
31 | "properties": { "class": { "const": "DO" } }
32 | },
33 | "then": {
34 | "description": "Indicates that this is a deployment through an intermediary like BIG-IQ.",
35 | "$ref": "remote.schema.json#"
36 | }
37 | }
38 | ]
39 | }
40 |
--------------------------------------------------------------------------------
/src/schema/1.46.0/do.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/main/src/schema/latest/do.schema.json",
4 | "title": "F5 BIG-IP Declarative Onboarding base declaration",
5 | "description": "Schema for onboarding a BIG-IP.",
6 | "type": "object",
7 | "required": ["class"],
8 | "properties": {
9 | "class": {
10 | "description": "Top level class. Indicates whether this is a deployment directly to a BIG-IP or to some other system such as BIG-IQ.",
11 | "enum": [
12 | "Device",
13 | "DO"
14 | ]
15 | }
16 | },
17 | "allOf": [
18 | {
19 | "if": {
20 | "required": ["class"],
21 | "properties": { "class": { "const": "Device" } }
22 | },
23 | "then": {
24 | "description": "Indicates that this is a deployment directly to a BIG-IP.",
25 | "$ref": "base.schema.json#"
26 | }
27 | },
28 | {
29 | "if": {
30 | "required": ["class"],
31 | "properties": { "class": { "const": "DO" } }
32 | },
33 | "then": {
34 | "description": "Indicates that this is a deployment through an intermediary like BIG-IQ.",
35 | "$ref": "remote.schema.json#"
36 | }
37 | }
38 | ]
39 | }
40 |
--------------------------------------------------------------------------------
/src/schema/latest/do.schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/main/src/schema/latest/do.schema.json",
4 | "title": "F5 BIG-IP Declarative Onboarding base declaration",
5 | "description": "Schema for onboarding a BIG-IP.",
6 | "type": "object",
7 | "required": ["class"],
8 | "properties": {
9 | "class": {
10 | "description": "Top level class. Indicates whether this is a deployment directly to a BIG-IP or to some other system such as BIG-IQ.",
11 | "enum": [
12 | "Device",
13 | "DO"
14 | ]
15 | }
16 | },
17 | "allOf": [
18 | {
19 | "if": {
20 | "required": ["class"],
21 | "properties": { "class": { "const": "Device" } }
22 | },
23 | "then": {
24 | "description": "Indicates that this is a deployment directly to a BIG-IP.",
25 | "$ref": "base.schema.json#"
26 | }
27 | },
28 | {
29 | "if": {
30 | "required": ["class"],
31 | "properties": { "class": { "const": "DO" } }
32 | },
33 | "then": {
34 | "description": "Indicates that this is a deployment through an intermediary like BIG-IQ.",
35 | "$ref": "remote.schema.json#"
36 | }
37 | }
38 | ]
39 | }
40 |
--------------------------------------------------------------------------------
/src/scripts/decryptConfValue:
--------------------------------------------------------------------------------
1 | #!/usr/bin/php
2 | if (sizeof($argv) != 3) {
3 | echo \"usage: $argv[0] \n\";
4 | return -1;
5 | }
6 |
7 | $encrypted_value_str = $argv[1];
8 | $output_file = $argv[2];
9 |
10 | $encrypted_value_array = explode(\",\", $encrypted_value_str);
11 | $file_handle = fopen($output_file, "w") or die(\"Unable to open file {$output_file}\");
12 |
13 | coapi_login("admin");
14 | $query_result = coapi_query("master_key");
15 | $row = coapi_fetch($query_result);
16 | $master_key = $row["master_key"];
17 | foreach($encrypted_value_array as &$encrypted_value) {
18 | $plain = f5_decrypt_string($encrypted_value, $master_key);
19 | fwrite($file_handle, $plain);
20 | }
21 | fclose($file_handle);
22 | return 0;
23 |
--------------------------------------------------------------------------------
/stryker.conf.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const config = {
4 | packageManager: 'npm',
5 | reporters: ['html', 'progress'],
6 | testRunner: 'mocha',
7 | coverageAnalysis: 'perTest',
8 | mutate: ['src/**/*.js', '!src/schema/!(latest)/*.js'],
9 | mochaOptions: {
10 | spec: ['test/unit/**/*.js']
11 | },
12 | ignoreStatic: true
13 | };
14 |
15 | try {
16 | const badgeReporterPath = require.resolve('stryker-mutator-badge-reporter');
17 | config.plugins = ['@stryker-mutator/*', badgeReporterPath];
18 | config.reporters.push('badge');
19 | config.badgeReporter = {
20 | label: 'mutation'
21 | };
22 | } catch (e) {
23 | // ignore failure
24 | }
25 |
26 | module.exports = config;
27 |
--------------------------------------------------------------------------------
/test/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "rules": {
3 | "no-console": "off"
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/test/env/terraform/modules/utils/main.tf:
--------------------------------------------------------------------------------
1 | resource "random_string" "env_prefix" {
2 | length = 8
3 | upper = false
4 | special = false
5 | }
6 |
7 | resource "random_string" "admin_password" {
8 | length = 16
9 | min_upper = 1
10 | min_lower = 1
11 | min_numeric = 1
12 | special = false
13 | }
14 |
15 | output "env_prefix" {
16 | value = random_string.env_prefix.result
17 | }
18 |
19 | output "admin_password" {
20 | value = random_string.admin_password.result
21 | }
22 |
--------------------------------------------------------------------------------
/test/env/terraform/onboard.yaml:
--------------------------------------------------------------------------------
1 | #cloud-config
2 |
3 | write_files:
4 | - path: /config/initialConfig.sh
5 | permissions: 0755
6 | owner: root:root
7 | content: |
8 | #!/bin/bash
9 |
10 | # Wait for MCPD to be up before running tmsh commands
11 | source /usr/lib/bigstart/bigip-ready-functions
12 | bigstart_wait mcpd ready
13 |
14 | # Begin BIG-IP configuration
15 | /usr/bin/passwd root ${admin_password} >/dev/null 2>&1
16 | /usr/bin/passwd admin ${admin_password} >/dev/null 2>&1
17 | /usr/bin/chage -M -1 admin
18 | tmsh modify auth user admin shell bash
19 | tmsh modify sys software update auto-phonehome disabled
20 | tmsh modify sys disk directory /appdata new-size 130985984
21 | tmsh save /sys config
22 |
23 | runcmd:
24 | # NOTE: Commands must be non-blocking
25 | # so send long running commands (polling/waiting for mcpd) to the background
26 | - /config/initialConfig.sh > /tmp/do_onboard.log &
27 |
--------------------------------------------------------------------------------
/test/env/terraform/plans/openstack/main.tf:
--------------------------------------------------------------------------------
1 | terraform {
2 | backend "http" {
3 | }
4 |
5 | required_providers {
6 | openstack = {
7 | source = "terraform-provider-openstack/openstack"
8 | version = "~> 1.42.0"
9 | }
10 | }
11 | }
12 |
13 | module "utils" {
14 | source = "../../modules/utils"
15 | }
16 |
17 | data "template_file" "user_data" {
18 | template = file("../../onboard.yaml")
19 | vars = {
20 | admin_password = module.utils.admin_password
21 | }
22 | }
23 |
24 | resource "openstack_compute_instance_v2" "openstack-instance" {
25 | count = var.bigip_count
26 | name = "do-bigip-${var.bigip_image}-${count.index}"
27 | image_name = var.bigip_image
28 | flavor_name = var.image_flavor
29 | security_groups = []
30 | config_drive = "true"
31 | user_data = data.template_file.user_data.rendered
32 |
33 | dynamic "network" {
34 | for_each = [ for i in range(1, var.nic_count + 1): {
35 | name = var.networks[i]
36 | }]
37 | content {
38 | name = network.value.name
39 | }
40 | }
41 |
42 | timeouts {
43 | create = "1h"
44 | delete = "1h"
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/test/env/terraform/plans/openstack/output.tf:
--------------------------------------------------------------------------------
1 | output "admin_ip" {
2 | value = "${openstack_compute_instance_v2.openstack-instance.*.access_ip_v4}"
3 | }
4 |
5 | output "admin_username" {
6 | value = var.admin_username
7 | }
8 |
9 | output "admin_password" {
10 | value = module.utils.admin_password
11 | }
12 |
--------------------------------------------------------------------------------
/test/env/terraform/plans/openstack/variables.tf:
--------------------------------------------------------------------------------
1 | # BIGIP image
2 | variable "bigip_image" {
3 | description = "BIGIP image to deploy"
4 | default = "BIGIP-14.1.4-0.0.11"
5 | }
6 |
7 | # Run parameters
8 | variable "admin_username" {
9 | description = "BIGIP fusername"
10 | default = "admin"
11 | }
12 |
13 | variable "nic_count" {
14 | description = "Number of NICs for BIGIP"
15 | default = 3
16 | }
17 |
18 | variable "bigip_count" {
19 | description = "Number of BIGIPs to deploy"
20 | default = 3
21 | }
22 |
23 | # VIO
24 | variable "image_flavor" {
25 | description = "The image flavor in VIO."
26 | default = "F5-BIGIP-medium"
27 | }
28 |
29 | variable "networks" {
30 | description = "Networks for BIGIP"
31 | default = {
32 | 1: "AdminNetwork2",
33 | 2: "vlan1010",
34 | 3: "vlan1011"
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/test/integration/bodies/bogus.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.0.0",
3 | "class": "Device",
4 | "async": true,
5 | "Common": {
6 | "class": "Tenant",
7 | "myVlan": {
8 | "class": "VLAN",
9 | "tag": 1234,
10 | "mtu": 5000,
11 | "interfaces": [
12 | {
13 | "name": "1.3",
14 | "tagged": true
15 | }
16 | ]
17 | },
18 | "myRoute": {
19 | "class": "Route",
20 | "gw": "10.147.75.1",
21 | "network": "0.0.0.0",
22 | "mtu": 1500
23 | },
24 | "mySystem": {
25 | "class": "System",
26 | "autoPhonehome": false
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/test/integration/bodies/licensing_big_iq.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.3.0",
3 | "class": "Device",
4 | "async": true,
5 | "Common": {
6 | "class": "Tenant",
7 | "myLicense": {
8 | "class": "License",
9 | "licenseType": "licensePool",
10 | "bigIqHost": "",
11 | "bigIqUsername": "",
12 | "bigIqPassword": "",
13 | "licensePool": "myLicense",
14 | "skuKeyword1": "F5-BIG-MSP-BR-3G",
15 | "unitOfMeasure": "hourly",
16 | "reachable": true,
17 | "bigIpUsername": "",
18 | "bigIpPassword": "",
19 | "chargebackTag": "foo-bar"
20 | },
21 | "mySystem": {
22 | "class": "System",
23 | "hostname": "do-integration-test.local",
24 | "autoPhonehome": false
25 | }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/test/integration/bodies/revoke_from_bigiq.json:
--------------------------------------------------------------------------------
1 | {
2 | "licensePoolName": "myOtherLicensePool",
3 | "command": "revoke",
4 | "address": "",
5 | "user": "",
6 | "password": ""
7 | }
8 |
--------------------------------------------------------------------------------
/test/integration/bodies/revoking_relicensing_big_iq.json:
--------------------------------------------------------------------------------
1 | {
2 | "schemaVersion": "1.3.0",
3 | "class": "Device",
4 | "async": true,
5 | "Common": {
6 | "class": "Tenant",
7 | "myLicense": {
8 | "class": "License",
9 | "licenseType": "licensePool",
10 | "bigIqHost": "",
11 | "bigIqUsername": "",
12 | "bigIqPassword": "",
13 | "revokeFrom": "myLicense",
14 | "licensePool": "myOtherLicensePool",
15 | "reachable": true,
16 | "bigIpUsername": "",
17 | "bigIpPassword": ""
18 | },
19 | "mySystem": {
20 | "class": "System",
21 | "autoPhonehome": false
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/test/integration/constants.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright 2024 F5, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | /**
18 | * Useful constants shared
19 | */
20 |
21 | 'use strict';
22 |
23 | module.exports = Object.freeze({
24 | HTTP_SUCCESS: 200,
25 | HTTP_ACCEPTED: 202,
26 | HTTP_BAD_REQUEST: 400,
27 | HTTP_UNAUTHORIZED: 401,
28 | HTTP_NOTFOUND: 404,
29 | HTTP_UNPROCESSABLE: 422,
30 | HTTP_UNAVAILABLE: 503,
31 | ICONTROL_API: '/mgmt',
32 | PORT: 443,
33 | DO_API: '/mgmt/shared/declarative-onboarding'
34 | });
35 |
--------------------------------------------------------------------------------
/test/integration/property/propertiesNetAddressList.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright 2024 F5, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | 'use strict';
18 |
19 | const cloudUtil = require('@f5devcentral/f5-cloud-libs').util;
20 | const {
21 | assertClass,
22 | getBigIpVersion
23 | } = require('./propertiesCommon');
24 |
25 | describe('Net Address List', function testNetAddressListClass() {
26 | this.timeout(480000);
27 |
28 | it('All properties', function testNetAddressList() {
29 | if (cloudUtil.versionCompare(getBigIpVersion(), '14.0') < 0) {
30 | this.skip();
31 | }
32 |
33 | const addresses = [
34 | '10.0.0.10',
35 | '10.0.1.10-10.0.2.10',
36 | '10.0.2.0/24',
37 | 'fd00:4153:3300::a',
38 | 'fd00:4153:3300::b-fd00:4153:3300::f',
39 | 'fd00:4153:6600::/54'
40 | ];
41 |
42 | const properties = [
43 | {
44 | name: 'remark',
45 | inputValue: [undefined, 'description', undefined],
46 | expectedValue: ['none', 'description', 'none'],
47 | extractFunction: (o) => o.description || 'none'
48 | },
49 | {
50 | name: 'addresses',
51 | inputValue: [['10.0.0.10'], addresses, ['10.0.0.10']],
52 | expectedValue: [
53 | [{ name: '10.0.0.10' }],
54 | addresses.map((a) => ({ name: a })),
55 | [{ name: '10.0.0.10' }]
56 | ]
57 | }
58 | ];
59 |
60 | return assertClass('NetAddressList', properties, {});
61 | });
62 | });
63 |
--------------------------------------------------------------------------------
/test/integration/property/propertiesNetPortList.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright 2024 F5, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | 'use strict';
18 |
19 | const cloudUtil = require('@f5devcentral/f5-cloud-libs').util;
20 | const {
21 | assertClass,
22 | getBigIpVersion
23 | } = require('./propertiesCommon');
24 |
25 | describe('Net Port List', function testNetPortListClass() {
26 | this.timeout(480000);
27 |
28 | it('All properties', function testNetPortList() {
29 | if (cloudUtil.versionCompare(getBigIpVersion(), '14.0') < 0) {
30 | this.skip();
31 | }
32 | const ports = [81, '90', '8080-8090'];
33 |
34 | const properties = [
35 | {
36 | name: 'remark',
37 | inputValue: [undefined, 'description', undefined],
38 | expectedValue: ['none', 'description', 'none'],
39 | extractFunction: (o) => o.description || 'none'
40 | },
41 | {
42 | name: 'ports',
43 | inputValue: [[80], ports, [80]],
44 | expectedValue: [
45 | [{ name: '80' }],
46 | ports.map((p) => ({ name: p.toString() })),
47 | [{ name: '80' }]
48 | ]
49 | }
50 | ];
51 |
52 | return assertClass('NetPortList', properties, {});
53 | });
54 | });
55 |
--------------------------------------------------------------------------------
/test/mochaReporterConfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "reporterEnabled": "spec, xunit",
3 | "xunitReporterOptions": {
4 | "output": "test_report.xml"
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/test/unit/lib/stateMock.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright 2024 F5, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | 'use strict';
18 |
19 | module.exports = {
20 | getTask(taskId) {
21 | return this.tasks[taskId];
22 | },
23 | getTaskIds() {
24 | return Object.keys(this.tasks);
25 | },
26 | getCode(taskId) {
27 | return this.tasks[taskId].result.code;
28 | },
29 | getStatus(taskId) {
30 | return this.tasks[taskId].result.status;
31 | },
32 | getMessage(taskId) {
33 | return this.tasks[taskId].result.message;
34 | },
35 | getErrors(taskId) {
36 | return this.tasks[taskId].result.errors;
37 | },
38 | getWarnings(taskId) {
39 | return this.tasks[taskId].result.warnings;
40 | },
41 | getDeclaration(taskId) {
42 | return this.tasks[taskId].declaration;
43 | },
44 | getRequestOptions(taskId) {
45 | return this.tasks[taskId].requestOptions;
46 | },
47 | getCurrentConfig(taskId) {
48 | return this.tasks[taskId].currentConfig;
49 | },
50 | getOriginalConfig(taskId) {
51 | return this.tasks[taskId].originalConfig;
52 | },
53 | getLastUpdate(taskId) {
54 | return this.tasks[taskId].lastUpdate;
55 | },
56 | getOriginalConfigByTaskId(taskId) {
57 | return this.tasks[taskId].originalConfig;
58 | },
59 | getOriginalConfigByConfigId(machineId) {
60 | return this.originalConfig[machineId];
61 | },
62 | getOriginalConfigIds() {
63 | return Object.keys(this.originalConfig);
64 | },
65 | getTraceCurrent(taskId) {
66 | return this.tasks[taskId].traceCurrent;
67 | },
68 | getTraceDesired(taskId) {
69 | return this.tasks[taskId].traceDesired;
70 | },
71 | getTraceDiff(taskId) {
72 | return this.tasks[taskId].traceDiff;
73 | },
74 | hasTrace() {
75 | return true;
76 | }
77 | };
78 |
--------------------------------------------------------------------------------
/test/unit/schema/examplesTests.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright 2024 F5, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | 'use strict';
18 |
19 | const fs = require('fs');
20 | const assert = require('assert');
21 | const sinon = require('sinon');
22 | const doUtil = require('../../../src/lib/doUtil');
23 | const Validator = require('../../../src/lib/validator');
24 |
25 | const validator = new Validator();
26 |
27 | describe('examples', () => {
28 | const files = fs.readdirSync(`${__dirname}/../../../examples`)
29 | .filter((file) => file.endsWith('.json')); // This removes files like .swp from being tested
30 |
31 | beforeEach(() => {
32 | sinon.stub(doUtil, 'getCurrentPlatform').callsFake(() => Promise.resolve('BIG-IP'));
33 | });
34 |
35 | afterEach(() => {
36 | sinon.restore();
37 | });
38 |
39 | files.forEach((file) => {
40 | it(`should validate ${file}`, () => {
41 | let declaration = JSON.parse(fs.readFileSync(`${__dirname}/../../../examples/${file}`));
42 | // wrap the declaration if we need to
43 | if (declaration.class !== 'DO') {
44 | declaration = {
45 | declaration,
46 | class: 'DO'
47 | };
48 | }
49 | return validator.validate(declaration)
50 | .then((validation) => {
51 | assert.ok(validation.isValid, JSON.stringify(validation.errors, null, 4));
52 | });
53 | });
54 | });
55 | });
56 |
--------------------------------------------------------------------------------
/versions.json:
--------------------------------------------------------------------------------
1 | {
2 | "versionMetaTimestamp": 1540928503,
3 | "latestVersion": {
4 | "name": "1.44 (non-LTS)",
5 | "url": "/products/extensions/f5-declarative-onboarding/latest/"
6 | },
7 | "otherVersions": [
8 | { "name": "1.39.1 (LTS)", "url": "/products/extensions/f5-declarative-onboarding/1.39/"},
9 | { "name": "1.36.1 (LTS)", "url": "/products/extensions/f5-declarative-onboarding/1.36/" }
10 | ]
11 | }
--------------------------------------------------------------------------------