diff --git a/docs/design/resource_dep.svg b/docs/design/resource_dep.svg index 8b8c09d7c5b..fdca1fd36c3 100644 --- a/docs/design/resource_dep.svg +++ b/docs/design/resource_dep.svg @@ -1,1728 +1,2116 @@ - - - + + G - -cluster_Target - -Target - -cluster_bootkube - -bootkube - -cluster_bootstrap - -bootstrap - -cluster_cluster - -cluster - -cluster_installconfig - -installconfig - -cluster_kubeconfig - -kubeconfig - -cluster_machine - -machine - -cluster_machines - -machines - -cluster_manifests - -manifests - -cluster_openshift - -openshift - -cluster_openshiftinstall - -openshiftinstall - -cluster_password - -password - -cluster_releaseimage - -releaseimage - -cluster_rhcos - -rhcos - -cluster_tls - -tls + + +cluster_Target + +Target + + +cluster_bootkube + +bootkube + + +cluster_bootstrap + +bootstrap + + +cluster_cluster + +cluster + + +cluster_installconfig + +installconfig + + +cluster_kubeconfig + +kubeconfig + + +cluster_machine + +machine + + +cluster_machines + +machines + + +cluster_manifests + +manifests + + +cluster_openshift + +openshift + + +cluster_openshiftinstall + +openshiftinstall + + +cluster_password + +password + + +cluster_releaseimage + +releaseimage + + +cluster_rhcos + +rhcos + + +cluster_tls + +tls -installconfig.InstallConfig - -installconfig.InstallConfig + +installconfig.InstallConfig + +installconfig.InstallConfig -Target Install Config - -Target Install Config + +Target Install Config + +Target Install Config -installconfig.InstallConfig->Target Install Config - - + +installconfig.InstallConfig->Target Install Config + + + + + +machines.Master + +machines.Master + + + +installconfig.InstallConfig->machines.Master + + -installconfig.ClusterID - -installconfig.ClusterID + +installconfig.ClusterID + +installconfig.ClusterID -installconfig.InstallConfig->installconfig.ClusterID - - + +installconfig.InstallConfig->installconfig.ClusterID + + -installconfig.PlatformCredsCheck - -installconfig.PlatformCredsCheck + +installconfig.PlatformCredsCheck + +installconfig.PlatformCredsCheck -installconfig.InstallConfig->installconfig.PlatformCredsCheck - - - - -machines.Master - -machines.Master - - -installconfig.InstallConfig->machines.Master - - + +installconfig.InstallConfig->installconfig.PlatformCredsCheck + + -rhcos.Image - -rhcos.Image + +rhcos.Image + +rhcos.Image -installconfig.InstallConfig->rhcos.Image - - + +installconfig.InstallConfig->rhcos.Image + + -machine.Master - -machine.Master + +machine.Master + +machine.Master -installconfig.InstallConfig->machine.Master - - + +installconfig.InstallConfig->machine.Master + + -machines.Worker - -machines.Worker + +machines.Worker + +machines.Worker -installconfig.InstallConfig->machines.Worker - - + +installconfig.InstallConfig->machines.Worker + + -machine.Worker - -machine.Worker + +machine.Worker + +machine.Worker -installconfig.InstallConfig->machine.Worker - - + +installconfig.InstallConfig->machine.Worker + + -manifests.Manifests - -manifests.Manifests + +manifests.Manifests + +manifests.Manifests -installconfig.InstallConfig->manifests.Manifests - - + +installconfig.InstallConfig->manifests.Manifests + + -manifests.Ingress - -manifests.Ingress + +manifests.Ingress + +manifests.Ingress -installconfig.InstallConfig->manifests.Ingress - - + +installconfig.InstallConfig->manifests.Ingress + + -manifests.DNS - -manifests.DNS + +manifests.DNS + +manifests.DNS -installconfig.InstallConfig->manifests.DNS - - + +installconfig.InstallConfig->manifests.DNS + + -manifests.Infrastructure - -manifests.Infrastructure + +manifests.Infrastructure + +manifests.Infrastructure -installconfig.InstallConfig->manifests.Infrastructure - - + +installconfig.InstallConfig->manifests.Infrastructure + + -manifests.CloudProviderConfig - -manifests.CloudProviderConfig + +manifests.CloudProviderConfig + +manifests.CloudProviderConfig -installconfig.InstallConfig->manifests.CloudProviderConfig - - + +installconfig.InstallConfig->manifests.CloudProviderConfig + + -manifests.AdditionalTrustBundleConfig - -manifests.AdditionalTrustBundleConfig + +manifests.AdditionalTrustBundleConfig + +manifests.AdditionalTrustBundleConfig -installconfig.InstallConfig->manifests.AdditionalTrustBundleConfig - - + +installconfig.InstallConfig->manifests.AdditionalTrustBundleConfig + + -manifests.Networking - -manifests.Networking + +manifests.Networking + +manifests.Networking -installconfig.InstallConfig->manifests.Networking - - + +installconfig.InstallConfig->manifests.Networking + + -manifests.Proxy - -manifests.Proxy + +manifests.Proxy + +manifests.Proxy -installconfig.InstallConfig->manifests.Proxy - - + +installconfig.InstallConfig->manifests.Proxy + + -manifests.Scheduler - -manifests.Scheduler + +manifests.Scheduler + +manifests.Scheduler -installconfig.InstallConfig->manifests.Scheduler - - + +installconfig.InstallConfig->manifests.Scheduler + + -manifests.ImageContentSourcePolicy - -manifests.ImageContentSourcePolicy + +manifests.ImageContentSourcePolicy + +manifests.ImageContentSourcePolicy -installconfig.InstallConfig->manifests.ImageContentSourcePolicy - - + +installconfig.InstallConfig->manifests.ImageContentSourcePolicy + + -tls.MCSCertKey - -tls.MCSCertKey + +tls.MCSCertKey + +tls.MCSCertKey -installconfig.InstallConfig->tls.MCSCertKey - - + +installconfig.InstallConfig->tls.MCSCertKey + + -manifests.Openshift - -manifests.Openshift + +manifests.Openshift + +manifests.Openshift -installconfig.InstallConfig->manifests.Openshift - - + +installconfig.InstallConfig->manifests.Openshift + + -kubeconfig.AdminClient - -kubeconfig.AdminClient + +kubeconfig.AdminClient + +kubeconfig.AdminClient -installconfig.InstallConfig->kubeconfig.AdminClient - - + +installconfig.InstallConfig->kubeconfig.AdminClient + + -bootstrap.Bootstrap - -bootstrap.Bootstrap + +bootstrap.Bootstrap + +bootstrap.Bootstrap -installconfig.InstallConfig->bootstrap.Bootstrap - - + +installconfig.InstallConfig->bootstrap.Bootstrap + + -kubeconfig.AdminInternalClient - -kubeconfig.AdminInternalClient + +kubeconfig.AdminInternalClient + +kubeconfig.AdminInternalClient -installconfig.InstallConfig->kubeconfig.AdminInternalClient - - + +installconfig.InstallConfig->kubeconfig.AdminInternalClient + + -kubeconfig.Kubelet - -kubeconfig.Kubelet + +kubeconfig.Kubelet + +kubeconfig.Kubelet -installconfig.InstallConfig->kubeconfig.Kubelet - - + +installconfig.InstallConfig->kubeconfig.Kubelet + + -kubeconfig.LoopbackClient - -kubeconfig.LoopbackClient + +kubeconfig.LoopbackClient + +kubeconfig.LoopbackClient -installconfig.InstallConfig->kubeconfig.LoopbackClient - - + +installconfig.InstallConfig->kubeconfig.LoopbackClient + + -tls.KubeAPIServerExternalLBServerCertKey - -tls.KubeAPIServerExternalLBServerCertKey + +tls.KubeAPIServerExternalLBServerCertKey + +tls.KubeAPIServerExternalLBServerCertKey -installconfig.InstallConfig->tls.KubeAPIServerExternalLBServerCertKey - - + +installconfig.InstallConfig->tls.KubeAPIServerExternalLBServerCertKey + + -tls.KubeAPIServerInternalLBServerCertKey - -tls.KubeAPIServerInternalLBServerCertKey + +tls.KubeAPIServerInternalLBServerCertKey + +tls.KubeAPIServerInternalLBServerCertKey -installconfig.InstallConfig->tls.KubeAPIServerInternalLBServerCertKey - - + +installconfig.InstallConfig->tls.KubeAPIServerInternalLBServerCertKey + + -tls.KubeAPIServerServiceNetworkServerCertKey - -tls.KubeAPIServerServiceNetworkServerCertKey + +tls.KubeAPIServerServiceNetworkServerCertKey + +tls.KubeAPIServerServiceNetworkServerCertKey -installconfig.InstallConfig->tls.KubeAPIServerServiceNetworkServerCertKey - - + +installconfig.InstallConfig->tls.KubeAPIServerServiceNetworkServerCertKey + + -cluster.Metadata - -cluster.Metadata + +cluster.Metadata + +cluster.Metadata -installconfig.InstallConfig->cluster.Metadata - - + +installconfig.InstallConfig->cluster.Metadata + + -cluster.TerraformVariables - -cluster.TerraformVariables + +cluster.TerraformVariables + +cluster.TerraformVariables -installconfig.InstallConfig->cluster.TerraformVariables - - + +installconfig.InstallConfig->cluster.TerraformVariables + + + + + +installconfig.PlatformProvisionCheck + +installconfig.PlatformProvisionCheck + + + +installconfig.InstallConfig->installconfig.PlatformProvisionCheck + + -rhcos.BootstrapImage - -rhcos.BootstrapImage + +rhcos.BootstrapImage + +rhcos.BootstrapImage -installconfig.InstallConfig->rhcos.BootstrapImage - - + +installconfig.InstallConfig->rhcos.BootstrapImage + + -cluster.Cluster - -cluster.Cluster + +cluster.Cluster + +cluster.Cluster -installconfig.InstallConfig->cluster.Cluster - - + +installconfig.InstallConfig->cluster.Cluster + + + + + +installconfig.PlatformPermsCheck + +installconfig.PlatformPermsCheck + + + +installconfig.InstallConfig->installconfig.PlatformPermsCheck + + -installconfig.sshPublicKey - -installconfig.sshPublicKey + +installconfig.sshPublicKey + +installconfig.sshPublicKey -installconfig.sshPublicKey->installconfig.InstallConfig - - + +installconfig.sshPublicKey->installconfig.InstallConfig + + -installconfig.baseDomain - -installconfig.baseDomain + +installconfig.baseDomain + +installconfig.baseDomain -installconfig.baseDomain->installconfig.InstallConfig - - + +installconfig.baseDomain->installconfig.InstallConfig + + -installconfig.clusterName - -installconfig.clusterName + +installconfig.clusterName + +installconfig.clusterName -installconfig.baseDomain->installconfig.clusterName - - + +installconfig.baseDomain->installconfig.clusterName + + -installconfig.platform - -installconfig.platform + +installconfig.platform + +installconfig.platform + + + +installconfig.platform->installconfig.InstallConfig + + -installconfig.platform->installconfig.baseDomain - - + +installconfig.platform->installconfig.baseDomain + + -installconfig.platform->installconfig.clusterName - - - - -installconfig.platform->installconfig.InstallConfig - - + +installconfig.platform->installconfig.clusterName + + -installconfig.clusterName->installconfig.InstallConfig - - + +installconfig.clusterName->installconfig.InstallConfig + + -installconfig.pullSecret - -installconfig.pullSecret + +installconfig.pullSecret + +installconfig.pullSecret -installconfig.pullSecret->installconfig.InstallConfig - - + +installconfig.pullSecret->installconfig.InstallConfig + + -Target Manifests - -Target Manifests + +Target Manifests + +Target Manifests -machines.Master->Target Manifests - - + +machines.Master->Target Manifests + + -machines.Master->bootstrap.Bootstrap - - + +machines.Master->bootstrap.Bootstrap + + -machines.Master->cluster.TerraformVariables - - + +machines.Master->cluster.TerraformVariables + + -installconfig.ClusterID->machines.Master - - + +installconfig.ClusterID->machines.Master + + -installconfig.ClusterID->machines.Worker - - + +installconfig.ClusterID->machines.Worker + + -installconfig.ClusterID->manifests.Manifests - - + +installconfig.ClusterID->manifests.Manifests + + -installconfig.ClusterID->manifests.DNS - - + +installconfig.ClusterID->manifests.DNS + + -installconfig.ClusterID->manifests.Infrastructure - - + +installconfig.ClusterID->manifests.Infrastructure + + -installconfig.ClusterID->manifests.CloudProviderConfig - - + +installconfig.ClusterID->manifests.CloudProviderConfig + + -installconfig.ClusterID->manifests.Openshift - - + +installconfig.ClusterID->manifests.Openshift + + -installconfig.ClusterID->cluster.Metadata - - + +installconfig.ClusterID->cluster.Metadata + + -installconfig.ClusterID->cluster.TerraformVariables - - + +installconfig.ClusterID->cluster.TerraformVariables + + -installconfig.ClusterID->cluster.Cluster - - + +installconfig.ClusterID->cluster.Cluster + + -installconfig.PlatformCredsCheck->machines.Master - - + +installconfig.PlatformCredsCheck->machines.Master + + -installconfig.PlatformCredsCheck->machines.Worker - - + +installconfig.PlatformCredsCheck->machines.Worker + + -installconfig.PlatformCredsCheck->manifests.DNS - - + +installconfig.PlatformCredsCheck->manifests.DNS + + -installconfig.PlatformCredsCheck->manifests.CloudProviderConfig - - + +installconfig.PlatformCredsCheck->manifests.CloudProviderConfig + + -installconfig.PlatformCredsCheck->cluster.Cluster - - + +installconfig.PlatformCredsCheck->cluster.Cluster + + -rhcos.Image->machines.Master - - + +rhcos.Image->machines.Master + + -rhcos.Image->machines.Worker - - + +rhcos.Image->machines.Worker + + -rhcos.Image->manifests.Openshift - - + +rhcos.Image->manifests.Openshift + + -rhcos.Image->bootstrap.Bootstrap - - + +rhcos.Image->bootstrap.Bootstrap + + -rhcos.Image->cluster.TerraformVariables - - + +rhcos.Image->cluster.TerraformVariables + + -machine.Master->machines.Master - - + +machine.Master->machines.Master + + -Target Ignition Configs - -Target Ignition Configs + +Target Ignition Configs + +Target Ignition Configs -machine.Master->Target Ignition Configs - - + +machine.Master->Target Ignition Configs + + -machine.Master->cluster.TerraformVariables - - + +machine.Master->cluster.TerraformVariables + + -tls.RootCA - -tls.RootCA + +tls.RootCA + +tls.RootCA -tls.RootCA->machine.Master - - + +tls.RootCA->machine.Master + + -tls.RootCA->machine.Worker - - + +tls.RootCA->machine.Worker + + -tls.RootCA->manifests.Manifests - - + +tls.RootCA->manifests.Manifests + + -tls.RootCA->tls.MCSCertKey - - + +tls.RootCA->tls.MCSCertKey + + + + + +tls.RootCA->bootstrap.Bootstrap + + -tls.JournalCertKey - -tls.JournalCertKey + +tls.JournalCertKey + +tls.JournalCertKey -tls.RootCA->tls.JournalCertKey - - - - -tls.RootCA->bootstrap.Bootstrap - - + +tls.RootCA->tls.JournalCertKey + + -machines.Worker->Target Manifests - - + +machines.Worker->Target Manifests + + -machines.Worker->bootstrap.Bootstrap - - + +machines.Worker->bootstrap.Bootstrap + + -machines.Worker->cluster.TerraformVariables - - + +machines.Worker->cluster.TerraformVariables + + -machine.Worker->machines.Worker - - + +machine.Worker->machines.Worker + + -machine.Worker->Target Ignition Configs - - + +machine.Worker->Target Ignition Configs + + -manifests.Manifests->Target Manifests - - + +manifests.Manifests->Target Manifests + + -manifests.Manifests->bootstrap.Bootstrap - - + +manifests.Manifests->bootstrap.Bootstrap + + -manifests.Ingress->manifests.Manifests - - + +manifests.Ingress->manifests.Manifests + + -manifests.DNS->manifests.Manifests - - + +manifests.DNS->manifests.Manifests + + -manifests.Infrastructure->manifests.Manifests - - + +manifests.Infrastructure->manifests.Manifests + + -manifests.CloudProviderConfig->manifests.Infrastructure - - + +manifests.CloudProviderConfig->manifests.Infrastructure + + -manifests.AdditionalTrustBundleConfig->manifests.Infrastructure - - + +manifests.AdditionalTrustBundleConfig->manifests.Infrastructure + + -manifests.Networking->manifests.Manifests - - + +manifests.Networking->manifests.Manifests + + -manifests.Networking->manifests.Proxy - - + +manifests.Networking->manifests.Proxy + + -openshift.NetworkCRDs - -openshift.NetworkCRDs + +openshift.NetworkCRDs + +openshift.NetworkCRDs -openshift.NetworkCRDs->manifests.Networking - - + +openshift.NetworkCRDs->manifests.Networking + + -manifests.Proxy->manifests.Manifests - - + +manifests.Proxy->manifests.Manifests + + -manifests.Proxy->bootstrap.Bootstrap - - + +manifests.Proxy->bootstrap.Bootstrap + + -manifests.Scheduler->manifests.Manifests - - + +manifests.Scheduler->manifests.Manifests + + -manifests.ImageContentSourcePolicy->manifests.Manifests - - + +manifests.ImageContentSourcePolicy->manifests.Manifests + + -tls.EtcdSignerCertKey - -tls.EtcdSignerCertKey + +tls.EtcdSignerCertKey + +tls.EtcdSignerCertKey -tls.EtcdSignerCertKey->manifests.Manifests - - + +tls.EtcdSignerCertKey->manifests.Manifests + + -tls.EtcdCABundle - -tls.EtcdCABundle + +tls.EtcdCABundle + +tls.EtcdCABundle -tls.EtcdSignerCertKey->tls.EtcdCABundle - - + +tls.EtcdSignerCertKey->tls.EtcdCABundle + + -tls.EtcdSignerClientCertKey - -tls.EtcdSignerClientCertKey + +tls.EtcdSignerClientCertKey + +tls.EtcdSignerClientCertKey -tls.EtcdSignerCertKey->tls.EtcdSignerClientCertKey - - + +tls.EtcdSignerCertKey->tls.EtcdSignerClientCertKey + + -tls.EtcdSignerCertKey->bootstrap.Bootstrap - - + +tls.EtcdSignerCertKey->bootstrap.Bootstrap + + -tls.EtcdCABundle->manifests.Manifests - - + +tls.EtcdCABundle->manifests.Manifests + + -tls.EtcdCABundle->bootstrap.Bootstrap - - + +tls.EtcdCABundle->bootstrap.Bootstrap + + -tls.EtcdSignerClientCertKey->manifests.Manifests - - + +tls.EtcdSignerClientCertKey->manifests.Manifests + + -tls.EtcdSignerClientCertKey->bootstrap.Bootstrap - - + +tls.EtcdSignerClientCertKey->bootstrap.Bootstrap + + -tls.EtcdMetricCABundle - -tls.EtcdMetricCABundle + +tls.EtcdMetricCABundle + +tls.EtcdMetricCABundle -tls.EtcdMetricCABundle->manifests.Manifests - - + +tls.EtcdMetricCABundle->manifests.Manifests + + -tls.EtcdMetricCABundle->bootstrap.Bootstrap - - + +tls.EtcdMetricCABundle->bootstrap.Bootstrap + + -tls.EtcdMetricSignerCertKey - -tls.EtcdMetricSignerCertKey - - -tls.EtcdMetricSignerCertKey->tls.EtcdMetricCABundle - - + +tls.EtcdMetricSignerCertKey + +tls.EtcdMetricSignerCertKey -tls.EtcdMetricSignerCertKey->manifests.Manifests - - + +tls.EtcdMetricSignerCertKey->manifests.Manifests + + + + + +tls.EtcdMetricSignerCertKey->tls.EtcdMetricCABundle + + -tls.EtcdMetricSignerClientCertKey - -tls.EtcdMetricSignerClientCertKey + +tls.EtcdMetricSignerClientCertKey + +tls.EtcdMetricSignerClientCertKey -tls.EtcdMetricSignerCertKey->tls.EtcdMetricSignerClientCertKey - - + +tls.EtcdMetricSignerCertKey->tls.EtcdMetricSignerClientCertKey + + -tls.EtcdMetricSignerCertKey->bootstrap.Bootstrap - - + +tls.EtcdMetricSignerCertKey->bootstrap.Bootstrap + + -tls.EtcdMetricSignerClientCertKey->manifests.Manifests - - + +tls.EtcdMetricSignerClientCertKey->manifests.Manifests + + -tls.EtcdMetricSignerClientCertKey->bootstrap.Bootstrap - - + +tls.EtcdMetricSignerClientCertKey->bootstrap.Bootstrap + + -tls.MCSCertKey->manifests.Manifests - - + +tls.MCSCertKey->manifests.Manifests + + -tls.MCSCertKey->bootstrap.Bootstrap - - + +tls.MCSCertKey->bootstrap.Bootstrap + + -bootkube.CVOOverrides - -bootkube.CVOOverrides + +bootkube.CVOOverrides + +bootkube.CVOOverrides -bootkube.CVOOverrides->manifests.Manifests - - + +bootkube.CVOOverrides->manifests.Manifests + + -bootkube.EtcdCAConfigMap - -bootkube.EtcdCAConfigMap + +bootkube.EtcdCAConfigMap + +bootkube.EtcdCAConfigMap -bootkube.EtcdCAConfigMap->manifests.Manifests - - + +bootkube.EtcdCAConfigMap->manifests.Manifests + + -bootkube.EtcdClientSecret - -bootkube.EtcdClientSecret + +bootkube.EtcdClientSecret + +bootkube.EtcdClientSecret -bootkube.EtcdClientSecret->manifests.Manifests - - + +bootkube.EtcdClientSecret->manifests.Manifests + + -bootkube.EtcdHostServiceEndpoints - -bootkube.EtcdHostServiceEndpoints + +bootkube.EtcdHostServiceEndpoints + +bootkube.EtcdHostServiceEndpoints -bootkube.EtcdHostServiceEndpoints->manifests.Manifests - - + +bootkube.EtcdHostServiceEndpoints->manifests.Manifests + + -bootkube.EtcdHostService - -bootkube.EtcdHostService + +bootkube.EtcdHostService + +bootkube.EtcdHostService -bootkube.EtcdHostService->manifests.Manifests - - + +bootkube.EtcdHostService->manifests.Manifests + + -bootkube.EtcdMetricClientSecret - -bootkube.EtcdMetricClientSecret + +bootkube.EtcdMetricClientSecret + +bootkube.EtcdMetricClientSecret -bootkube.EtcdMetricClientSecret->manifests.Manifests - - + +bootkube.EtcdMetricClientSecret->manifests.Manifests + + -bootkube.EtcdMetricServingCAConfigMap - -bootkube.EtcdMetricServingCAConfigMap + +bootkube.EtcdMetricServingCAConfigMap + +bootkube.EtcdMetricServingCAConfigMap -bootkube.EtcdMetricServingCAConfigMap->manifests.Manifests - - + +bootkube.EtcdMetricServingCAConfigMap->manifests.Manifests + + -bootkube.EtcdMetricSignerSecret - -bootkube.EtcdMetricSignerSecret + +bootkube.EtcdMetricSignerSecret + +bootkube.EtcdMetricSignerSecret -bootkube.EtcdMetricSignerSecret->manifests.Manifests - - + +bootkube.EtcdMetricSignerSecret->manifests.Manifests + + -bootkube.EtcdNamespace - -bootkube.EtcdNamespace + +bootkube.EtcdNamespace + +bootkube.EtcdNamespace -bootkube.EtcdNamespace->manifests.Manifests - - + +bootkube.EtcdNamespace->manifests.Manifests + + -bootkube.EtcdService - -bootkube.EtcdService + +bootkube.EtcdService + +bootkube.EtcdService -bootkube.EtcdService->manifests.Manifests - - + +bootkube.EtcdService->manifests.Manifests + + -bootkube.EtcdSignerSecret - -bootkube.EtcdSignerSecret + +bootkube.EtcdSignerSecret + +bootkube.EtcdSignerSecret -bootkube.EtcdSignerSecret->manifests.Manifests - - + +bootkube.EtcdSignerSecret->manifests.Manifests + + -bootkube.KubeCloudConfig - -bootkube.KubeCloudConfig + +bootkube.KubeCloudConfig + +bootkube.KubeCloudConfig -bootkube.KubeCloudConfig->manifests.Manifests - - + +bootkube.KubeCloudConfig->manifests.Manifests + + -bootkube.EtcdServingCAConfigMap - -bootkube.EtcdServingCAConfigMap + +bootkube.EtcdServingCAConfigMap + +bootkube.EtcdServingCAConfigMap -bootkube.EtcdServingCAConfigMap->manifests.Manifests - - + +bootkube.EtcdServingCAConfigMap->manifests.Manifests + + -bootkube.KubeSystemConfigmapRootCA - -bootkube.KubeSystemConfigmapRootCA + +bootkube.KubeSystemConfigmapRootCA + +bootkube.KubeSystemConfigmapRootCA -bootkube.KubeSystemConfigmapRootCA->manifests.Manifests - - + +bootkube.KubeSystemConfigmapRootCA->manifests.Manifests + + -bootkube.MachineConfigServerTLSSecret - -bootkube.MachineConfigServerTLSSecret + +bootkube.MachineConfigServerTLSSecret + +bootkube.MachineConfigServerTLSSecret -bootkube.MachineConfigServerTLSSecret->manifests.Manifests - - + +bootkube.MachineConfigServerTLSSecret->manifests.Manifests + + -bootkube.OpenshiftConfigSecretPullSecret - -bootkube.OpenshiftConfigSecretPullSecret + +bootkube.OpenshiftConfigSecretPullSecret + +bootkube.OpenshiftConfigSecretPullSecret -bootkube.OpenshiftConfigSecretPullSecret->manifests.Manifests - - + +bootkube.OpenshiftConfigSecretPullSecret->manifests.Manifests + + -bootkube.OpenshiftMachineConfigOperator - -bootkube.OpenshiftMachineConfigOperator + +bootkube.OpenshiftMachineConfigOperator + +bootkube.OpenshiftMachineConfigOperator -bootkube.OpenshiftMachineConfigOperator->manifests.Manifests - - + +bootkube.OpenshiftMachineConfigOperator->manifests.Manifests + + -manifests.Openshift->Target Manifests - - + +manifests.Openshift->Target Manifests + + -manifests.Openshift->bootstrap.Bootstrap - - + +manifests.Openshift->bootstrap.Bootstrap + + -password.KubeadminPassword - -password.KubeadminPassword + +password.KubeadminPassword + +password.KubeadminPassword -password.KubeadminPassword->manifests.Openshift - - + +password.KubeadminPassword->manifests.Openshift + + -password.KubeadminPassword->Target Ignition Configs - - + +password.KubeadminPassword->Target Ignition Configs + + -Target Cluster - -Target Cluster + +Target Cluster + +Target Cluster -password.KubeadminPassword->Target Cluster - - + +password.KubeadminPassword->Target Cluster + + -password.KubeadminPassword->cluster.Cluster - - + +password.KubeadminPassword->cluster.Cluster + + -openshiftinstall.Config - -openshiftinstall.Config + +openshiftinstall.Config + +openshiftinstall.Config -openshiftinstall.Config->manifests.Openshift - - + +openshiftinstall.Config->manifests.Openshift + + -openshift.CloudCredsSecret - -openshift.CloudCredsSecret + +openshift.CloudCredsSecret + +openshift.CloudCredsSecret -openshift.CloudCredsSecret->manifests.Openshift - - + +openshift.CloudCredsSecret->manifests.Openshift + + -openshift.KubeadminPasswordSecret - -openshift.KubeadminPasswordSecret + +openshift.KubeadminPasswordSecret + +openshift.KubeadminPasswordSecret -openshift.KubeadminPasswordSecret->manifests.Openshift - - + +openshift.KubeadminPasswordSecret->manifests.Openshift + + -openshift.RoleCloudCredsSecretReader - -openshift.RoleCloudCredsSecretReader + +openshift.RoleCloudCredsSecretReader + +openshift.RoleCloudCredsSecretReader -openshift.RoleCloudCredsSecretReader->manifests.Openshift - - + +openshift.RoleCloudCredsSecretReader->manifests.Openshift + + -openshift.PrivateClusterOutbound - -openshift.PrivateClusterOutbound + +openshift.PrivateClusterOutbound + +openshift.PrivateClusterOutbound -openshift.PrivateClusterOutbound->manifests.Openshift - - + +openshift.PrivateClusterOutbound->manifests.Openshift + + -openshift.BaremetalConfig - -openshift.BaremetalConfig + +openshift.BaremetalConfig + +openshift.BaremetalConfig -openshift.BaremetalConfig->manifests.Openshift - - + +openshift.BaremetalConfig->manifests.Openshift + + -kubeconfig.AdminClient->Target Ignition Configs - - + +kubeconfig.AdminClient->Target Ignition Configs + + -kubeconfig.AdminClient->Target Cluster - - + +kubeconfig.AdminClient->Target Cluster + + -tls.AdminKubeConfigClientCertKey - -tls.AdminKubeConfigClientCertKey + +tls.AdminKubeConfigClientCertKey + +tls.AdminKubeConfigClientCertKey -tls.AdminKubeConfigClientCertKey->kubeconfig.AdminClient - - + +tls.AdminKubeConfigClientCertKey->kubeconfig.AdminClient + + -tls.AdminKubeConfigClientCertKey->kubeconfig.AdminInternalClient - - + +tls.AdminKubeConfigClientCertKey->kubeconfig.AdminInternalClient + + -tls.AdminKubeConfigClientCertKey->kubeconfig.LoopbackClient - - + +tls.AdminKubeConfigClientCertKey->kubeconfig.LoopbackClient + + -tls.AdminKubeConfigSignerCertKey - -tls.AdminKubeConfigSignerCertKey + +tls.AdminKubeConfigSignerCertKey + +tls.AdminKubeConfigSignerCertKey -tls.AdminKubeConfigSignerCertKey->tls.AdminKubeConfigClientCertKey - - + +tls.AdminKubeConfigSignerCertKey->tls.AdminKubeConfigClientCertKey + + -tls.AdminKubeConfigCABundle - -tls.AdminKubeConfigCABundle + +tls.AdminKubeConfigCABundle + +tls.AdminKubeConfigCABundle -tls.AdminKubeConfigSignerCertKey->tls.AdminKubeConfigCABundle - - + +tls.AdminKubeConfigSignerCertKey->tls.AdminKubeConfigCABundle + + -tls.KubeAPIServerCompleteCABundle - -tls.KubeAPIServerCompleteCABundle + +tls.KubeAPIServerCompleteCABundle + +tls.KubeAPIServerCompleteCABundle -tls.KubeAPIServerCompleteCABundle->kubeconfig.AdminClient - - + +tls.KubeAPIServerCompleteCABundle->kubeconfig.AdminClient + + + + + +tls.KubeAPIServerCompleteCABundle->bootstrap.Bootstrap + + -tls.KubeAPIServerCompleteCABundle->kubeconfig.AdminInternalClient - - + +tls.KubeAPIServerCompleteCABundle->kubeconfig.AdminInternalClient + + -tls.KubeAPIServerCompleteCABundle->kubeconfig.Kubelet - - - - -tls.KubeAPIServerCompleteCABundle->bootstrap.Bootstrap - - + +tls.KubeAPIServerCompleteCABundle->kubeconfig.Kubelet + + -tls.KubeAPIServerLocalhostCABundle - -tls.KubeAPIServerLocalhostCABundle + +tls.KubeAPIServerLocalhostCABundle + +tls.KubeAPIServerLocalhostCABundle -tls.KubeAPIServerLocalhostCABundle->tls.KubeAPIServerCompleteCABundle - - - - -tls.KubeAPIServerLocalhostCABundle->kubeconfig.LoopbackClient - - + +tls.KubeAPIServerLocalhostCABundle->tls.KubeAPIServerCompleteCABundle + + -tls.KubeAPIServerLocalhostCABundle->bootstrap.Bootstrap - - + +tls.KubeAPIServerLocalhostCABundle->bootstrap.Bootstrap + + + + + +tls.KubeAPIServerLocalhostCABundle->kubeconfig.LoopbackClient + + -tls.KubeAPIServerLocalhostSignerCertKey - -tls.KubeAPIServerLocalhostSignerCertKey + +tls.KubeAPIServerLocalhostSignerCertKey + +tls.KubeAPIServerLocalhostSignerCertKey -tls.KubeAPIServerLocalhostSignerCertKey->tls.KubeAPIServerLocalhostCABundle - - + +tls.KubeAPIServerLocalhostSignerCertKey->tls.KubeAPIServerLocalhostCABundle + + + + + +tls.KubeAPIServerLocalhostSignerCertKey->bootstrap.Bootstrap + + -tls.KubeAPIServerLocalhostServerCertKey - -tls.KubeAPIServerLocalhostServerCertKey + +tls.KubeAPIServerLocalhostServerCertKey + +tls.KubeAPIServerLocalhostServerCertKey -tls.KubeAPIServerLocalhostSignerCertKey->tls.KubeAPIServerLocalhostServerCertKey - - - - -tls.KubeAPIServerLocalhostSignerCertKey->bootstrap.Bootstrap - - + +tls.KubeAPIServerLocalhostSignerCertKey->tls.KubeAPIServerLocalhostServerCertKey + + -tls.KubeControlPlaneCABundle - -tls.KubeControlPlaneCABundle + +tls.KubeControlPlaneCABundle + +tls.KubeControlPlaneCABundle -tls.KubeAPIServerLocalhostSignerCertKey->tls.KubeControlPlaneCABundle - - + +tls.KubeAPIServerLocalhostSignerCertKey->tls.KubeControlPlaneCABundle + + -tls.KubeAPIServerServiceNetworkCABundle - -tls.KubeAPIServerServiceNetworkCABundle + +tls.KubeAPIServerServiceNetworkCABundle + +tls.KubeAPIServerServiceNetworkCABundle -tls.KubeAPIServerServiceNetworkCABundle->tls.KubeAPIServerCompleteCABundle - - + +tls.KubeAPIServerServiceNetworkCABundle->tls.KubeAPIServerCompleteCABundle + + -tls.KubeAPIServerServiceNetworkCABundle->bootstrap.Bootstrap - - + +tls.KubeAPIServerServiceNetworkCABundle->bootstrap.Bootstrap + + -tls.KubeAPIServerServiceNetworkSignerCertKey - -tls.KubeAPIServerServiceNetworkSignerCertKey + +tls.KubeAPIServerServiceNetworkSignerCertKey + +tls.KubeAPIServerServiceNetworkSignerCertKey -tls.KubeAPIServerServiceNetworkSignerCertKey->tls.KubeAPIServerServiceNetworkCABundle - - - - -tls.KubeAPIServerServiceNetworkSignerCertKey->tls.KubeAPIServerServiceNetworkServerCertKey - - + +tls.KubeAPIServerServiceNetworkSignerCertKey->tls.KubeAPIServerServiceNetworkCABundle + + -tls.KubeAPIServerServiceNetworkSignerCertKey->bootstrap.Bootstrap - - + +tls.KubeAPIServerServiceNetworkSignerCertKey->bootstrap.Bootstrap + + + + + +tls.KubeAPIServerServiceNetworkSignerCertKey->tls.KubeAPIServerServiceNetworkServerCertKey + + -tls.KubeAPIServerServiceNetworkSignerCertKey->tls.KubeControlPlaneCABundle - - + +tls.KubeAPIServerServiceNetworkSignerCertKey->tls.KubeControlPlaneCABundle + + -tls.KubeAPIServerLBCABundle - -tls.KubeAPIServerLBCABundle + +tls.KubeAPIServerLBCABundle + +tls.KubeAPIServerLBCABundle -tls.KubeAPIServerLBCABundle->tls.KubeAPIServerCompleteCABundle - - + +tls.KubeAPIServerLBCABundle->tls.KubeAPIServerCompleteCABundle + + -tls.KubeAPIServerLBCABundle->bootstrap.Bootstrap - - + +tls.KubeAPIServerLBCABundle->bootstrap.Bootstrap + + -tls.KubeAPIServerLBSignerCertKey - -tls.KubeAPIServerLBSignerCertKey + +tls.KubeAPIServerLBSignerCertKey + +tls.KubeAPIServerLBSignerCertKey -tls.KubeAPIServerLBSignerCertKey->tls.KubeAPIServerLBCABundle - - + +tls.KubeAPIServerLBSignerCertKey->tls.KubeAPIServerLBCABundle + + + + + +tls.KubeAPIServerLBSignerCertKey->bootstrap.Bootstrap + + -tls.KubeAPIServerLBSignerCertKey->tls.KubeAPIServerExternalLBServerCertKey - - + +tls.KubeAPIServerLBSignerCertKey->tls.KubeAPIServerExternalLBServerCertKey + + -tls.KubeAPIServerLBSignerCertKey->tls.KubeAPIServerInternalLBServerCertKey - - - - -tls.KubeAPIServerLBSignerCertKey->bootstrap.Bootstrap - - + +tls.KubeAPIServerLBSignerCertKey->tls.KubeAPIServerInternalLBServerCertKey + + -tls.KubeAPIServerLBSignerCertKey->tls.KubeControlPlaneCABundle - - + +tls.KubeAPIServerLBSignerCertKey->tls.KubeControlPlaneCABundle + + -bootstrap.Bootstrap->Target Ignition Configs - - + +bootstrap.Bootstrap->Target Ignition Configs + + -bootstrap.Bootstrap->cluster.TerraformVariables - - + +bootstrap.Bootstrap->cluster.TerraformVariables + + -kubeconfig.AdminInternalClient->bootstrap.Bootstrap - - + +kubeconfig.AdminInternalClient->bootstrap.Bootstrap + + -kubeconfig.Kubelet->bootstrap.Bootstrap - - + +kubeconfig.Kubelet->bootstrap.Bootstrap + + -tls.KubeletClientCertKey - -tls.KubeletClientCertKey - - -tls.KubeletClientCertKey->kubeconfig.Kubelet - - + +tls.KubeletClientCertKey + +tls.KubeletClientCertKey -tls.KubeletClientCertKey->bootstrap.Bootstrap - - + +tls.KubeletClientCertKey->bootstrap.Bootstrap + + + + + +tls.KubeletClientCertKey->kubeconfig.Kubelet + + -tls.KubeletBootstrapCertSigner - -tls.KubeletBootstrapCertSigner + +tls.KubeletBootstrapCertSigner + +tls.KubeletBootstrapCertSigner -tls.KubeletBootstrapCertSigner->tls.KubeletClientCertKey - - + +tls.KubeletBootstrapCertSigner->tls.KubeletClientCertKey + + -tls.KubeletBootstrapCABundle - -tls.KubeletBootstrapCABundle + +tls.KubeletBootstrapCABundle + +tls.KubeletBootstrapCABundle -tls.KubeletBootstrapCertSigner->tls.KubeletBootstrapCABundle - - + +tls.KubeletBootstrapCertSigner->tls.KubeletBootstrapCABundle + + -kubeconfig.LoopbackClient->bootstrap.Bootstrap - - + +kubeconfig.LoopbackClient->bootstrap.Bootstrap + + -tls.AdminKubeConfigCABundle->bootstrap.Bootstrap - - + +tls.AdminKubeConfigCABundle->bootstrap.Bootstrap + + -tls.KubeAPIServerCompleteClientCABundle - -tls.KubeAPIServerCompleteClientCABundle + +tls.KubeAPIServerCompleteClientCABundle + +tls.KubeAPIServerCompleteClientCABundle -tls.AdminKubeConfigCABundle->tls.KubeAPIServerCompleteClientCABundle - - + +tls.AdminKubeConfigCABundle->tls.KubeAPIServerCompleteClientCABundle + + -tls.AggregatorCA - -tls.AggregatorCA + +tls.AggregatorCA + +tls.AggregatorCA -tls.AggregatorCA->bootstrap.Bootstrap - - + +tls.AggregatorCA->bootstrap.Bootstrap + + -tls.APIServerProxyCertKey - -tls.APIServerProxyCertKey + +tls.APIServerProxyCertKey + +tls.APIServerProxyCertKey -tls.AggregatorCA->tls.APIServerProxyCertKey - - + +tls.AggregatorCA->tls.APIServerProxyCertKey + + -tls.AggregatorCABundle - -tls.AggregatorCABundle + +tls.AggregatorCABundle + +tls.AggregatorCABundle -tls.AggregatorCABundle->bootstrap.Bootstrap - - + +tls.AggregatorCABundle->bootstrap.Bootstrap + + -tls.AggregatorSignerCertKey - -tls.AggregatorSignerCertKey + +tls.AggregatorSignerCertKey + +tls.AggregatorSignerCertKey + + + +tls.AggregatorSignerCertKey->bootstrap.Bootstrap + + -tls.AggregatorSignerCertKey->tls.AggregatorCABundle - - + +tls.AggregatorSignerCertKey->tls.AggregatorCABundle + + -tls.AggregatorClientCertKey - -tls.AggregatorClientCertKey + +tls.AggregatorClientCertKey + +tls.AggregatorClientCertKey -tls.AggregatorSignerCertKey->tls.AggregatorClientCertKey - - - - -tls.AggregatorSignerCertKey->bootstrap.Bootstrap - - + +tls.AggregatorSignerCertKey->tls.AggregatorClientCertKey + + -tls.AggregatorClientCertKey->bootstrap.Bootstrap - - + +tls.AggregatorClientCertKey->bootstrap.Bootstrap + + -tls.APIServerProxyCertKey->bootstrap.Bootstrap - - + +tls.APIServerProxyCertKey->bootstrap.Bootstrap + + -tls.JournalCertKey->bootstrap.Bootstrap - - + +tls.JournalCertKey->bootstrap.Bootstrap + + -tls.JournalCertKey->Target Cluster - - + +tls.JournalCertKey->Target Cluster + + -tls.KubeAPIServerExternalLBServerCertKey->bootstrap.Bootstrap - - + +tls.KubeAPIServerExternalLBServerCertKey->bootstrap.Bootstrap + + -tls.KubeAPIServerInternalLBServerCertKey->bootstrap.Bootstrap - - + +tls.KubeAPIServerInternalLBServerCertKey->bootstrap.Bootstrap + + -tls.KubeAPIServerLocalhostServerCertKey->bootstrap.Bootstrap - - + +tls.KubeAPIServerLocalhostServerCertKey->bootstrap.Bootstrap + + -tls.KubeAPIServerServiceNetworkServerCertKey->bootstrap.Bootstrap - - + +tls.KubeAPIServerServiceNetworkServerCertKey->bootstrap.Bootstrap + + -tls.KubeAPIServerCompleteClientCABundle->bootstrap.Bootstrap - - + +tls.KubeAPIServerCompleteClientCABundle->bootstrap.Bootstrap + + -tls.KubeletClientCABundle - -tls.KubeletClientCABundle - - -tls.KubeletClientCABundle->tls.KubeAPIServerCompleteClientCABundle - - + +tls.KubeletClientCABundle + +tls.KubeletClientCABundle -tls.KubeletClientCABundle->bootstrap.Bootstrap - - + +tls.KubeletClientCABundle->bootstrap.Bootstrap + + - -tls.KubeletCSRSignerCertKey - -tls.KubeletCSRSignerCertKey + + +tls.KubeletClientCABundle->tls.KubeAPIServerCompleteClientCABundle + + - -tls.KubeletCSRSignerCertKey->tls.KubeletClientCABundle - - + + +tls.KubeletCSRSignerCertKey + +tls.KubeletCSRSignerCertKey -tls.KubeletCSRSignerCertKey->bootstrap.Bootstrap - - + +tls.KubeletCSRSignerCertKey->bootstrap.Bootstrap + + + + + +tls.KubeletCSRSignerCertKey->tls.KubeletClientCABundle + + -tls.KubeletServingCABundle - -tls.KubeletServingCABundle + +tls.KubeletServingCABundle + +tls.KubeletServingCABundle -tls.KubeletCSRSignerCertKey->tls.KubeletServingCABundle - - - - -tls.KubeControlPlaneCABundle->tls.KubeAPIServerCompleteClientCABundle - - + +tls.KubeletCSRSignerCertKey->tls.KubeletServingCABundle + + -tls.KubeControlPlaneCABundle->bootstrap.Bootstrap - - + +tls.KubeControlPlaneCABundle->bootstrap.Bootstrap + + + + + +tls.KubeControlPlaneCABundle->tls.KubeAPIServerCompleteClientCABundle + + -tls.KubeControlPlaneSignerCertKey - -tls.KubeControlPlaneSignerCertKey + +tls.KubeControlPlaneSignerCertKey + +tls.KubeControlPlaneSignerCertKey + + + +tls.KubeControlPlaneSignerCertKey->bootstrap.Bootstrap + + -tls.KubeControlPlaneSignerCertKey->tls.KubeControlPlaneCABundle - - + +tls.KubeControlPlaneSignerCertKey->tls.KubeControlPlaneCABundle + + -tls.KubeControlPlaneKubeControllerManagerClientCertKey - -tls.KubeControlPlaneKubeControllerManagerClientCertKey + +tls.KubeControlPlaneKubeControllerManagerClientCertKey + +tls.KubeControlPlaneKubeControllerManagerClientCertKey -tls.KubeControlPlaneSignerCertKey->tls.KubeControlPlaneKubeControllerManagerClientCertKey - - + +tls.KubeControlPlaneSignerCertKey->tls.KubeControlPlaneKubeControllerManagerClientCertKey + + -tls.KubeControlPlaneKubeSchedulerClientCertKey - -tls.KubeControlPlaneKubeSchedulerClientCertKey + +tls.KubeControlPlaneKubeSchedulerClientCertKey + +tls.KubeControlPlaneKubeSchedulerClientCertKey -tls.KubeControlPlaneSignerCertKey->tls.KubeControlPlaneKubeSchedulerClientCertKey - - - - -tls.KubeControlPlaneSignerCertKey->bootstrap.Bootstrap - - + +tls.KubeControlPlaneSignerCertKey->tls.KubeControlPlaneKubeSchedulerClientCertKey + + -tls.KubeAPIServerToKubeletCABundle - -tls.KubeAPIServerToKubeletCABundle - - -tls.KubeAPIServerToKubeletCABundle->tls.KubeAPIServerCompleteClientCABundle - - + +tls.KubeAPIServerToKubeletCABundle + +tls.KubeAPIServerToKubeletCABundle -tls.KubeAPIServerToKubeletCABundle->bootstrap.Bootstrap - - + +tls.KubeAPIServerToKubeletCABundle->bootstrap.Bootstrap + + + + + +tls.KubeAPIServerToKubeletCABundle->tls.KubeAPIServerCompleteClientCABundle + + -tls.KubeAPIServerToKubeletSignerCertKey - -tls.KubeAPIServerToKubeletSignerCertKey + +tls.KubeAPIServerToKubeletSignerCertKey + +tls.KubeAPIServerToKubeletSignerCertKey + + + +tls.KubeAPIServerToKubeletSignerCertKey->bootstrap.Bootstrap + + -tls.KubeAPIServerToKubeletSignerCertKey->tls.KubeAPIServerToKubeletCABundle - - + +tls.KubeAPIServerToKubeletSignerCertKey->tls.KubeAPIServerToKubeletCABundle + + -tls.KubeAPIServerToKubeletClientCertKey - -tls.KubeAPIServerToKubeletClientCertKey + +tls.KubeAPIServerToKubeletClientCertKey + +tls.KubeAPIServerToKubeletClientCertKey -tls.KubeAPIServerToKubeletSignerCertKey->tls.KubeAPIServerToKubeletClientCertKey - - + +tls.KubeAPIServerToKubeletSignerCertKey->tls.KubeAPIServerToKubeletClientCertKey + + - -tls.KubeAPIServerToKubeletSignerCertKey->bootstrap.Bootstrap - - + + +tls.KubeletBootstrapCABundle->bootstrap.Bootstrap + + -tls.KubeletBootstrapCABundle->tls.KubeAPIServerCompleteClientCABundle - - - - -tls.KubeletBootstrapCABundle->bootstrap.Bootstrap - - + +tls.KubeletBootstrapCABundle->tls.KubeAPIServerCompleteClientCABundle + + -tls.KubeAPIServerToKubeletClientCertKey->bootstrap.Bootstrap - - + +tls.KubeAPIServerToKubeletClientCertKey->bootstrap.Bootstrap + + -tls.KubeControlPlaneKubeControllerManagerClientCertKey->bootstrap.Bootstrap - - + +tls.KubeControlPlaneKubeControllerManagerClientCertKey->bootstrap.Bootstrap + + -tls.KubeControlPlaneKubeSchedulerClientCertKey->bootstrap.Bootstrap - - + +tls.KubeControlPlaneKubeSchedulerClientCertKey->bootstrap.Bootstrap + + -tls.KubeletServingCABundle->bootstrap.Bootstrap - - + +tls.KubeletServingCABundle->bootstrap.Bootstrap + + -tls.ServiceAccountKeyPair - -tls.ServiceAccountKeyPair + +tls.ServiceAccountKeyPair + +tls.ServiceAccountKeyPair -tls.ServiceAccountKeyPair->bootstrap.Bootstrap - - + +tls.ServiceAccountKeyPair->bootstrap.Bootstrap + + -releaseimage.Image - -releaseimage.Image + +releaseimage.Image + +releaseimage.Image -releaseimage.Image->bootstrap.Bootstrap - - + +releaseimage.Image->bootstrap.Bootstrap + + -cluster.Metadata->Target Ignition Configs - - + +cluster.Metadata->Target Ignition Configs + + -cluster.Metadata->Target Cluster - - + +cluster.Metadata->Target Cluster + + -cluster.TerraformVariables->Target Cluster - - + +cluster.TerraformVariables->Target Cluster + + -cluster.TerraformVariables->cluster.Cluster - - + +cluster.TerraformVariables->cluster.Cluster + + + + + +installconfig.PlatformProvisionCheck->cluster.TerraformVariables + + + + + +installconfig.PlatformProvisionCheck->cluster.Cluster + + -rhcos.BootstrapImage->cluster.TerraformVariables - - + +rhcos.BootstrapImage->cluster.TerraformVariables + + -cluster.Cluster->Target Cluster - - + +cluster.Cluster->Target Cluster + + + + + +installconfig.PlatformPermsCheck->cluster.Cluster + + diff --git a/pkg/asset/cluster/cluster.go b/pkg/asset/cluster/cluster.go index d3e04580f0d..4448350f7ed 100644 --- a/pkg/asset/cluster/cluster.go +++ b/pkg/asset/cluster/cluster.go @@ -36,12 +36,13 @@ func (c *Cluster) Dependencies() []asset.Asset { return []asset.Asset{ &installconfig.ClusterID{}, &installconfig.InstallConfig{}, - // PlatformCredsCheck checks the creds (and asks, if needed). - // PlatformPermsCheck checks for required account permissions. + // PlatformCredsCheck, PlatformPermsCheck and PlatformProvisionCheck + // perform validations & check perms required to provision infrastructure. // We do not actually use them in this asset directly, hence - // they are put in the dependencies but not fetched in Generate + // they are put in the dependencies but not fetched in Generate. &installconfig.PlatformCredsCheck{}, &installconfig.PlatformPermsCheck{}, + &installconfig.PlatformProvisionCheck{}, &TerraformVariables{}, &password.KubeadminPassword{}, } diff --git a/pkg/asset/installconfig/installconfig.go b/pkg/asset/installconfig/installconfig.go index 75875e2aa14..b3049e005e3 100644 --- a/pkg/asset/installconfig/installconfig.go +++ b/pkg/asset/installconfig/installconfig.go @@ -14,6 +14,7 @@ import ( icazure "github.com/openshift/installer/pkg/asset/installconfig/azure" icgcp "github.com/openshift/installer/pkg/asset/installconfig/gcp" icopenstack "github.com/openshift/installer/pkg/asset/installconfig/openstack" + icvsphere "github.com/openshift/installer/pkg/asset/installconfig/vsphere" "github.com/openshift/installer/pkg/types" "github.com/openshift/installer/pkg/types/conversion" "github.com/openshift/installer/pkg/types/defaults" @@ -173,5 +174,8 @@ func (a *InstallConfig) platformValidation() error { if a.Config.Platform.AWS != nil { return aws.Validate(context.TODO(), a.AWS, a.Config) } + if a.Config.Platform.VSphere != nil { + return icvsphere.Validate(a.Config) + } return field.ErrorList{}.ToAggregate() } diff --git a/pkg/asset/installconfig/platformprovisioncheck.go b/pkg/asset/installconfig/platformprovisioncheck.go new file mode 100644 index 00000000000..f8fd95040fd --- /dev/null +++ b/pkg/asset/installconfig/platformprovisioncheck.go @@ -0,0 +1,57 @@ +package installconfig + +import ( + "fmt" + + "github.com/openshift/installer/pkg/asset" + vsconfig "github.com/openshift/installer/pkg/asset/installconfig/vsphere" + "github.com/openshift/installer/pkg/types/aws" + "github.com/openshift/installer/pkg/types/azure" + "github.com/openshift/installer/pkg/types/baremetal" + "github.com/openshift/installer/pkg/types/gcp" + "github.com/openshift/installer/pkg/types/libvirt" + "github.com/openshift/installer/pkg/types/none" + "github.com/openshift/installer/pkg/types/openstack" + "github.com/openshift/installer/pkg/types/ovirt" + "github.com/openshift/installer/pkg/types/vsphere" +) + +// PlatformProvisionCheck is an asset that validates the install-config platform for +// any requirements specific for provisioning infrastructure. +type PlatformProvisionCheck struct { +} + +var _ asset.Asset = (*PlatformProvisionCheck)(nil) + +// Dependencies returns the dependencies for PlatformProvisionCheck +func (a *PlatformProvisionCheck) Dependencies() []asset.Asset { + return []asset.Asset{ + &InstallConfig{}, + } +} + +// Generate queries for input from the user. +func (a *PlatformProvisionCheck) Generate(dependencies asset.Parents) error { + ic := &InstallConfig{} + dependencies.Get(ic) + + var err error + platform := ic.Config.Platform.Name() + switch platform { + case vsphere.Name: + err = vsconfig.ValidateForProvisioning(ic.Config) + if err != nil { + return err + } + case azure.Name, aws.Name, baremetal.Name, gcp.Name, libvirt.Name, none.Name, openstack.Name, ovirt.Name: + // no special provisioning requirements to check + default: + err = fmt.Errorf("unknown platform type %q", platform) + } + return err +} + +// Name returns the human-friendly name of the asset. +func (a *PlatformProvisionCheck) Name() string { + return "Platform Provisioning Check" +} diff --git a/pkg/asset/installconfig/vsphere/validation.go b/pkg/asset/installconfig/vsphere/validation.go new file mode 100644 index 00000000000..ecf24f2463a --- /dev/null +++ b/pkg/asset/installconfig/vsphere/validation.go @@ -0,0 +1,35 @@ +package vsphere + +import ( + "github.com/pkg/errors" + "k8s.io/apimachinery/pkg/util/validation/field" + + "github.com/openshift/installer/pkg/types" + "github.com/openshift/installer/pkg/types/vsphere/validation" +) + +// Validate executes platform-specific validation. +func Validate(ic *types.InstallConfig) error { + allErrs := field.ErrorList{} + if ic.Platform.VSphere == nil { + return errors.New(field.Required(field.NewPath("platform", "vsphere"), "vSphere validation requires a vSphere platform configuration").Error()) + } + + allErrs = append(allErrs, validation.ValidatePlatform(ic.Platform.VSphere, field.NewPath("platform").Child("vsphere"))...) + + return allErrs.ToAggregate() +} + +// ValidateForProvisioning performs platform validation specifically for installer- +// provisioned infrastructure. In this case, self-hosted networking is a requirement +// when the installer creates infrastructure for vSphere clusters. +func ValidateForProvisioning(ic *types.InstallConfig) error { + allErrs := field.ErrorList{} + if ic.Platform.VSphere == nil { + return errors.New(field.Required(field.NewPath("platform", "vsphere"), "vSphere validation requires a vSphere platform configuration").Error()) + } + + allErrs = append(allErrs, validation.ValidateForProvisioning(ic.Platform.VSphere, field.NewPath("platform").Child("vsphere"))...) + + return allErrs.ToAggregate() +} diff --git a/pkg/asset/installconfig/vsphere/validation_test.go b/pkg/asset/installconfig/vsphere/validation_test.go new file mode 100644 index 00000000000..e6cd958f80c --- /dev/null +++ b/pkg/asset/installconfig/vsphere/validation_test.go @@ -0,0 +1,106 @@ +package vsphere + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/openshift/installer/pkg/ipnet" + "github.com/openshift/installer/pkg/types" + "github.com/openshift/installer/pkg/types/vsphere" +) + +var ( + validCIDR = "10.0.0.0/16" +) + +func validIPIInstallConfig() *types.InstallConfig { + return &types.InstallConfig{ + Networking: &types.Networking{ + MachineNetwork: []types.MachineNetworkEntry{ + {CIDR: *ipnet.MustParseCIDR(validCIDR)}, + }, + }, + Publish: types.ExternalPublishingStrategy, + Platform: types.Platform{ + VSphere: &vsphere.Platform{ + Cluster: "valid_cluster", + Datacenter: "valid_dc", + DefaultDatastore: "valid_ds", + Network: "valid_network", + Password: "valid_password", + Username: "valid_username", + VCenter: "valid_vcenter", + APIVIP: "192.168.111.0", + IngressVIP: "192.168.111.1", + DNSVIP: "192.168.111.2", + }, + }, + } +} + +func validUPIInstallConfig() *types.InstallConfig { + return &types.InstallConfig{ + Networking: &types.Networking{ + MachineNetwork: []types.MachineNetworkEntry{ + {CIDR: *ipnet.MustParseCIDR(validCIDR)}, + }, + }, + Publish: types.ExternalPublishingStrategy, + Platform: types.Platform{ + VSphere: &vsphere.Platform{ + Datacenter: "valid_dc", + DefaultDatastore: "valid_ds", + Password: "valid_password", + Username: "valid_username", + VCenter: "valid_vcenter", + }, + }, + } +} + +func TestValidate(t *testing.T) { + tests := []struct { + name string + installConfig *types.InstallConfig + validationMethod func(*types.InstallConfig) error + expectErr string + }{{ + name: "valid UPI install config", + installConfig: validUPIInstallConfig(), + validationMethod: Validate, + }, { + name: "valid IPI install config", + installConfig: validIPIInstallConfig(), + validationMethod: ValidateForProvisioning, + }, { + name: "invalid IPI - no network", + installConfig: func() *types.InstallConfig { + c := validIPIInstallConfig() + c.Platform.VSphere.Network = "" + return c + }(), + validationMethod: ValidateForProvisioning, + expectErr: `^platform\.vsphere\.network: Required value: must specify the network$`, + }, { + name: "invalid IPI - no cluster", + installConfig: func() *types.InstallConfig { + c := validIPIInstallConfig() + c.Platform.VSphere.Cluster = "" + return c + }(), + validationMethod: ValidateForProvisioning, + expectErr: `^platform\.vsphere\.cluster: Required value: must specify the cluster$`, + }} + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + err := test.validationMethod(test.installConfig) + if test.expectErr == "" { + assert.NoError(t, err) + } else { + assert.Regexp(t, test.expectErr, err.Error()) + } + }) + } +} diff --git a/pkg/types/vsphere/platform.go b/pkg/types/vsphere/platform.go index 1c09d2a65a4..a9b5c1c684b 100644 --- a/pkg/types/vsphere/platform.go +++ b/pkg/types/vsphere/platform.go @@ -43,5 +43,5 @@ type Platform struct { DefaultMachinePlatform *MachinePool `json:"defaultMachinePlatform,omitempty"` // Network specifies the name of the network to be used by the cluster. - Network string `json:"network,omitempty"` //TODO: determine if this should be omitempty or required + Network string `json:"network,omitempty"` } diff --git a/pkg/types/vsphere/validation/platform.go b/pkg/types/vsphere/validation/platform.go index 0eb0610fe70..c4ee5791beb 100644 --- a/pkg/types/vsphere/validation/platform.go +++ b/pkg/types/vsphere/validation/platform.go @@ -30,15 +30,49 @@ func ValidatePlatform(p *vsphere.Platform, fldPath *field.Path) field.ErrorList // If all VIPs are empty, skip IP validation. All VIPs are required to be defined together. if strings.Join([]string{p.APIVIP, p.IngressVIP, p.DNSVIP}, "") != "" { - if err := validate.IP(p.APIVIP); err != nil { - allErrs = append(allErrs, field.Invalid(fldPath.Child("apiVIP"), p.APIVIP, err.Error())) - } - if err := validate.IP(p.IngressVIP); err != nil { - allErrs = append(allErrs, field.Invalid(fldPath.Child("ingressVIP"), p.IngressVIP, err.Error())) - } - if err := validate.IP(p.DNSVIP); err != nil { - allErrs = append(allErrs, field.Invalid(fldPath.Child("dnsVIP"), p.DNSVIP, err.Error())) - } + allErrs = append(allErrs, validateVIPs(p, fldPath)...) + } + + return allErrs +} + +// ValidateForProvisioning checks that the specified platform is valid. +func ValidateForProvisioning(p *vsphere.Platform, fldPath *field.Path) field.ErrorList { + allErrs := field.ErrorList{} + + if len(p.Cluster) == 0 { + allErrs = append(allErrs, field.Required(fldPath.Child("cluster"), "must specify the cluster")) + } + + if len(p.Network) == 0 { + allErrs = append(allErrs, field.Required(fldPath.Child("network"), "must specify the network")) + } + + allErrs = append(allErrs, validateVIPs(p, fldPath)...) + + return allErrs +} + +// ValidateVIPs checks that all required VIPs are provided and are valid IP addresses. +func validateVIPs(p *vsphere.Platform, fldPath *field.Path) field.ErrorList { + allErrs := field.ErrorList{} + + if len(p.APIVIP) == 0 { + allErrs = append(allErrs, field.Required(fldPath.Child("apiVIP"), "must specify a VIP for the API")) + } else if err := validate.IP(p.APIVIP); err != nil { + allErrs = append(allErrs, field.Invalid(fldPath.Child("apiVIP"), p.APIVIP, err.Error())) + } + + if len(p.IngressVIP) == 0 { + allErrs = append(allErrs, field.Required(fldPath.Child("ingressVIP"), "must specify a VIP for Ingress")) + } else if err := validate.IP(p.IngressVIP); err != nil { + allErrs = append(allErrs, field.Invalid(fldPath.Child("ingressVIP"), p.IngressVIP, err.Error())) + } + + if len(p.DNSVIP) == 0 { + allErrs = append(allErrs, field.Required(fldPath.Child("dnsVIP"), "must specify a VIP for DNS")) + } else if err := validate.IP(p.DNSVIP); err != nil { + allErrs = append(allErrs, field.Invalid(fldPath.Child("dnsVIP"), p.DNSVIP, err.Error())) } return allErrs diff --git a/pkg/types/vsphere/validation/platform_test.go b/pkg/types/vsphere/validation/platform_test.go index e053fcc146d..a65aed1d99f 100644 --- a/pkg/types/vsphere/validation/platform_test.go +++ b/pkg/types/vsphere/validation/platform_test.go @@ -94,7 +94,7 @@ func TestValidatePlatform(t *testing.T) { p.DNSVIP = "192.168.111.4" return p }(), - expectedError: `^test-path\.apiVIP: Invalid value: "": "" is not a valid IP`, + expectedError: `^test-path\.apiVIP: Required value: must specify a VIP for the API`, }, { name: "missing Ingress VIP", @@ -105,7 +105,7 @@ func TestValidatePlatform(t *testing.T) { p.DNSVIP = "192.168.111.4" return p }(), - expectedError: `^test-path\.ingressVIP: Invalid value: "": "" is not a valid IP`, + expectedError: `^test-path\.ingressVIP: Required value: must specify a VIP for Ingress`, }, { name: "missing DNS VIP", @@ -116,7 +116,40 @@ func TestValidatePlatform(t *testing.T) { p.DNSVIP = "" return p }(), - expectedError: `^test-path\.dnsVIP: Invalid value: "": "" is not a valid IP`, + expectedError: `^test-path\.dnsVIP: Required value: must specify a VIP for DNS`, + }, + { + name: "Invalid API VIP", + platform: func() *vsphere.Platform { + p := validPlatform() + p.APIVIP = "192.168.111" + p.IngressVIP = "192.168.111.2" + p.DNSVIP = "192.168.111.3" + return p + }(), + expectedError: `^test-path.apiVIP: Invalid value: "192.168.111": "192.168.111" is not a valid IP`, + }, + { + name: "Invalid Ingress VIP", + platform: func() *vsphere.Platform { + p := validPlatform() + p.APIVIP = "192.168.111.1" + p.IngressVIP = "192.168.111" + p.DNSVIP = "192.168.111.3" + return p + }(), + expectedError: `^test-path.ingressVIP: Invalid value: "192.168.111": "192.168.111" is not a valid IP`, + }, + { + name: "Invalid DNS VIP", + platform: func() *vsphere.Platform { + p := validPlatform() + p.APIVIP = "192.168.111.2" + p.IngressVIP = "192.168.111.3" + p.DNSVIP = "192.168.111" + return p + }(), + expectedError: `^test-path.dnsVIP: Invalid value: "192.168.111": "192.168.111" is not a valid IP`, }, } for _, tc := range cases {