├── .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 |
24 | 29 |
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 | } --------------------------------------------------------------------------------