diff --git a/.gitignore b/.gitignore index 7344fb0..a5c180f 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,6 @@ __pycache__ # yaml build directory build + +# Visual Studio Code +.vscode/ diff --git a/README.md b/README.md index 335a54c..a696c14 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ -![Rubiks Logo](docs/logos/rubiks-logo-horizontal.png) +

+ +

# Rubiks - a kubernetes yaml file manager @@ -30,3 +32,4 @@ See also `rubiks help` for more information on how to use it - [Rubiks repositories and the .rubiks file](docs/Rubiks%20repositories%20and%20the%20.rubiks%20file.md) - [Examples](https://github.com/olx-global/rubiks-examples) - [Logo Variants](docs/logos/logos.md) +- [Classes Definitions](docs/rubiks.class.md) diff --git a/docs/rubiks.class.md b/docs/rubiks.class.md new file mode 100644 index 0000000..be6dcf1 --- /dev/null +++ b/docs/rubiks.class.md @@ -0,0 +1,1589 @@ +

+ +# Rubiks Object Index + +This document is automatically generated using the command `docgen` and describe all the object and types that can be used inside Rubiks to configure your cluster + +It is possible to generate this documentation locally running inside your rubiks repo `rubiks docgen`. + + +# Table of contents + +- [Formats](#formats) + - [Base64](#base64) + - [Command](#command) + - [Confidential](#confidential) + - [JSON](#json) + - [YAML](#yaml) +- [Types](#types) + - [ARN](#arn) + - [Boolean](#boolean) + - [CaseIdentifier](#caseidentifier) + - [ColonIdentifier](#colonidentifier) + - [Domain](#domain) + - [Enum](#enum) + - [IP](#ip) + - [IPv4](#ipv4) + - [IPv6](#ipv6) + - [Identifier](#identifier) + - [Integer](#integer) + - [List](#list) + - [NonEmpty](#nonempty) + - [NonZero](#nonzero) + - [Nullable](#nullable) + - [Number](#number) + - [Path](#path) + - [Positive](#positive) + - [String](#string) + - [SurgeSpec](#surgespec) + - [SystemIdentifier](#systemidentifier) +- [Objects](#objects) + - [AWSElasticBlockStore](#awselasticblockstore) + - [AWSLoadBalancerService](#awsloadbalancerservice) + - [BaseSelector](#baseselector) + - [ClusterIPService](#clusteripservice) + - [ClusterRole](#clusterrole) + - [ClusterRoleBinding](#clusterrolebinding) + - [ConfigMap](#configmap) + - [ContainerEnvBaseSpec](#containerenvbasespec) + - [ContainerEnvConfigMapSpec](#containerenvconfigmapspec) + - [ContainerEnvContainerResourceSpec](#containerenvcontainerresourcespec) + - [ContainerEnvPodFieldSpec](#containerenvpodfieldspec) + - [ContainerEnvSecretSpec](#containerenvsecretspec) + - [ContainerEnvSpec](#containerenvspec) + - [ContainerPort](#containerport) + - [ContainerProbeBaseSpec](#containerprobebasespec) + - [ContainerProbeHTTPSpec](#containerprobehttpspec) + - [ContainerProbeTCPPortSpec](#containerprobetcpportspec) + - [ContainerResourceEachSpec](#containerresourceeachspec) + - [ContainerResourceSpec](#containerresourcespec) + - [ContainerSpec](#containerspec) + - [ContainerVolumeMountSpec](#containervolumemountspec) + - [DCBaseUpdateStrategy](#dcbaseupdatestrategy) + - [DCConfigChangeTrigger](#dcconfigchangetrigger) + - [DCCustomParams](#dccustomparams) + - [DCCustomStrategy](#dccustomstrategy) + - [DCImageChangeTrigger](#dcimagechangetrigger) + - [DCLifecycleHook](#dclifecyclehook) + - [DCLifecycleNewPod](#dclifecyclenewpod) + - [DCRecreateParams](#dcrecreateparams) + - [DCRecreateStrategy](#dcrecreatestrategy) + - [DCRollingParams](#dcrollingparams) + - [DCRollingStrategy](#dcrollingstrategy) + - [DCTagImages](#dctagimages) + - [DCTrigger](#dctrigger) + - [DaemonSet](#daemonset) + - [Deployment](#deployment) + - [DeploymentConfig](#deploymentconfig) + - [DockerCredentials](#dockercredentials) + - [DplBaseUpdateStrategy](#dplbaseupdatestrategy) + - [DplRecreateStrategy](#dplrecreatestrategy) + - [DplRollingUpdateStrategy](#dplrollingupdatestrategy) + - [Group](#group) + - [Job](#job) + - [LifeCycle](#lifecycle) + - [LifeCycleExec](#lifecycleexec) + - [LifeCycleHTTP](#lifecyclehttp) + - [LifeCycleProbe](#lifecycleprobe) + - [MatchExpression](#matchexpression) + - [MatchExpressionsSelector](#matchexpressionsselector) + - [MatchLabelsSelector](#matchlabelsselector) + - [Namespace](#namespace) + - [PersistentVolume](#persistentvolume) + - [PersistentVolumeClaim](#persistentvolumeclaim) + - [PersistentVolumeRef](#persistentvolumeref) + - [PodImagePullSecret](#podimagepullsecret) + - [PodTemplateSpec](#podtemplatespec) + - [PodVolumeBaseSpec](#podvolumebasespec) + - [PodVolumeConfigMapSpec](#podvolumeconfigmapspec) + - [PodVolumeEmptyDirSpec](#podvolumeemptydirspec) + - [PodVolumeHostSpec](#podvolumehostspec) + - [PodVolumeItemMapper](#podvolumeitemmapper) + - [PodVolumePVCSpec](#podvolumepvcspec) + - [PodVolumeSecretSpec](#podvolumesecretspec) + - [PolicyBinding](#policybinding) + - [PolicyBindingRoleBinding](#policybindingrolebinding) + - [PolicyRule](#policyrule) + - [Project](#project) + - [ReplicationController](#replicationcontroller) + - [Role](#role) + - [RoleBinding](#rolebinding) + - [RoleRef](#roleref) + - [RoleSubject](#rolesubject) + - [Route](#route) + - [RouteDest](#routedest) + - [RouteDestPort](#routedestport) + - [RouteDestService](#routedestservice) + - [RouteTLS](#routetls) + - [SAImgPullSecretSubject](#saimgpullsecretsubject) + - [SASecretSubject](#sasecretsubject) + - [SCCGroupRange](#sccgrouprange) + - [SCCGroups](#sccgroups) + - [SCCRunAsUser](#sccrunasuser) + - [SCCSELinux](#sccselinux) + - [Secret](#secret) + - [SecurityContext](#securitycontext) + - [SecurityContextConstraints](#securitycontextconstraints) + - [Service](#service) + - [ServiceAccount](#serviceaccount) + - [ServicePort](#serviceport) + - [StorageClass](#storageclass) + - [TLSCredentials](#tlscredentials) + - [User](#user) + +# Formats + +## Base64 + + +It is representing a [base64](https://en.wikipedia.org/wiki/Base64) encoded strign + + +## Command + + +It is representing a docker command to be executed by kubernetes in the process of spinning up a new Pod + + +## Confidential + + +It is representing a confidential/secret string that needs to not be displayed publicly + + +## JSON + + +It is representing a [JSON](https://en.wikipedia.org/wiki/JSON) object + + +## YAML + + +It is representing a [YAML](https://en.wikipedia.org/wiki/YAML) object + + + +# Types + +## ARN + + +Amazon Resource Names (ARNs) uniquely identify AWS resources. + +The following are the general formats for ARNs; the specific components and values used depend on the AWS service. + +``` +arn:partition:service:region:account-id:resource +arn:partition:service:region:account-id:resourcetype/resource +arn:partition:service:region:account-id:resourcetype:resource +``` + +**partition** + +The partition that the resource is in. For standard AWS regions, the partition is aws. If you have resources in other partitions, the partition is aws-partitionname. For example, the partition for resources in the China (Beijing) region is aws-cn. + +**service** + +The service namespace that identifies the AWS product (for example, Amazon S3, IAM, or Amazon RDS). For a list of namespaces, see AWS Service Namespaces. + +**region** + +The region the resource resides in. Note that the ARNs for some resources do not require a region, so this component might be omitted. + +**account** + +The ID of the AWS account that owns the resource, without the hyphens. For example, 123456789012. Note that the ARNs for some resources don't require an account number, so this component might be omitted. + +**resource, resourcetype:resource, or resourcetype/resource** + +The content of this part of the ARN varies by service. It often includes an indicator of the type of resource—for example, an IAM user or Amazon RDS database —followed by a slash (/) or a colon (:), followed by the resource name itself. Some services allow paths for resource names, as described in Paths in ARNs. + + +## Boolean + + +Boolean, or boolean logic, is a subset of algebra used for creating true/false statements. +Boolean expressions use the operators AND, OR, XOR, and NOT to compare values and return a true or false result. + + +## CaseIdentifier + + +An Identifier should be shorten thsn 253 chars and alphanum or . or - + + +## ColonIdentifier + + +An Identifier should be shorten than 253 chars and lc alphanum or . or - or : + + +## Domain + + +The definitive descriptions of the rules for forming domain names appear in [RFC 1035](https://tools.ietf.org/html/rfc1035), [RFC 1123](https://tools.ietf.org/html/rfc1123), and [RFC 2181](https://tools.ietf.org/html/rfc2181). A domain name consists of one or more parts, technically called labels, that are conventionally concatenated, and delimited by dots, such as `example.com`. + +The right-most label conveys the top-level domain; for example, the domain name `www.example.com` belongs to the top-level domain `com`. + +The hierarchy of domains descends from right to left; each label to the left specifies a subdivision, or subdomain of the domain to the right. For example, the label example specifies a subdomain of the com domain, and www is a subdomain of example.com. +This tree of subdivisions may have up to 127 levels. + +A label may contain zero to 63 characters. The null label, of length zero, is reserved for the root zone. +The full domain name may not exceed the length of 253 characters in its textual representation.In the internal binary representation of the DNS the maximum length requires 255 octets of storage, as it also stores the length of the name. + +Although no technical limitation exists to use any character in domain name labels which are representable by an octet, hostnames use a preferred format and character set. +The characters allowed in labels are a subset of the ASCII character set, consisting of characters a through z, A through Z, digits 0 through 9, and hyphen. +This rule is known as the LDH rule (letters, digits, hyphen). +Domain names are interpreted in case-independent manner. +Labels may not start or end with a hyphen. An additional rule requires that top-level domain names should not be all-numeric.[20] + + +## Enum + + +Enum, short for "enumerated," is a data type that consists of predefined values. A constant or variable defined as an enum can store one of the values listed in the enum declaration. + +**Example** + +`Enum('Value1', 'Value2', 'Value3')` + + +## IP + + +An Internet Protocol address (IP address) is a numerical label assigned to each device connected to a computer network that uses the Internet Protocol for communication. + +An IP address serves two principal functions: host or network interface identification and location addressing. + +Valid IP could be either IPv4 ~~or IPv6~~ + + +## IPv4 + + +Internet Protocol Version 4 (IPv4) is the fourth revision of the Internet Protocol and a widely used protocol in data communication over different kinds of networks. + +IPv4 is a connectionless protocol used in packet-switched layer networks, such as Ethernet. + +More documentation can be found on [that URL](https://en.wikipedia.org/wiki/IPv6) + + +## IPv6 + + +Internet Protocol Version 6 (IPv6) is an Internet Protocol (IP) used for carrying data in packets from a source to a destination over various networks. + +IPv6 is the enhanced version of IPv4 and can support very large numbers of nodes as compared to IPv4. + +It allows for 2128 possible node, or address, combinations. + +More documentation can be found on [that URL](https://en.wikipedia.org/wiki/IPv6) + +**NOTE:** This function is experimental please report any issue with that. + + +## Identifier + + +An Identifier should be shorter than 253 chars and lc alphanum or . or - + + +## Integer + + +An integer is a whole number (not a fraction) that can be positive, negative, or zero. +Therefore, the numbers 10, 0, -25, and 5,148 are all integers. Unlike floating point numbers, integers cannot have decimal places. + + +## List + + +This field is enforcing a check to a field to determinate if a list was actually provided as parameter. + + +## NonEmpty + + +This wrapper is ensuring that a field could not be left empty but needs to have a valid value. + + +## NonZero + + +Represent any number that is not 0. +Will be accepted positive and negative of any kind. + + +## Nullable + + +This wrapper if telling to rubiks that the parameter could be some valid value or null(None in python) + + +## Number + + +An integer is a whole number (not a fraction) that can be positive, negative, floating or zero. + + +## Path + + +A path, the general form of the name of a file or directory, specifies a unique location in a file system. +A path points to a file system location by following the directory tree hierarchy expressed in a string of characters in which path components, separated by a delimiting character, represent each directory. +The delimiting character is most commonly the slash ("/"), the backslash character (""), or colon (":"), though some operating systems may use a different delimiter. +Paths are used extensively in computer science to represent the directory/file relationships common in modern operating systems, and are essential in the construction of Uniform Resource Locators (URLs). +Resources can be represented by either absolute or relative paths. + +More info could be fount [here](https://en.wikipedia.org/wiki/Path_(computing)) + + +## Positive + + +Define a number that needs to be positive (0 is included as positive) + + +## String + + +String is any finite sequence of characters (i.e., letters, numerals, symbols and punctuation marks). + + +## SurgeSpec + + +SurgeSpec is expection surge/unavailable type ie integer or percent + + +## SystemIdentifier + + +An Identifier should be shorten than 253 chars and lc alphanum or . or - or : + + + +# Objects + +## AWSElasticBlockStore +### Parent types: +- [PersistentVolume](#persistentvolume) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +fsType | [Enum](#enum)('ext4') | False | - | - +volumeID | [AWSVolID](#awsvolid) | False | - | - +## AWSLoadBalancerService +### Parents: +- [Service](#service) +### Metadata +Name | Format +---- | ------ +annotations | [Map](#map)<[String](#string), [String](#string)> +labels | [Map](#map)<[String](#string), [String](#string)> +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [Identifier](#identifier) | True | - | - +aws-load-balancer-backend-protocol | [Nullable](#nullable)<[Identifier](#identifier)> | False | - | - +aws-load-balancer-ssl-cert | [Nullable](#nullable)<[ARN](#arn)> | False | - | - +externalTrafficPolicy | [Nullable](#nullable)<[Enum](#enum)('Cluster', 'Local')> | False | - | - +ports | [NonEmpty](#nonempty)<[List](#list)<[ServicePort](#serviceport)>> | False | <unknown transformation> | - +selector | [NonEmpty](#nonempty)<[Map](#map)<[String](#string), [String](#string)>> | False | <unknown transformation> | - +sessionAffinity | [Nullable](#nullable)<[Enum](#enum)('ClientIP', 'None')> | False | - | - +## BaseSelector +### Children: +- [MatchLabelsSelector](#matchlabelsselector) +- [MatchExpressionsSelector](#matchexpressionsselector) +### Parent types: +- [DaemonSet](#daemonset) +- [Deployment](#deployment) +- [Job](#job) +- [PersistentVolumeClaim](#persistentvolumeclaim) +## ClusterIPService +### Parents: +- [Service](#service) +### Metadata +Name | Format +---- | ------ +annotations | [Map](#map)<[String](#string), [String](#string)> +labels | [Map](#map)<[String](#string), [String](#string)> +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [Identifier](#identifier) | True | - | - +clusterIP | [Nullable](#nullable)<[IPv4](#ipv4)> | False | - | - +ports | [NonEmpty](#nonempty)<[List](#list)<[ServicePort](#serviceport)>> | False | <unknown transformation> | - +selector | [NonEmpty](#nonempty)<[Map](#map)<[String](#string), [String](#string)>> | False | <unknown transformation> | - +sessionAffinity | [Nullable](#nullable)<[Enum](#enum)('ClientIP', 'None')> | False | - | - +## ClusterRole +### Parents: +- [RoleBase](#rolebase) +### Metadata +Name | Format +---- | ------ +annotations | [Map](#map)<[String](#string), [String](#string)> +labels | [Map](#map)<[String](#string), [String](#string)> +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [Identifier](#identifier) | True | - | - +rules | [NonEmpty](#nonempty)<[List](#list)<[PolicyRule](#policyrule)>> | False | - | - +## ClusterRoleBinding +### Parents: +- [RoleBindingBase](#rolebindingbase) +- [RoleBindingXF](#rolebindingxf) +### Metadata +Name | Format +---- | ------ +annotations | [Map](#map)<[String](#string), [String](#string)> +labels | [Map](#map)<[String](#string), [String](#string)> +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [Identifier](#identifier) | True | - | - +roleRef | [RoleRef](#roleref) | False | <unknown transformation> | - +subjects | [NonEmpty](#nonempty)<[List](#list)<[RoleSubject](#rolesubject)>> | False | <unknown transformation> | - +## ConfigMap +### Metadata +Name | Format +---- | ------ +annotations | [Map](#map)<[String](#string), [String](#string)> +labels | [Map](#map)<[String](#string), [String](#string)> +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [Identifier](#identifier) | True | - | - +files | [Map](#map)<[String](#string), [String](#string)> | False | - | - +## ContainerEnvBaseSpec +### Children: +- [ContainerEnvSpec](#containerenvspec) +- [ContainerEnvConfigMapSpec](#containerenvconfigmapspec) +- [ContainerEnvSecretSpec](#containerenvsecretspec) +- [ContainerEnvPodFieldSpec](#containerenvpodfieldspec) +- [ContainerEnvContainerResourceSpec](#containerenvcontainerresourcespec) +### Parent types: +- [ContainerSpec](#containerspec) +- [DCCustomParams](#dccustomparams) +- [DCLifecycleNewPod](#dclifecyclenewpod) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [EnvString](#envstring) | False | - | - +## ContainerEnvConfigMapSpec +### Parents: +- [ContainerEnvBaseSpec](#containerenvbasespec) +### Parent types: +- [ContainerSpec](#containerspec) +- [DCCustomParams](#dccustomparams) +- [DCLifecycleNewPod](#dclifecyclenewpod) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +key | [NonEmpty](#nonempty)<[String](#string)> | False | - | - +map_name | [Identifier](#identifier) | False | - | - +name | [EnvString](#envstring) | False | - | - +## ContainerEnvContainerResourceSpec +### Parents: +- [ContainerEnvBaseSpec](#containerenvbasespec) +### Parent types: +- [ContainerSpec](#containerspec) +- [DCCustomParams](#dccustomparams) +- [DCLifecycleNewPod](#dclifecyclenewpod) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +containerName | [Nullable](#nullable)<[Identifier](#identifier)> | False | - | - +divisor | [Nullable](#nullable)<[NonEmpty](#nonempty)<[String](#string)>> | False | - | - +name | [EnvString](#envstring) | False | - | - +resource | [Enum](#enum)('limits.cpu', 'limits.memory', 'requests.cpu', 'requests.memory') | False | - | - +## ContainerEnvPodFieldSpec +### Parents: +- [ContainerEnvBaseSpec](#containerenvbasespec) +### Parent types: +- [ContainerSpec](#containerspec) +- [DCCustomParams](#dccustomparams) +- [DCLifecycleNewPod](#dclifecyclenewpod) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +apiVersion | [Nullable](#nullable)<[Enum](#enum)('v1')> | False | - | - +fieldPath | [Enum](#enum)('metadata.name', 'metadata.namespace', 'metadata.labels', 'metadata.annotations', 'spec.nodeName', 'spec.serviceAccountName', 'status.podIP') | False | - | - +name | [EnvString](#envstring) | False | - | - +## ContainerEnvSecretSpec +### Parents: +- [ContainerEnvBaseSpec](#containerenvbasespec) +### Parent types: +- [ContainerSpec](#containerspec) +- [DCCustomParams](#dccustomparams) +- [DCLifecycleNewPod](#dclifecyclenewpod) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +key | [NonEmpty](#nonempty)<[String](#string)> | False | - | - +name | [EnvString](#envstring) | False | - | - +secret_name | [Identifier](#identifier) | False | - | - +## ContainerEnvSpec +### Parents: +- [ContainerEnvBaseSpec](#containerenvbasespec) +### Parent types: +- [ContainerSpec](#containerspec) +- [DCCustomParams](#dccustomparams) +- [DCLifecycleNewPod](#dclifecyclenewpod) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [EnvString](#envstring) | False | - | - +value | [String](#string) | False | - | - +## ContainerPort +### Parent types: +- [ContainerSpec](#containerspec) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +containerPort | [Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>> | False | - | - +hostIP | [Nullable](#nullable)<[IP](#ip)> | False | - | - +hostPort | [Nullable](#nullable)<[Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>>> | False | - | - +name | [Nullable](#nullable)<[String](#string)> | False | - | - +protocol | [Enum](#enum)('TCP', 'UDP') | False | - | - +## ContainerProbeBaseSpec +### Children: +- [ContainerProbeTCPPortSpec](#containerprobetcpportspec) +- [ContainerProbeHTTPSpec](#containerprobehttpspec) +### Parent types: +- [ContainerSpec](#containerspec) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +failureThreshold | [Nullable](#nullable)<[Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>>> | False | - | - +initialDelaySeconds | [Nullable](#nullable)<[Positive](#positive)<[Integer](#integer)>> | False | - | - +periodSeconds | [Nullable](#nullable)<[Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>>> | False | - | - +successThreshold | [Nullable](#nullable)<[Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>>> | False | - | - +timeoutSeconds | [Nullable](#nullable)<[Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>>> | False | - | - +## ContainerProbeHTTPSpec +### Parents: +- [ContainerProbeBaseSpec](#containerprobebasespec) +### Parent types: +- [ContainerSpec](#containerspec) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +failureThreshold | [Nullable](#nullable)<[Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>>> | False | - | - +host | [Nullable](#nullable)<[Domain](#domain)> | False | - | - +initialDelaySeconds | [Nullable](#nullable)<[Positive](#positive)<[Integer](#integer)>> | False | - | - +path | [NonEmpty](#nonempty)<[Path](#path)> | False | - | - +periodSeconds | [Nullable](#nullable)<[Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>>> | False | - | - +port | [Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>> | False | <unknown transformation> | - +scheme | [Nullable](#nullable)<[Enum](#enum)('HTTP', 'HTTPS')> | False | - | - +successThreshold | [Nullable](#nullable)<[Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>>> | False | - | - +timeoutSeconds | [Nullable](#nullable)<[Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>>> | False | - | - +## ContainerProbeTCPPortSpec +### Parents: +- [ContainerProbeBaseSpec](#containerprobebasespec) +### Parent types: +- [ContainerSpec](#containerspec) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +failureThreshold | [Nullable](#nullable)<[Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>>> | False | - | - +initialDelaySeconds | [Nullable](#nullable)<[Positive](#positive)<[Integer](#integer)>> | False | - | - +periodSeconds | [Nullable](#nullable)<[Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>>> | False | - | - +port | [Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>> | False | <unknown transformation> | - +successThreshold | [Nullable](#nullable)<[Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>>> | False | - | - +timeoutSeconds | [Nullable](#nullable)<[Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>>> | False | - | - +## ContainerResourceEachSpec +### Parent types: +- [ContainerResourceSpec](#containerresourcespec) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +cpu | [Nullable](#nullable)<[Positive](#positive)<[NonZero](#nonzero)<[Number](#number)>>> | False | <unknown transformation> | - +memory | [Nullable](#nullable)<[Memory](#memory)> | False | - | - +## ContainerResourceSpec +### Parent types: +- [ContainerSpec](#containerspec) +- [DCBaseUpdateStrategy](#dcbaseupdatestrategy) +- [DCCustomStrategy](#dccustomstrategy) +- [DCRecreateStrategy](#dcrecreatestrategy) +- [DCRollingStrategy](#dcrollingstrategy) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +limits | [ContainerResourceEachSpec](#containerresourceeachspec) | False | - | - +requests | [ContainerResourceEachSpec](#containerresourceeachspec) | False | - | - +## ContainerSpec +### Parents: +- [EnvironmentPreProcessMixin](#environmentpreprocessmixin) +### Parent types: +- [PodTemplateSpec](#podtemplatespec) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [Identifier](#identifier) | True | - | - +args | [Nullable](#nullable)<[List](#list)<[String](#string)>> | False | - | - +command | [Nullable](#nullable)<[List](#list)<[String](#string)>> | False | - | - +env | [Nullable](#nullable)<[List](#list)<[ContainerEnvBaseSpec](#containerenvbasespec)>> | False | <unknown transformation> | - +image | [NonEmpty](#nonempty)<[String](#string)> | False | - | - +imagePullPolicy | [Nullable](#nullable)<[Enum](#enum)('Always', 'IfNotPresent')> | False | - | - +kind | [Nullable](#nullable)<[Enum](#enum)('DockerImage')> | False | - | - +lifecycle | [Nullable](#nullable)<[LifeCycle](#lifecycle)> | False | - | - +livenessProbe | [Nullable](#nullable)<[ContainerProbeBaseSpec](#containerprobebasespec)> | False | - | - +ports | [Nullable](#nullable)<[List](#list)<[ContainerPort](#containerport)>> | False | <unknown transformation> | - +readinessProbe | [Nullable](#nullable)<[ContainerProbeBaseSpec](#containerprobebasespec)> | False | - | - +resources | [Nullable](#nullable)<[ContainerResourceSpec](#containerresourcespec)> | False | - | - +securityContext | [Nullable](#nullable)<[SecurityContext](#securitycontext)> | False | - | - +terminationMessagePath | [Nullable](#nullable)<[NonEmpty](#nonempty)<[Path](#path)>> | False | - | - +volumeMounts | [Nullable](#nullable)<[List](#list)<[ContainerVolumeMountSpec](#containervolumemountspec)>> | False | <unknown transformation> | - +## ContainerVolumeMountSpec +### Parent types: +- [ContainerSpec](#containerspec) +- [DCLifecycleNewPod](#dclifecyclenewpod) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [Identifier](#identifier) | False | - | - +path | [NonEmpty](#nonempty)<[Path](#path)> | False | - | - +readOnly | [Nullable](#nullable)<[Boolean](#boolean)> | False | - | - +## DCBaseUpdateStrategy +### Children: +- [DCRecreateStrategy](#dcrecreatestrategy) +- [DCRollingStrategy](#dcrollingstrategy) +- [DCCustomStrategy](#dccustomstrategy) +### Parent types: +- [DeploymentConfig](#deploymentconfig) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +activeDeadlineSeconds | [Nullable](#nullable)<[Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>>> | False | - | - +annotations | [Map](#map)<[String](#string), [String](#string)> | False | - | - +labels | [Map](#map)<[String](#string), [String](#string)> | False | - | - +resources | [Nullable](#nullable)<[ContainerResourceSpec](#containerresourcespec)> | False | - | - +## DCConfigChangeTrigger +### Parents: +- [DCTrigger](#dctrigger) +### Parent types: +- [DeploymentConfig](#deploymentconfig) +## DCCustomParams +### Parents: +- [EnvironmentPreProcessMixin](#environmentpreprocessmixin) +### Parent types: +- [DCCustomStrategy](#dccustomstrategy) +- [DCRecreateStrategy](#dcrecreatestrategy) +- [DCRollingStrategy](#dcrollingstrategy) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +command | [Nullable](#nullable)<[List](#list)<[String](#string)>> | False | - | - +environment | [Nullable](#nullable)<[List](#list)<[ContainerEnvBaseSpec](#containerenvbasespec)>> | False | <unknown transformation> | - +image | [NonEmpty](#nonempty)<[String](#string)> | False | - | - +## DCCustomStrategy +### Parents: +- [DCBaseUpdateStrategy](#dcbaseupdatestrategy) +### Parent types: +- [DeploymentConfig](#deploymentconfig) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +activeDeadlineSeconds | [Nullable](#nullable)<[Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>>> | False | - | - +annotations | [Map](#map)<[String](#string), [String](#string)> | False | - | - +customParams | [DCCustomParams](#dccustomparams) | False | - | - +labels | [Map](#map)<[String](#string), [String](#string)> | False | - | - +resources | [Nullable](#nullable)<[ContainerResourceSpec](#containerresourcespec)> | False | - | - +## DCImageChangeTrigger +### Parents: +- [DCTrigger](#dctrigger) +### Parent types: +- [DeploymentConfig](#deploymentconfig) +## DCLifecycleHook +### Parent types: +- [DCRecreateParams](#dcrecreateparams) +- [DCRollingParams](#dcrollingparams) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +execNewPod | [Nullable](#nullable)<[DCLifecycleNewPod](#dclifecyclenewpod)> | False | - | - +failurePolicy | [Enum](#enum)('Abort', 'Retry', 'Ignore') | False | - | - +tagImages | [Nullable](#nullable)<[DCTagImages](#dctagimages)> | False | - | - +## DCLifecycleNewPod +### Parents: +- [EnvironmentPreProcessMixin](#environmentpreprocessmixin) +### Parent types: +- [DCLifecycleHook](#dclifecyclehook) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +command | [NonEmpty](#nonempty)<[List](#list)<[String](#string)>> | False | - | - +containerName | [Identifier](#identifier) | False | - | - +env | [Nullable](#nullable)<[List](#list)<[ContainerEnvBaseSpec](#containerenvbasespec)>> | False | <unknown transformation> | - +volumeMounts | [Nullable](#nullable)<[List](#list)<[ContainerVolumeMountSpec](#containervolumemountspec)>> | False | - | - +volumes | [Nullable](#nullable)<[List](#list)<[Identifier](#identifier)>> | False | - | - +## DCRecreateParams +### Parent types: +- [DCRecreateStrategy](#dcrecreatestrategy) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +mid | [Nullable](#nullable)<[DCLifecycleHook](#dclifecyclehook)> | False | - | - +post | [Nullable](#nullable)<[DCLifecycleHook](#dclifecyclehook)> | False | - | - +pre | [Nullable](#nullable)<[DCLifecycleHook](#dclifecyclehook)> | False | - | - +timeoutSeconds | [Nullable](#nullable)<[Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>>> | False | - | - +## DCRecreateStrategy +### Parents: +- [DCBaseUpdateStrategy](#dcbaseupdatestrategy) +### Parent types: +- [DeploymentConfig](#deploymentconfig) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +activeDeadlineSeconds | [Nullable](#nullable)<[Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>>> | False | - | - +annotations | [Map](#map)<[String](#string), [String](#string)> | False | - | - +customParams | [Nullable](#nullable)<[DCCustomParams](#dccustomparams)> | False | - | - +labels | [Map](#map)<[String](#string), [String](#string)> | False | - | - +recreateParams | [Nullable](#nullable)<[DCRecreateParams](#dcrecreateparams)> | False | - | - +resources | [Nullable](#nullable)<[ContainerResourceSpec](#containerresourcespec)> | False | - | - +## DCRollingParams +### Parent types: +- [DCRollingStrategy](#dcrollingstrategy) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +intervalSeconds | [Nullable](#nullable)<[Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>>> | False | - | - +maxSurge | [SurgeSpec](#surgespec) | False | - | - +maxUnavailable | [SurgeSpec](#surgespec) | False | - | - +post | [Nullable](#nullable)<[DCLifecycleHook](#dclifecyclehook)> | False | - | - +pre | [Nullable](#nullable)<[DCLifecycleHook](#dclifecyclehook)> | False | - | - +timeoutSeconds | [Nullable](#nullable)<[Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>>> | False | - | - +updatePeriodSeconds | [Nullable](#nullable)<[Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>>> | False | - | - +## DCRollingStrategy +### Parents: +- [DCBaseUpdateStrategy](#dcbaseupdatestrategy) +### Parent types: +- [DeploymentConfig](#deploymentconfig) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +activeDeadlineSeconds | [Nullable](#nullable)<[Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>>> | False | - | - +annotations | [Map](#map)<[String](#string), [String](#string)> | False | - | - +customParams | [Nullable](#nullable)<[DCCustomParams](#dccustomparams)> | False | - | - +labels | [Map](#map)<[String](#string), [String](#string)> | False | - | - +resources | [Nullable](#nullable)<[ContainerResourceSpec](#containerresourcespec)> | False | - | - +rollingParams | [Nullable](#nullable)<[DCRollingParams](#dcrollingparams)> | False | - | - +## DCTagImages +### Parent types: +- [DCLifecycleHook](#dclifecyclehook) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +containerName | [Identifier](#identifier) | False | - | - +toApiVersion | [Nullable](#nullable)<[String](#string)> | False | - | - +toFieldPath | [Nullable](#nullable)<[String](#string)> | False | - | - +toKind | [Nullable](#nullable)<[Enum](#enum)('Deployment', 'DeploymentConfig', 'ImageStreamTag')> | False | - | - +toName | [Nullable](#nullable)<[Identifier](#identifier)> | False | - | - +toNamespace | [Nullable](#nullable)<[Identifier](#identifier)> | False | - | - +toResourceVersion | [Nullable](#nullable)<[String](#string)> | False | - | - +toUid | [Nullable](#nullable)<[String](#string)> | False | - | - +## DCTrigger +### Children: +- [DCConfigChangeTrigger](#dcconfigchangetrigger) +- [DCImageChangeTrigger](#dcimagechangetrigger) +### Parent types: +- [DeploymentConfig](#deploymentconfig) +## DaemonSet +### Parents: +- [SelectorsPreProcessMixin](#selectorspreprocessmixin) +### Metadata +Name | Format +---- | ------ +annotations | [Map](#map)<[String](#string), [String](#string)> +labels | [Map](#map)<[String](#string), [String](#string)> +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [Identifier](#identifier) | True | - | - +pod_template | [PodTemplateSpec](#podtemplatespec) | False | - | - +selector | [Nullable](#nullable)<[BaseSelector](#baseselector)> | False | <unknown transformation> | - +## [Deployment](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/) + + +A Deployment controller provides declarative updates for Pods and ReplicaSets. + +You describe a desired state in a Deployment object, and the Deployment controller changes the actual state to the desired state at a controlled rate. +You can define Deployments to create new ReplicaSets, or to remove existing Deployments and adopt all their resources with new Deployments. + +### Metadata +Name | Format +---- | ------ +annotations | [Map](#map)<[String](#string), [String](#string)> +labels | [Map](#map)<[String](#string), [String](#string)> +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [Identifier](#identifier) | True | - | - +minReadySeconds | [Nullable](#nullable)<[Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>>> | False | - | - +paused | [Nullable](#nullable)<[Boolean](#boolean)> | False | - | - +pod_template | [PodTemplateSpec](#podtemplatespec) | False | - | - +progressDeadlineSeconds | [Nullable](#nullable)<[Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>>> | False | - | - +replicas | [Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>> | False | - | - +revisionHistoryLimit | [Nullable](#nullable)<[Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>>> | False | - | - +selector | [Nullable](#nullable)<[BaseSelector](#baseselector)> | False | - | - +strategy | [Nullable](#nullable)<[DplBaseUpdateStrategy](#dplbaseupdatestrategy)> | False | - | - +## DeploymentConfig +### Metadata +Name | Format +---- | ------ +annotations | [Map](#map)<[String](#string), [String](#string)> +labels | [Map](#map)<[String](#string), [String](#string)> +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [Identifier](#identifier) | True | - | - +minReadySeconds | [Nullable](#nullable)<[Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>>> | False | - | - +paused | [Nullable](#nullable)<[Boolean](#boolean)> | False | - | - +pod_template | [PodTemplateSpec](#podtemplatespec) | False | - | - +replicas | [Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>> | False | - | - +revisionHistoryLimit | [Nullable](#nullable)<[Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>>> | False | - | - +selector | [Nullable](#nullable)<[Map](#map)<[String](#string), [String](#string)>> | False | - | - +strategy | [DCBaseUpdateStrategy](#dcbaseupdatestrategy) | False | - | - +test | [Boolean](#boolean) | False | - | - +triggers | [List](#list)<[DCTrigger](#dctrigger)> | False | - | - +## DockerCredentials +### Parents: +- [Secret](#secret) +### Metadata +Name | Format +---- | ------ +annotations | [Map](#map)<[String](#string), [String](#string)> +labels | [Map](#map)<[String](#string), [String](#string)> +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [Identifier](#identifier) | True | - | - +dockers | [Map](#map)<[String](#string), [Map](#map)<[String](#string), [String](#string)>> | False | - | - +secrets | [Map](#map)<[String](#string), [String](#string)> | False | - | - +type | [NonEmpty](#nonempty)<[String](#string)> | False | - | - +## DplBaseUpdateStrategy +### Children: +- [DplRecreateStrategy](#dplrecreatestrategy) +- [DplRollingUpdateStrategy](#dplrollingupdatestrategy) +### Parent types: +- [Deployment](#deployment) +## DplRecreateStrategy +### Parents: +- [DplBaseUpdateStrategy](#dplbaseupdatestrategy) +### Parent types: +- [Deployment](#deployment) +## DplRollingUpdateStrategy +### Parents: +- [DplBaseUpdateStrategy](#dplbaseupdatestrategy) +### Parent types: +- [Deployment](#deployment) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +maxSurge | [SurgeSpec](#surgespec) | False | - | - +maxUnavailable | [SurgeSpec](#surgespec) | False | - | - +## Group +### Metadata +Name | Format +---- | ------ +annotations | [Map](#map)<[String](#string), [String](#string)> +labels | [Map](#map)<[String](#string), [String](#string)> +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [Identifier](#identifier) | True | - | - +users | [NonEmpty](#nonempty)<[List](#list)<[UserIdentifier](#useridentifier)>> | False | - | - +## Job +### Metadata +Name | Format +---- | ------ +annotations | [Map](#map)<[String](#string), [String](#string)> +labels | [Map](#map)<[String](#string), [String](#string)> +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [Identifier](#identifier) | True | - | - +activeDeadlineSeconds | [Nullable](#nullable)<[Positive](#positive)<[Integer](#integer)>> | False | - | - +completions | [Nullable](#nullable)<[Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>>> | False | - | - +manualSelector | [Nullable](#nullable)<[Boolean](#boolean)> | False | - | - +parallelism | [Nullable](#nullable)<[Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>>> | False | - | - +pod_template | [PodTemplateSpec](#podtemplatespec) | False | - | - +selector | [Nullable](#nullable)<[BaseSelector](#baseselector)> | False | - | - +## LifeCycle +### Parent types: +- [ContainerSpec](#containerspec) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +postStart | [Nullable](#nullable)<[LifeCycleProbe](#lifecycleprobe)> | False | - | - +preStop | [Nullable](#nullable)<[LifeCycleProbe](#lifecycleprobe)> | False | - | - +## LifeCycleExec +### Parents: +- [LifeCycleProbe](#lifecycleprobe) +### Parent types: +- [LifeCycle](#lifecycle) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +command | [NonEmpty](#nonempty)<[List](#list)<[String](#string)>> | False | - | - +## LifeCycleHTTP +### Parents: +- [LifeCycleProbe](#lifecycleprobe) +### Parent types: +- [LifeCycle](#lifecycle) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +path | [NonEmpty](#nonempty)<[Path](#path)> | False | - | - +port | [Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>> | False | - | - +scheme | [Nullable](#nullable)<[Enum](#enum)('HTTP', 'HTTPS')> | False | - | - +## LifeCycleProbe +### Children: +- [LifeCycleExec](#lifecycleexec) +- [LifeCycleHTTP](#lifecyclehttp) +### Parent types: +- [LifeCycle](#lifecycle) +## MatchExpression +### Parent types: +- [MatchExpressionsSelector](#matchexpressionsselector) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +key | [NonEmpty](#nonempty)<[String](#string)> | False | - | - +operator | [Enum](#enum)('In', 'NotIn', 'Exists', 'DoesNotExist') | False | - | - +values | [Nullable](#nullable)<[List](#list)<[String](#string)>> | False | - | - +## MatchExpressionsSelector +### Parents: +- [BaseSelector](#baseselector) +### Parent types: +- [DaemonSet](#daemonset) +- [Deployment](#deployment) +- [Job](#job) +- [PersistentVolumeClaim](#persistentvolumeclaim) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +matchExpressions | [NonEmpty](#nonempty)<[List](#list)<[MatchExpression](#matchexpression)>> | False | - | - +## MatchLabelsSelector +### Parents: +- [BaseSelector](#baseselector) +### Parent types: +- [DaemonSet](#daemonset) +- [Deployment](#deployment) +- [Job](#job) +- [PersistentVolumeClaim](#persistentvolumeclaim) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +matchLabels | [Map](#map)<[String](#string), [String](#string)> | False | - | - +## Namespace +### Children: +- [Project](#project) +### Metadata +Name | Format +---- | ------ +annotations | [Map](#map)<[String](#string), [String](#string)> +labels | [Map](#map)<[String](#string), [String](#string)> +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [Identifier](#identifier) | True | - | - +## PersistentVolume +### Metadata +Name | Format +---- | ------ +annotations | [Map](#map)<[String](#string), [String](#string)> +labels | [Map](#map)<[String](#string), [String](#string)> +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [Identifier](#identifier) | True | - | - +accessModes | [List](#list)<[Enum](#enum)('ReadWriteOnce', 'ReadOnlyMany', 'ReadWriteMany')> | False | - | - +awsElasticBlockStore | [Nullable](#nullable)<[AWSElasticBlockStore](#awselasticblockstore)> | False | - | - +capacity | [Memory](#memory) | False | - | - +claimRef | [Nullable](#nullable)<[PersistentVolumeRef](#persistentvolumeref)> | False | - | - +persistentVolumeReclaimPolicy | [Nullable](#nullable)<[Enum](#enum)('Retain', 'Recycle', 'Delete')> | False | - | - +## PersistentVolumeClaim +### Metadata +Name | Format +---- | ------ +annotations | [Map](#map)<[String](#string), [String](#string)> +labels | [Map](#map)<[String](#string), [String](#string)> +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [Identifier](#identifier) | True | - | - +accessModes | [List](#list)<[Enum](#enum)('ReadWriteOnce', 'ReadOnlyMany', 'ReadWriteMany')> | False | - | - +request | [Memory](#memory) | False | - | - +selector | [Nullable](#nullable)<[BaseSelector](#baseselector)> | False | - | - +volumeName | [Nullable](#nullable)<[Identifier](#identifier)> | False | <unknown transformation> | - +## PersistentVolumeRef +### Parent types: +- [PersistentVolume](#persistentvolume) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +apiVersion | [Nullable](#nullable)<[String](#string)> | False | - | - +kind | [Nullable](#nullable)<[CaseIdentifier](#caseidentifier)> | False | - | - +name | [Nullable](#nullable)<[Identifier](#identifier)> | False | - | - +ns | [Nullable](#nullable)<[Identifier](#identifier)> | False | - | - +## PodImagePullSecret +### Parent types: +- [PodTemplateSpec](#podtemplatespec) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [Identifier](#identifier) | False | - | - +## PodTemplateSpec +### Parent types: +- [DaemonSet](#daemonset) +- [Deployment](#deployment) +- [DeploymentConfig](#deploymentconfig) +- [Job](#job) +- [ReplicationController](#replicationcontroller) +### Metadata +Name | Format +---- | ------ +annotations | [Map](#map)<[String](#string), [String](#string)> +labels | [Map](#map)<[String](#string), [String](#string)> +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +containers | [NonEmpty](#nonempty)<[List](#list)<[ContainerSpec](#containerspec)>> | False | - | - +dnsPolicy | [Nullable](#nullable)<[Enum](#enum)('ClusterFirst')> | False | - | - +hostIPC | [Nullable](#nullable)<[Boolean](#boolean)> | False | - | - +hostNetwork | [Nullable](#nullable)<[Boolean](#boolean)> | False | - | - +hostPID | [Nullable](#nullable)<[Boolean](#boolean)> | False | - | - +imagePullSecrets | [Nullable](#nullable)<[List](#list)<[PodImagePullSecret](#podimagepullsecret)>> | False | <unknown transformation> | - +name | [Nullable](#nullable)<[Identifier](#identifier)> | False | - | - +nodeSelector | [Nullable](#nullable)<[Map](#map)<[String](#string), [String](#string)>> | False | - | - +restartPolicy | [Nullable](#nullable)<[Enum](#enum)('Always', 'OnFailure', 'Never')> | False | - | - +securityContext | [Nullable](#nullable)<[SecurityContext](#securitycontext)> | False | - | - +serviceAccountName | [Nullable](#nullable)<[Identifier](#identifier)> | False | <unknown transformation> | [serviceAccount](#serviceaccount) +terminationGracePeriodSeconds | [Nullable](#nullable)<[Positive](#positive)<[Integer](#integer)>> | False | - | - +volumes | [Nullable](#nullable)<[List](#list)<[PodVolumeBaseSpec](#podvolumebasespec)>> | False | - | - +## PodVolumeBaseSpec +### Children: +- [PodVolumeHostSpec](#podvolumehostspec) +- [PodVolumeItemMapper](#podvolumeitemmapper) +- [PodVolumePVCSpec](#podvolumepvcspec) +- [PodVolumeEmptyDirSpec](#podvolumeemptydirspec) +- [PodVolumeConfigMapSpec](#podvolumeconfigmapspec) +- [PodVolumeSecretSpec](#podvolumesecretspec) +### Parent types: +- [PodTemplateSpec](#podtemplatespec) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [Identifier](#identifier) | False | - | - +## PodVolumeConfigMapSpec +### Parents: +- [PodVolumeItemMapper](#podvolumeitemmapper) +- [PodVolumeBaseSpec](#podvolumebasespec) +### Parent types: +- [PodTemplateSpec](#podtemplatespec) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +defaultMode | [Nullable](#nullable)<[Positive](#positive)<[Integer](#integer)>> | False | - | - +item_map | [Nullable](#nullable)<[Map](#map)<[String](#string), [String](#string)>> | False | - | - +map_name | [Identifier](#identifier) | False | - | - +name | [Identifier](#identifier) | False | - | - +## PodVolumeEmptyDirSpec +### Parents: +- [PodVolumeBaseSpec](#podvolumebasespec) +### Parent types: +- [PodTemplateSpec](#podtemplatespec) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [Identifier](#identifier) | False | - | - +## PodVolumeHostSpec +### Parents: +- [PodVolumeBaseSpec](#podvolumebasespec) +### Parent types: +- [PodTemplateSpec](#podtemplatespec) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [Identifier](#identifier) | False | - | - +path | [String](#string) | False | - | - +## PodVolumeItemMapper +### Parents: +- [PodVolumeBaseSpec](#podvolumebasespec) +### Children: +- [PodVolumeConfigMapSpec](#podvolumeconfigmapspec) +- [PodVolumeSecretSpec](#podvolumesecretspec) +### Parent types: +- [PodTemplateSpec](#podtemplatespec) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +item_map | [Nullable](#nullable)<[Map](#map)<[String](#string), [String](#string)>> | False | - | - +name | [Identifier](#identifier) | False | - | - +## PodVolumePVCSpec +### Parents: +- [PodVolumeBaseSpec](#podvolumebasespec) +### Parent types: +- [PodTemplateSpec](#podtemplatespec) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +claimName | [Identifier](#identifier) | False | - | - +name | [Identifier](#identifier) | False | - | - +## PodVolumeSecretSpec +### Parents: +- [PodVolumeItemMapper](#podvolumeitemmapper) +- [PodVolumeBaseSpec](#podvolumebasespec) +### Parent types: +- [PodTemplateSpec](#podtemplatespec) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +defaultMode | [Nullable](#nullable)<[Positive](#positive)<[Integer](#integer)>> | False | - | - +item_map | [Nullable](#nullable)<[Map](#map)<[String](#string), [String](#string)>> | False | - | - +name | [Identifier](#identifier) | False | - | - +secret_name | [Identifier](#identifier) | False | - | - +## PolicyBinding +### Metadata +Name | Format +---- | ------ +annotations | [Map](#map)<[String](#string), [String](#string)> +labels | [Map](#map)<[String](#string), [String](#string)> +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [ColonIdentifier](#colonidentifier) | True | - | - +roleBindings | [List](#list)<[PolicyBindingRoleBinding](#policybindingrolebinding)> | False | <unknown transformation> | - +## PolicyBindingRoleBinding +### Parents: +- [RoleBindingXF](#rolebindingxf) +### Parent types: +- [PolicyBinding](#policybinding) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +metadata | [Nullable](#nullable)<[Map](#map)<[String](#string), [String](#string)>> | False | - | - +name | [SystemIdentifier](#systemidentifier) | False | - | - +ns | [Identifier](#identifier) | False | - | - +roleRef | [RoleRef](#roleref) | False | <unknown transformation> | - +subjects | [NonEmpty](#nonempty)<[List](#list)<[RoleSubject](#rolesubject)>> | False | <unknown transformation> | - +## PolicyRule +### Parent types: +- [ClusterRole](#clusterrole) +- [Role](#role) +- [RoleBase](#rolebase) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +apiGroups | [NonEmpty](#nonempty)<[List](#list)<[String](#string)>> | False | - | - +attributeRestrictions | [Nullable](#nullable)<[String](#string)> | False | - | - +nonResourceURLs | [Nullable](#nullable)<[List](#list)<[String](#string)>> | False | - | - +resourceNames | [Nullable](#nullable)<[List](#list)<[String](#string)>> | False | - | - +resources | [NonEmpty](#nonempty)<[List](#list)<[NonEmpty](#nonempty)<[String](#string)>>> | False | - | - +verbs | [NonEmpty](#nonempty)<[List](#list)<[Enum](#enum)('get', 'list', 'create', 'update', 'delete', 'deletecollection', 'watch')>> | False | - | - +## Project +### Parents: +- [Namespace](#namespace) +### Metadata +Name | Format +---- | ------ +annotations | [Map](#map)<[String](#string), [String](#string)> +labels | [Map](#map)<[String](#string), [String](#string)> +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [Identifier](#identifier) | True | - | - +## ReplicationController +### Metadata +Name | Format +---- | ------ +annotations | [Map](#map)<[String](#string), [String](#string)> +labels | [Map](#map)<[String](#string), [String](#string)> +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [Identifier](#identifier) | True | - | - +minReadySeconds | [Nullable](#nullable)<[Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>>> | False | - | - +pod_template | [PodTemplateSpec](#podtemplatespec) | False | - | - +replicas | [Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>> | False | - | - +selector | [Nullable](#nullable)<[Map](#map)<[String](#string), [String](#string)>> | False | - | - +## Role +### Parents: +- [RoleBase](#rolebase) +### Metadata +Name | Format +---- | ------ +annotations | [Map](#map)<[String](#string), [String](#string)> +labels | [Map](#map)<[String](#string), [String](#string)> +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [Identifier](#identifier) | True | - | - +rules | [NonEmpty](#nonempty)<[List](#list)<[PolicyRule](#policyrule)>> | False | - | - +## RoleBinding +### Parents: +- [RoleBindingBase](#rolebindingbase) +- [RoleBindingXF](#rolebindingxf) +### Metadata +Name | Format +---- | ------ +annotations | [Map](#map)<[String](#string), [String](#string)> +labels | [Map](#map)<[String](#string), [String](#string)> +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [SystemIdentifier](#systemidentifier) | True | - | - +roleRef | [RoleRef](#roleref) | False | <unknown transformation> | - +subjects | [NonEmpty](#nonempty)<[List](#list)<[RoleSubject](#rolesubject)>> | False | <unknown transformation> | - +## RoleRef +### Parent types: +- [ClusterRoleBinding](#clusterrolebinding) +- [PolicyBindingRoleBinding](#policybindingrolebinding) +- [RoleBinding](#rolebinding) +- [RoleBindingBase](#rolebindingbase) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [Nullable](#nullable)<[SystemIdentifier](#systemidentifier)> | False | - | - +ns | [Nullable](#nullable)<[Identifier](#identifier)> | False | - | - +## RoleSubject +### Parent types: +- [ClusterRoleBinding](#clusterrolebinding) +- [PolicyBindingRoleBinding](#policybindingrolebinding) +- [RoleBinding](#rolebinding) +- [RoleBindingBase](#rolebindingbase) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +kind | [CaseIdentifier](#caseidentifier) | False | - | - +name | [String](#string) | False | - | - +ns | [Nullable](#nullable)<[Identifier](#identifier)> | False | - | - +## Route +### Metadata +Name | Format +---- | ------ +annotations | [Map](#map)<[String](#string), [String](#string)> +labels | [Map](#map)<[String](#string), [String](#string)> +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [Identifier](#identifier) | True | - | - +host | [Domain](#domain) | False | - | - +port | [RouteDestPort](#routedestport) | False | - | - +tls | [Nullable](#nullable)<[RouteTLS](#routetls)> | False | - | - +to | [NonEmpty](#nonempty)<[List](#list)<[RouteDest](#routedest)>> | False | - | - +wildcardPolicy | [Enum](#enum)('Subdomain', 'None') | False | - | - +## RouteDest +### Children: +- [RouteDestService](#routedestservice) +### Parent types: +- [Route](#route) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +weight | [Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>> | False | - | - +## RouteDestPort +### Parent types: +- [Route](#route) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +targetPort | [Identifier](#identifier) | False | - | - +## RouteDestService +### Parents: +- [RouteDest](#routedest) +### Parent types: +- [Route](#route) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [Identifier](#identifier) | False | - | - +weight | [Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>> | False | - | - +## RouteTLS +### Parent types: +- [Route](#route) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +caCertificate | [Nullable](#nullable)<[NonEmpty](#nonempty)<[String](#string)>> | False | - | - +certificate | [Nullable](#nullable)<[NonEmpty](#nonempty)<[String](#string)>> | False | - | - +destinationCACertificate | [Nullable](#nullable)<[NonEmpty](#nonempty)<[String](#string)>> | False | - | - +insecureEdgeTerminationPolicy | [Enum](#enum)('Allow', 'Disable', 'Redirect') | False | - | - +key | [Nullable](#nullable)<[NonEmpty](#nonempty)<[String](#string)>> | False | - | - +termination | [Enum](#enum)('edge', 'reencrypt', 'passthrough') | False | - | - +## SAImgPullSecretSubject +### Parent types: +- [ServiceAccount](#serviceaccount) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [Identifier](#identifier) | False | - | - +## SASecretSubject +### Parent types: +- [ServiceAccount](#serviceaccount) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +kind | [Nullable](#nullable)<[CaseIdentifier](#caseidentifier)> | False | - | - +name | [Nullable](#nullable)<[Identifier](#identifier)> | False | - | - +ns | [Nullable](#nullable)<[Identifier](#identifier)> | False | - | - +## SCCGroupRange +### Parent types: +- [SCCGroups](#sccgroups) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +max | [Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>> | False | - | - +min | [Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>> | False | - | - +## SCCGroups +### Parent types: +- [SecurityContextConstraints](#securitycontextconstraints) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +ranges | [Nullable](#nullable)<[List](#list)<[SCCGroupRange](#sccgrouprange)>> | False | - | - +type | [Nullable](#nullable)<[Enum](#enum)('MustRunAs', 'RunAsAny')> | False | - | - +## SCCRunAsUser +### Parent types: +- [SecurityContextConstraints](#securitycontextconstraints) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +type | [Enum](#enum)('MustRunAs', 'RunAsAny', 'MustRunAsRange', 'MustRunAsNonRoot') | False | - | - +uid | [Nullable](#nullable)<[Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>>> | False | - | - +uidRangeMax | [Nullable](#nullable)<[Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>>> | False | - | - +uidRangeMin | [Nullable](#nullable)<[Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>>> | False | - | - +## SCCSELinux +### Parent types: +- [SecurityContextConstraints](#securitycontextconstraints) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +level | [Nullable](#nullable)<[String](#string)> | False | - | - +role | [Nullable](#nullable)<[String](#string)> | False | - | - +strategy | [Nullable](#nullable)<[Enum](#enum)('MustRunAs', 'RunAsAny')> | False | - | - +type | [Nullable](#nullable)<[String](#string)> | False | - | - +user | [Nullable](#nullable)<[String](#string)> | False | - | - +## Secret +### Children: +- [DockerCredentials](#dockercredentials) +- [TLSCredentials](#tlscredentials) +### Metadata +Name | Format +---- | ------ +annotations | [Map](#map)<[String](#string), [String](#string)> +labels | [Map](#map)<[String](#string), [String](#string)> +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [Identifier](#identifier) | True | - | - +secrets | [Map](#map)<[String](#string), [String](#string)> | False | - | - +type | [NonEmpty](#nonempty)<[String](#string)> | False | - | - +## SecurityContext +### Parent types: +- [ContainerSpec](#containerspec) +- [PodTemplateSpec](#podtemplatespec) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +fsGroup | [Nullable](#nullable)<[Integer](#integer)> | False | - | - +privileged | [Nullable](#nullable)<[Boolean](#boolean)> | False | - | - +runAsNonRoot | [Nullable](#nullable)<[Boolean](#boolean)> | False | - | - +runAsUser | [Nullable](#nullable)<[Integer](#integer)> | False | - | - +supplementalGroups | [Nullable](#nullable)<[List](#list)<[Integer](#integer)>> | False | - | - +## SecurityContextConstraints +### Metadata +Name | Format +---- | ------ +annotations | [Map](#map)<[String](#string), [String](#string)> +labels | [Map](#map)<[String](#string), [String](#string)> +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [Identifier](#identifier) | True | - | - +allowHostDirVolumePlugin | [Boolean](#boolean) | False | - | - +allowHostIPC | [Boolean](#boolean) | False | - | - +allowHostNetwork | [Boolean](#boolean) | False | - | - +allowHostPID | [Boolean](#boolean) | False | - | - +allowHostPorts | [Boolean](#boolean) | False | - | - +allowPrivilegedContainer | [Boolean](#boolean) | False | - | - +allowedCapabilities | [Nullable](#nullable)<[List](#list)<[String](#string)>> | False | - | - +defaultAddCapabilities | [Nullable](#nullable)<[List](#list)<[String](#string)>> | False | - | - +fsGroup | [Nullable](#nullable)<[SCCGroups](#sccgroups)> | False | - | - +groups | [List](#list)<[SystemIdentifier](#systemidentifier)> | False | - | - +priority | [Nullable](#nullable)<[Positive](#positive)<[Integer](#integer)>> | False | - | - +readOnlyRootFilesystem | [Boolean](#boolean) | False | - | - +requiredDropCapabilities | [Nullable](#nullable)<[List](#list)<[String](#string)>> | False | - | - +runAsUser | [Nullable](#nullable)<[SCCRunAsUser](#sccrunasuser)> | False | - | - +seLinuxContext | [Nullable](#nullable)<[SCCSELinux](#sccselinux)> | False | - | - +seccompProfiles | [Nullable](#nullable)<[List](#list)<[String](#string)>> | False | - | - +supplementalGroups | [Nullable](#nullable)<[SCCGroups](#sccgroups)> | False | - | - +users | [List](#list)<[SystemIdentifier](#systemidentifier)> | False | - | - +volumes | [List](#list)<[Enum](#enum)('configMap', 'downwardAPI', 'emptyDir', 'hostPath', 'nfs', 'persistentVolumeClaim', 'secret', '*')> | False | - | - +## Service +### Children: +- [ClusterIPService](#clusteripservice) +- [AWSLoadBalancerService](#awsloadbalancerservice) +### Metadata +Name | Format +---- | ------ +annotations | [Map](#map)<[String](#string), [String](#string)> +labels | [Map](#map)<[String](#string), [String](#string)> +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [Identifier](#identifier) | True | - | - +ports | [NonEmpty](#nonempty)<[List](#list)<[ServicePort](#serviceport)>> | False | <unknown transformation> | - +selector | [NonEmpty](#nonempty)<[Map](#map)<[String](#string), [String](#string)>> | False | <unknown transformation> | - +sessionAffinity | [Nullable](#nullable)<[Enum](#enum)('ClientIP', 'None')> | False | - | - +## ServiceAccount +### Metadata +Name | Format +---- | ------ +annotations | [Map](#map)<[String](#string), [String](#string)> +labels | [Map](#map)<[String](#string), [String](#string)> +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [Identifier](#identifier) | True | - | - +imagePullSecrets | [Nullable](#nullable)<[List](#list)<[SAImgPullSecretSubject](#saimgpullsecretsubject)>> | False | <unknown transformation> | - +secrets | [Nullable](#nullable)<[List](#list)<[SASecretSubject](#sasecretsubject)>> | False | <unknown transformation> | - +## ServicePort +### Parent types: +- [AWSLoadBalancerService](#awsloadbalancerservice) +- [ClusterIPService](#clusteripservice) +- [Service](#service) +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [Nullable](#nullable)<[Identifier](#identifier)> | False | - | - +port | [Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>> | False | - | - +protocol | [Enum](#enum)('TCP', 'UDP') | False | - | - +targetPort | [OneOf](#oneof)<[Positive](#positive)<[NonZero](#nonzero)<[Integer](#integer)>>, [Identifier](#identifier)> | False | - | - +## StorageClass +### Metadata +Name | Format +---- | ------ +annotations | [Map](#map)<[String](#string), [String](#string)> +labels | [Map](#map)<[String](#string), [String](#string)> +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [Identifier](#identifier) | True | - | - +parameters | [Map](#map)<[String](#string), [String](#string)> | False | - | - +provisioner | [String](#string) | False | - | - +## TLSCredentials +### Parents: +- [Secret](#secret) +### Metadata +Name | Format +---- | ------ +annotations | [Map](#map)<[String](#string), [String](#string)> +labels | [Map](#map)<[String](#string), [String](#string)> +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [Identifier](#identifier) | True | - | - +secrets | [Map](#map)<[String](#string), [String](#string)> | False | - | - +tls_cert | [String](#string) | False | - | - +tls_key | [String](#string) | False | - | - +type | [NonEmpty](#nonempty)<[String](#string)> | False | - | - +## User +### Metadata +Name | Format +---- | ------ +annotations | [Map](#map)<[String](#string), [String](#string)> +labels | [Map](#map)<[String](#string), [String](#string)> +### Properties: + +Name | Type | Identifier | Type Transformation | Aliases +---- | ---- | ---------- | ------------------- | ------- +name | [UserIdentifier](#useridentifier) | True | - | - +fullName | [Nullable](#nullable)<[String](#string)> | False | - | - +identities | [NonEmpty](#nonempty)<[List](#list)<[NonEmpty](#nonempty)<[String](#string)>>> | False | - | - diff --git a/lib/commands/describe.py b/lib/commands/describe.py index fa0e72b..a355aa1 100644 --- a/lib/commands/describe.py +++ b/lib/commands/describe.py @@ -85,7 +85,7 @@ def run(self, args): print('', file=sys.stdout) found = True print('.'.join(ss[0:]) + ':', file=sys.stdout) - print(obj.get_help(), file=sys.stdout) + print(obj.get_help().render_terminal(), file=sys.stdout) if not found: return 1 diff --git a/lib/commands/docgen.py b/lib/commands/docgen.py new file mode 100644 index 0000000..97996ef --- /dev/null +++ b/lib/commands/docgen.py @@ -0,0 +1,64 @@ +# (c) Copyright 2017-2018 OLX + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + +from command import Command +from .bases import CommandRepositoryBase +import load_python +import os + +class Command_docgen(Command, CommandRepositoryBase): + """ + Generate the documentation of all classes supported by rubiks on your local rubiks folder. + """ + + _documentation = """ + This document is automatically generated using the command `docgen` and describe all the object and types that can be used inside Rubiks to configure your cluster + + It is possible to generate this documentation locally running inside your rubiks repo `rubiks docgen`. + """ + + def populate_args(self, parser): + pass + + def run(self, args): + objs = load_python.PythonBaseFile.get_kube_objs() + types = load_python.PythonBaseFile.get_kube_types() + formats = load_python.PythonBaseFile.get_kube_vartypes() + + r = self.get_repository() + + doc = '\n'.join([line.strip() for line in self._documentation.split('\n')]) + + md = '' + header = '

\n\n' + header += '# Rubiks Object Index\n{}\n\n'.format(doc) + header += '# Table of contents\n\n' + + header += '- [Formats](#formats)\n' + md += '\n# Formats\n\n' + for fname in sorted(formats.keys()): + header += ' - [{}](#{})\n'.format(fname, fname.lower()) + md += '## {}\n\n'.format(fname) + md += '{}\n\n'.format(formats[fname].get_description()) + + header += '- [Types](#types)\n' + md += '\n# Types\n\n' + for tname in sorted(types.keys()): + header += ' - [{}](#{})\n'.format(tname, tname.lower()) + md += '## {}\n\n'.format(tname) + md += '{}\n\n'.format(types[tname].get_description()) + + + header += '- [Objects](#objects)\n' + md += '\n# Objects\n\n' + for oname in sorted(objs.keys()): + header += ' - [{}](#{})\n'.format(oname, oname.lower()) + md += objs[oname].get_help().render_markdown() + + with open(os.path.join(r.basepath, 'docs/rubiks.class.md'), 'w') as f: + f.write(header.encode('utf-8')) + f.write(md.encode('utf-8')) \ No newline at end of file diff --git a/lib/kube_help.py b/lib/kube_help.py new file mode 100644 index 0000000..b417121 --- /dev/null +++ b/lib/kube_help.py @@ -0,0 +1,197 @@ +# (c) Copyright 2017-2018 OLX + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + +from kube_types import Map, String + + +# Object used to collect class definition and implement the rendering functions +class KubeHelper(object): + # Internal data structure to store needed data + _data = {} + # List of all needed field to have + _defaults = { + 'class_name': None, + 'class_subclasses': [], + 'class_superclasses': None, + 'class_types': {}, + 'class_is_abstract': None, + 'class_identifier': None, + 'class_mapping': [], + 'class_parent_types': None, + 'class_has_metadata': None, + 'class_doc': None, + 'class_doc_link': None, + 'class_xf_hasattr': [], + 'class_xf_detail': [] + } + # definition of mandatory field to display + _mandatory = { + 'class_name': True, + 'class_subclasses': False, + 'class_superclasses': False, + 'class_types': False, + 'class_is_abstract': True, + 'class_identifier': False, + 'class_mapping': False, + 'class_parent_types': False, + 'class_has_metadata': True, + 'class_doc': False, + 'class_doc_link': False, + 'class_xf_hasattr': False, + 'class_xf_detail': False + } + + def __init__(self, *args, **kwargs): + self._defaults_creations() + + if 'name' in kwargs: + self.class_name = kwargs['name'] + if 'document' in kwargs: + self.class_doc = kwargs['document'] + if 'documentlink' in kwargs: + self.class_doc_link = kwargs['documentlink'] + + def _defaults_creations(self): + for name in getattr(self, '_defaults'): + if name in self._mandatory: + self._data[name] = self._defaults[name] + else: + raise Exception('Missing mandatory information for {} inside {} class'.format(name, self.__class__.__name__)) + + def __getattr__(self, name): + if name in getattr(self, '_data'): + return self._data[name] + else: + raise ValueError + + def __setattr__(self, name, value): + if name in getattr(self, '_data'): + self._data[name] = value + else: + raise ValueError + + def render_terminal(self): + txt = '{}{}:\n'.format(self.class_name, self.class_is_abstract) + + if len(self.class_superclasses) != 0: + txt += ' parents: {}\n'.format(', '.join(self.class_superclasses)) + if len(self.class_subclasses) != 0: + txt += ' children: {}\n'.format(', '.join(self.class_subclasses)) + if len(self.class_parent_types) != 0: + txt += ' parent types: {}\n'.format(', '.join(sorted(self.class_parent_types.keys()))) + if self.class_has_metadata: + txt += ' metadata:\n' + txt += ' annotations: {}\n'.format(Map(String, String).name()) + txt += ' labels: {}\n'.format(Map(String, String).name()) + txt += ' properties:\n' + if self.class_identifier is not None: + spc = '' + if len(self.class_identifier) < 7: + spc = (7 - len(self.class_identifier)) * ' ' + txt += ' {} (identifier): {}{}\n'.format(self.class_identifier, spc, self.class_types[self.class_identifier].name()) + + for p in sorted(self.class_types.keys()): + if p == self.class_identifier: + continue + spc = '' + if len(p) < 20: + spc = (20 - len(p)) * ' ' + xf = '*' if 'xf_{}'.format(p) in self.class_xf_hasattr else ' ' + + txt += ' {}{}: {}{}\n'.format(xf, p, spc, self.class_types[p].name()) + if p in self.class_mapping: + txt += ' ({})\n'.format(', '.join(self.class_mapping[p])) + + return txt + + + def _get_markdown_link(self, objects): + if isinstance(objects, list): + return ['[{}](#{})'.format(classname, classname.lower()) for classname in objects] + else: + return '[{}](#{})'.format(objects, objects.lower()) + + def _docstring_formatter(self): + return '\n'.join([line.strip() for line in self.class_doc.split('\n')]) + + def _decorate_obj_links(self, display, links): + for link in links: + display = display.replace(link, self._get_markdown_link(link)) + + return display + + def render_markdown(self): + # Title generation based on link + if self.class_doc_link is not None: + txt = '## [{}]({})\n'.format(self.class_name, self.class_doc_link) + else: + txt = '## {}\n'.format(self.class_name) + + # Add class doc string if exists + if self.class_doc is not None: + txt += '\n{}\n'.format(self._docstring_formatter()) + + # Parents + if len(self.class_superclasses) != 0: + txt += '### Parents: \n' + for obj in self._get_markdown_link(self.class_superclasses): + txt += '- {}\n'.format(obj) + + # Children + if len(self.class_subclasses) != 0: + txt += '### Children: \n' + for obj in self._get_markdown_link(self.class_subclasses): + txt += '- {}\n'.format(obj) + + # Parent types + if len(self.class_parent_types) != 0: + txt += '### Parent types: \n' + for obj in self._get_markdown_link(sorted(self.class_parent_types.keys())): + txt += '- {}\n'.format(obj) + + # Metadata + if self.class_has_metadata: + txt += '### Metadata\n' + txt += 'Name | Format\n' + txt += '---- | ------\n' + txt += 'annotations | {}\n'.format(Map(String, String).name(md=True)) + txt += 'labels | {}\n'.format(Map(String, String).name(md=True)) + + # Properties table + if len(self.class_types.keys()) == 0: + return txt + + txt += '### Properties:\n\n' + txt += 'Name | Type | Identifier | Type Transformation | Aliases\n' + txt += '---- | ---- | ---------- | ------------------- | -------\n' + if self.class_identifier is not None: + txt += '{} | {} | True | - | - \n'.format(self.class_identifier, self._get_markdown_link(self.class_types[self.class_identifier].name())) + + for p in sorted(self.class_types.keys()): + if p == self.class_identifier: + continue + + # Prepare Type transformation and remove special character that could ruin visualization in markdown + xf_data = self.class_xf_detail[p] if p in self.class_xf_detail else '-' + xf_data = xf_data.replace('<', '<').replace('>', '>') + + is_mapped = ', '.join(self._get_markdown_link(self.class_mapping[p])) if p in self.class_mapping else '-' + + original_type = self.class_types[p].original_type() + display_type = self.class_types[p].name(md=True).replace('<', '<').replace('>', '>') + + if original_type is not None: + if isinstance(original_type, list): + original_type = original_type[0] + elif isinstance(original_type, dict): + original_type = original_type['value'] + + + txt += '{} | {} | False | {} | {} \n'.format(p, display_type, xf_data, is_mapped) + + return txt + \ No newline at end of file diff --git a/lib/kube_obj.py b/lib/kube_obj.py index 343c690..cb6b72e 100644 --- a/lib/kube_obj.py +++ b/lib/kube_obj.py @@ -9,8 +9,10 @@ import traceback import sys from collections import OrderedDict +from kube_help import KubeHelper -from kube_types import * +from kube_types import Integer, Positive, NonZero, Number, Boolean +from kube_types import String, Map, List, Identifier, NonEmpty, KubeType from user_error import UserError, paths as user_error_paths @@ -49,7 +51,7 @@ def __init__(self, text, obj, input_doc): self.doc = input_doc def __repr__(self): - return '{}(obj={}, doc={})'.format(self.__class__.__name__, self.obj.__name__, repr(doc)) + return '{}(obj={}, doc={})'.format(self.__class__.__name__, self.obj.__name__, repr(self.doc)) class KubeTypeUnresolvable(Exception): @@ -74,6 +76,7 @@ class KubeBaseObj(object): has_metadata = False _is_openshift = False _always_regenerate = False + _document_url = None def __init__(self, *args, **kwargs): # put the identifier in if it's specified @@ -237,7 +240,7 @@ def basic_validation(typ): tk = basic_validation(kk) tv = basic_validation(vv) if tk is not None and tv is not None: - types[k] = NonEmpty(Dict(tk, tv)) + types[k] = NonEmpty(dict(tk, tv)) if not isinstance(types[k], KubeType): raise KubeTypeUnresolvable( @@ -304,6 +307,12 @@ def _rec_subclasses(kls): @classmethod def get_help(cls): + ret_help = KubeHelper( + name=cls.__name__, + document=cls.__doc__, + documentlink=cls._document_url + ) + def _rec_superclasses(kls): ret = [] superclasses = list(filter(lambda x: x is not KubeBaseObj and x is not KubeSubObj and @@ -317,58 +326,32 @@ def _rec_superclasses(kls): return ret - subclasses = list(map(lambda x: x.__name__, cls.get_subclasses(non_abstract=False, include_self=False))) - superclasses = list(map(lambda x: x.__name__, _rec_superclasses(cls))) + ret_help.class_subclasses = list(map(lambda x: x.__name__, cls.get_subclasses(non_abstract=False, include_self=False))) + ret_help.class_superclasses = list(map(lambda x: x.__name__, _rec_superclasses(cls))) - types = cls.resolve_types() + ret_help.class_types = cls.resolve_types() - abstract = '' - if cls.is_abstract_type(): - abstract = ' (abstract type)' - - identifier = None - if hasattr(cls, 'identifier') and cls.identifier is not None: - identifier = cls.identifier - - txt = '{}{}:\n'.format(cls.__name__, abstract) - if len(superclasses) != 0: - txt += ' parents: {}\n'.format(', '.join(superclasses)) - if len(subclasses) != 0: - txt += ' children: {}\n'.format(', '.join(subclasses)) - if len(cls._parent_types) != 0: - txt += ' parent types: {}\n'.format(', '.join(sorted(cls._parent_types.keys()))) - if cls.has_metadata: - txt += ' metadata:\n' - txt += ' annotations: {}\n'.format(Map(String, String).name()) - txt += ' labels: {}\n'.format(Map(String, String).name()) - txt += ' properties:\n' - if identifier is not None: - spc = '' - if len(identifier) < 7: - spc = (7 - len(identifier)) * ' ' - txt += ' {} (identifier): {}{}\n'.format(identifier, spc, types[identifier].name()) + ret_help.class_is_abstract = '' if cls.is_abstract_type() else ' (abstract type)' + ret_help.class_identifier = cls.identifier if hasattr(cls, 'identifier') and cls.identifier is not None else None mapping = cls._find_defaults('_map') - rmapping = {} + ret_help.class_mapping = {} for d in mapping: - if mapping[d] not in rmapping: - rmapping[mapping[d]] = [] - rmapping[mapping[d]].append(d) + if mapping[d] not in ret_help.class_mapping: + ret_help.class_mapping[mapping[d]] = [] + ret_help.class_mapping[mapping[d]].append(d) - for p in sorted(types.keys()): - if p == identifier: - continue - spc = '' - if len(p) < 20: - spc = (20 - len(p)) * ' ' - if hasattr(cls, 'xf_{}'.format(p)): - xf = '*' - else: - xf = ' ' - txt += ' {}{}: {}{}\n'.format(xf, p, spc, types[p].name()) - if p in rmapping: - txt += ' ({})\n'.format(', '.join(rmapping[p])) - return txt + ret_help.class_parent_types = cls._parent_types + ret_help.class_has_metadata = cls.has_metadata + + ret_help.class_xf_detail = {} + for p in ret_help.class_types: + if hasattr(cls, 'xf_' + p): + ret_help.class_xf_detail[p] = '' + if hasattr(getattr(cls, 'xf_' + p), '__doc__') and getattr(cls, 'xf_' + p).__doc__ is not None and len(getattr(cls, 'xf_' + p).__doc__): + ret_help.class_xf_detail[p] = getattr(cls, 'xf_' + p).__doc__ + + return ret_help def has_child_object(self, obj): assert isinstance(obj, KubeBaseObj) diff --git a/lib/kube_objs/deployment.py b/lib/kube_objs/deployment.py index 0f26c44..f954c43 100644 --- a/lib/kube_objs/deployment.py +++ b/lib/kube_objs/deployment.py @@ -87,9 +87,17 @@ def render(self): class Deployment(KubeObj): + """ + A Deployment controller provides declarative updates for Pods and ReplicaSets. + + You describe a desired state in a Deployment object, and the Deployment controller changes the actual state to the desired state at a controlled rate. + You can define Deployments to create new ReplicaSets, or to remove existing Deployments and adopt all their resources with new Deployments. + """ + apiVersion = 'extensions/v1beta1' kind = 'Deployment' kubectltype = 'deployment' + _document_url = 'https://kubernetes.io/docs/concepts/workloads/controllers/deployment/' _defaults = { 'minReadySeconds': None, diff --git a/lib/kube_types.py b/lib/kube_types.py index b2e04e2..e3c8283 100644 --- a/lib/kube_types.py +++ b/lib/kube_types.py @@ -1,4 +1,5 @@ # (c) Copyright 2017-2018 OLX +# -*- coding: utf-8 -*- from __future__ import absolute_import from __future__ import division @@ -52,15 +53,23 @@ def construct_arg(cls, arg): return ret + @classmethod + def get_description(cls): + if cls.__doc__ is not None and cls.__doc__ is not '': + return '\n'.join([line.strip() for line in cls.__doc__.split('\n')]) + return 'TODO: Description is still missing from the class docstring.\nStay tuned to have more hint about this variable.' + def original_type(self): if self.wrapper: return self.wrap.original_type() return None - def name(self): + def name(self, render=None): + if render is None: + render = lambda x: x if self.wrapper: - return '{}<{}>'.format(self.__class__.__name__, self.wrap.name()) - return self.__class__.__name__ + return '{}<{}>'.format(render(self.__class__.__name__), self.wrap.name(render=render)) + return render(self.__class__.__name__) def check_wrap(self, value, path): if self.wrapper: @@ -91,8 +100,10 @@ def __init__(self, cls): def original_type(self): return self.cls - def name(self): - return self.cls.__name__ + def name(self, render=None): + if render is None: + render = lambda x: x + return render(self.cls.__name__) def do_check(self, value, path): self.validation_text = "Not the right object type" @@ -105,6 +116,9 @@ def do_check(self, value, path): class Nullable(KubeType): + """ + This wrapper if telling to rubiks that the parameter could be some valid value or null(None in python) + """ validation_text = "Expected type or None" wrapper = True @@ -115,6 +129,10 @@ def do_check(self, value, path): class Boolean(KubeType): + """ + Boolean, or boolean logic, is a subset of algebra used for creating true/false statements. + Boolean expressions use the operators AND, OR, XOR, and NOT to compare values and return a true or false result. + """ validation_text = "Expected boolean" def do_check(self, value, path): @@ -122,17 +140,35 @@ def do_check(self, value, path): class Enum(KubeType): + """ + Enum, short for "enumerated," is a data type that consists of predefined values. A constant or variable defined as an enum can store one of the values listed in the enum declaration. + + **Example** + + `Enum('Value1', 'Value2', 'Value3')` + """ def __init__(self, *args): self.enums = args - def name(self): - return '{}({})'.format(self.__class__.__name__, ', '.join(map(repr, self.enums))) + def name(self, md=False): + def fake_repr(x): + ret = repr(x) + if ret.startswith("u'"): + return ret[1:] + return ret + if md: + return '[{}](#{})({})'.format(self.__class__.__name__, self.__class__.__name__.lower(), ', '.join(map(fake_repr, self.enums))) + return '{}({})'.format(self.__class__.__name__, ', '.join(map(fake_repr, self.enums))) def do_check(self, value, path): return value in self.enums class Integer(KubeType): + """ + An integer is a whole number (not a fraction) that can be positive, negative, or zero. + Therefore, the numbers 10, 0, -25, and 5,148 are all integers. Unlike floating point numbers, integers cannot have decimal places. + """ validation_text = "Expected integer" def do_check(self, value, path): @@ -144,6 +180,9 @@ def do_check(self, value, path): class Number(KubeType): + """ + An integer is a whole number (not a fraction) that can be positive, negative, floating or zero. + """ validation_text = "Expected number" def do_check(self, value, path): @@ -155,6 +194,9 @@ def do_check(self, value, path): class Positive(KubeType): + """ + Define a number that needs to be positive (0 is included as positive) + """ validation_text = "Expected positive" wrapper = True @@ -163,6 +205,10 @@ def do_check(self, value, path): class NonZero(KubeType): + """ + Represent any number that is not 0. + Will be accepted positive and negative of any kind. + """ validation_text = "Expected non-zero" wrapper = True @@ -171,6 +217,9 @@ def do_check(self, value, path): class String(KubeType): + """ + String is any finite sequence of characters (i.e., letters, numerals, symbols and punctuation marks). + """ validation_text = "Expected string" def do_check(self, value, path): @@ -180,6 +229,9 @@ def do_check(self, value, path): class SurgeSpec(KubeType): + """ + SurgeSpec is expection surge/unavailable type ie integer or percent + """ validation_text = "Expected surge/unavailable type ie integer or percent" def do_check(self, value, path): @@ -216,6 +268,13 @@ def check_zero(v): class IPv4(String): + """ + Internet Protocol Version 4 (IPv4) is the fourth revision of the Internet Protocol and a widely used protocol in data communication over different kinds of networks. + + IPv4 is a connectionless protocol used in packet-switched layer networks, such as Ethernet. + + More documentation can be found on [that URL](https://en.wikipedia.org/wiki/IPv6) + """ validation_text = "Expected an IPv4 address" def do_check(self, value, path): @@ -239,7 +298,43 @@ def comp_ok(x): return True +class IPv6(String): + """ + Internet Protocol Version 6 (IPv6) is an Internet Protocol (IP) used for carrying data in packets from a source to a destination over various networks. + + IPv6 is the enhanced version of IPv4 and can support very large numbers of nodes as compared to IPv4. + + It allows for 2128 possible node, or address, combinations. + + More documentation can be found on [that URL](https://en.wikipedia.org/wiki/IPv6) + + **NOTE:** This function is experimental please report any issue with that. + """ + validation_text = "Expected an IPv6 address" + def do_check(self, value, path): + # Needs to be a string in first place + if not String.do_check(self, value, path): + return False + + valid_characters = 'ABCDEFabcdef:0123456789' + is_valid = all(current in valid_characters for current in value) + address_list = value.split(':') + valid_segment = all(len(current) <= 4 for current in address_list) + + if is_valid and valid_segment and len(address_list) == 8: + return True + else: + return False + + class IP(String): + """ + An Internet Protocol address (IP address) is a numerical label assigned to each device connected to a computer network that uses the Internet Protocol for communication. + + An IP address serves two principal functions: host or network interface identification and location addressing. + + Valid IP could be either IPv4 ~~or IPv6~~ + """ validation_text = "Expected an IP address" def do_check(self, value, path): @@ -247,6 +342,23 @@ def do_check(self, value, path): class Domain(String): + """ + The definitive descriptions of the rules for forming domain names appear in [RFC 1035](https://tools.ietf.org/html/rfc1035), [RFC 1123](https://tools.ietf.org/html/rfc1123), and [RFC 2181](https://tools.ietf.org/html/rfc2181). A domain name consists of one or more parts, technically called labels, that are conventionally concatenated, and delimited by dots, such as `example.com`. + + The right-most label conveys the top-level domain; for example, the domain name `www.example.com` belongs to the top-level domain `com`. + + The hierarchy of domains descends from right to left; each label to the left specifies a subdivision, or subdomain of the domain to the right. For example, the label example specifies a subdomain of the com domain, and www is a subdomain of example.com. + This tree of subdivisions may have up to 127 levels. + + A label may contain zero to 63 characters. The null label, of length zero, is reserved for the root zone. + The full domain name may not exceed the length of 253 characters in its textual representation.In the internal binary representation of the DNS the maximum length requires 255 octets of storage, as it also stores the length of the name. + + Although no technical limitation exists to use any character in domain name labels which are representable by an octet, hostnames use a preferred format and character set. + The characters allowed in labels are a subset of the ASCII character set, consisting of characters a through z, A through Z, digits 0 through 9, and hyphen. + This rule is known as the LDH rule (letters, digits, hyphen). + Domain names are interpreted in case-independent manner. + Labels may not start or end with a hyphen. An additional rule requires that top-level domain names should not be all-numeric.[20] + """ validation_text = "Expected a domain name" def do_check(self, value, path): @@ -271,6 +383,9 @@ def comp_ok(x): class Identifier(String): + """ + An Identifier should be shorter than 253 chars and lc alphanum or . or - + """ validation_text = "Identifiers should be <253 chars and lc alphanum or . or -" def do_check(self, value, path): @@ -286,6 +401,9 @@ def do_check(self, value, path): class CaseIdentifier(Identifier): + """ + An Identifier should be shorten thsn 253 chars and alphanum or . or - + """ validation_text = "Identifiers should be <253 chars and alphanum or . or -" def do_check(self, value, path): @@ -301,6 +419,9 @@ def do_check(self, value, path): class SystemIdentifier(Identifier): + """ + An Identifier should be shorten than 253 chars and lc alphanum or . or - or : + """ validation_text = "Identifiers should be <253 chars and lc alphanum or . or - or :" def do_check(self, value, path): @@ -321,6 +442,9 @@ def do_check(self, value, path): class ColonIdentifier(Identifier): + """ + An Identifier should be shorten than 253 chars and lc alphanum or . or - or : + """ validation_text = "Identifiers should be <253 chars and lc alphanum or . or - and a :" def do_check(self, value, path): @@ -341,6 +465,38 @@ def do_check(self, value, path): class ARN(String): + """ + Amazon Resource Names (ARNs) uniquely identify AWS resources. + + The following are the general formats for ARNs; the specific components and values used depend on the AWS service. + + ``` + arn:partition:service:region:account-id:resource + arn:partition:service:region:account-id:resourcetype/resource + arn:partition:service:region:account-id:resourcetype:resource + ``` + + **partition** + + The partition that the resource is in. For standard AWS regions, the partition is aws. If you have resources in other partitions, the partition is aws-partitionname. For example, the partition for resources in the China (Beijing) region is aws-cn. + + **service** + + The service namespace that identifies the AWS product (for example, Amazon S3, IAM, or Amazon RDS). For a list of namespaces, see AWS Service Namespaces. + + **region** + + The region the resource resides in. Note that the ARNs for some resources do not require a region, so this component might be omitted. + + **account** + + The ID of the AWS account that owns the resource, without the hyphens. For example, 123456789012. Note that the ARNs for some resources don't require an account number, so this component might be omitted. + + **resource, resourcetype:resource, or resourcetype/resource** + + The content of this part of the ARN varies by service. It often includes an indicator of the type of resource—for example, an IAM user or Amazon RDS database —followed by a slash (/) or a colon (:), followed by the resource name itself. Some services allow paths for resource names, as described in Paths in ARNs. + """ + validation_text = "Amazon ARNs start with arn:aws:..." def do_check(self, value, path): @@ -352,6 +508,15 @@ def do_check(self, value, path): class Path(String): + """ + A path, the general form of the name of a file or directory, specifies a unique location in a file system. + A path points to a file system location by following the directory tree hierarchy expressed in a string of characters in which path components, separated by a delimiting character, represent each directory. + The delimiting character is most commonly the slash ("/"), the backslash character ("\"), or colon (":"), though some operating systems may use a different delimiter. + Paths are used extensively in computer science to represent the directory/file relationships common in modern operating systems, and are essential in the construction of Uniform Resource Locators (URLs). + Resources can be represented by either absolute or relative paths. + + More info could be fount [here](https://en.wikipedia.org/wiki/Path_(computing)) + """ validation_text = "Expecting a fully qualified path" def do_check(self, value, path): @@ -361,6 +526,9 @@ def do_check(self, value, path): class NonEmpty(KubeType): + """ + This wrapper is ensuring that a field could not be left empty but needs to have a valid value. + """ validation_text = "Expecting non-empty" wrapper = True @@ -370,11 +538,16 @@ def do_check(self, value, path): class OneOf(KubeType): + """ + This wrapper is defininig the possibility for a field to be either multiple types. + """ def __init__(self, *types): assert len(types) > 1 self.types = list(map(self.__class__.construct_arg, types)) - def name(self): + def name(self, md=False): + if md: + return '[{}](#{})<{}>'.format(self.__class__.__name__, self.__class__.__name__.lower(), ', '.join(map(lambda x: x.name(md=True), self.types))) return self.__class__.__name__ + '<' + ', '.join(map(lambda x: x.name(), self.types)) + '>' def original_type(self): @@ -399,6 +572,9 @@ def check(self, value, path=None): class List(KubeType): + """ + This field is enforcing a check to a field to determinate if a list was actually provided as parameter. + """ validation_text = "Expecting list" wrapper = True @@ -423,11 +599,24 @@ def do_check(self, value, path): class Map(KubeType): + """ + Enforce a Map to be composed by pre-defined types specified on the initialization. + + **Esample:** + + `Map(String, String)` + `Map(Int, String)` + `Map(Int, Int)` + + This will allow to perform some authomatic checks inside the imput of an Object + """ def __init__(self, key, value): self.key = self.__class__.construct_arg(key) self.value = self.__class__.construct_arg(value) - def name(self): + def name(self, md=False): + if md: + return '[{}](#{})<{}, {}>'.format(self.__class__.__name__, self.__class__.__name__.lower(), self.key.name(md=True), self.value.name(md=True)) return '{}<{}, {}>'.format(self.__class__.__name__, self.key.name(), self.value.name()) def original_type(self): diff --git a/lib/kube_vartypes.py b/lib/kube_vartypes.py index 664554a..2499d25 100644 --- a/lib/kube_vartypes.py +++ b/lib/kube_vartypes.py @@ -17,6 +17,9 @@ class Base64(var_types.VarEntity): + """ + It is representing a [base64](https://en.wikipedia.org/wiki/Base64) encoded strign + """ def init(self, value): self.value = value @@ -32,6 +35,9 @@ def to_string(self): class JSON(var_types.VarEntity): + """ + It is representing a [JSON](https://en.wikipedia.org/wiki/JSON) object + """ def init(self, value): self.value = value self.args = {'indent': None, 'separators': (',',':')} @@ -48,6 +54,9 @@ def _default_json(obj): class YAML(var_types.VarEntity): + """ + It is representing a [YAML](https://en.wikipedia.org/wiki/YAML) object + """ def init(self, value): self.value = value @@ -59,6 +68,9 @@ def to_string(self): class Confidential(var_types.VarEntity): + """ + It is representing a confidential/secret string that needs to not be displayed publicly + """ def init(self, value): self.value = value @@ -78,6 +90,9 @@ class CommandRuntimeException(Exception): class Command(var_types.VarEntity): + """ + It is representing a docker command to be executed by kubernetes in the process of spinning up a new Pod + """ def init(self, cmd, cwd=None, env_clear=False, env=None, good_rc=None, rstrip=False, eol=False): self.cmd = cmd self.cwd = cwd diff --git a/lib/load_python.py b/lib/load_python.py index a4ad162..cb6492f 100644 --- a/lib/load_python.py +++ b/lib/load_python.py @@ -15,7 +15,7 @@ import kube_yaml from load_python_core import do_compile_internal -from kube_obj import KubeObj, KubeBaseObj +from kube_obj import KubeObj, KubeBaseObj, KubeType from obj_registry import obj_registry, get_ns from user_error import UserError, user_originated, handle_user_error from output import RubiksOutputError, OutputCollection @@ -23,6 +23,7 @@ from util import mkdir_p import kube_objs +import kube_types import kube_vartypes @@ -209,6 +210,7 @@ def gen_output(self): class PythonBaseFile(object): _kube_objs = None _kube_vartypes = None + _kube_type = None compile_in_init = True default_export_objects = False can_cluster_context = True @@ -242,6 +244,26 @@ def get_kube_vartypes(cls): pass return cls._kube_vartypes + @classmethod + def get_kube_types(cls): + if cls._kube_type is None: + cls._kube_type = {} + + for k in kube_types.__dict__: + if isinstance(kube_types.__dict__[k], type) and k not in ('KubeType', 'SurgeCheck'): + try: + if hasattr(kube_types.__dict__[k], 'wrapper'): + if kube_types.__dict__[k].wrapper: + if isinstance(kube_types.__dict__[k](kube_types.String), kube_types.KubeType): + cls._kube_type[k] = kube_types.__dict__[k] + else: + if isinstance(kube_types.__dict__[k](), kube_types.KubeType): + cls._kube_type[k] = kube_types.__dict__[k] + except: + pass + + return cls._kube_type + def __init__(self, collection, path): if path.basename == '' or path.basename.lower().strip('0123456789abcdefghijklmnopqrstuvwxyz_') != '': raise UserError(ValueError( @@ -502,6 +524,7 @@ def cluster_info(c): ret.update(self.__class__.get_kube_objs()) ret.update(self.__class__.get_kube_vartypes()) + ret.update(self.__class__.get_kube_types()) self.reserved_names = tuple(ret.keys()) diff --git a/lib/var_types.py b/lib/var_types.py index 7c6ac70..de010c7 100644 --- a/lib/var_types.py +++ b/lib/var_types.py @@ -118,3 +118,9 @@ def __str__(self): if self.renderer is None: return self._internal_render() return self.renderer(self._internal_render()) + + @classmethod + def get_description(cls): + if cls.__doc__ is not None and cls.__doc__ is not '': + return '\n'.join([line.strip() for line in cls.__doc__.split('\n')]) + return 'TODO: Description is still missing from the class docstring.\nStay tuned to have more hint about this variable.'