diff --git a/data/data/aws/main.tf b/data/data/aws/main.tf index 5ce4f01e3f9..14161edd4ba 100644 --- a/data/data/aws/main.tf +++ b/data/data/aws/main.tf @@ -1,6 +1,8 @@ locals { private_zone_id = "${aws_route53_zone.int.zone_id}" + cluster_domain = "${var.cluster_name}.${var.base_domain}" + tags = "${merge(map( "openshiftClusterID", "${var.cluster_id}" ), var.aws_extra_tags)}" @@ -92,7 +94,7 @@ resource "aws_route53_record" "etcd_a_nodes" { type = "A" ttl = "60" zone_id = "${local.private_zone_id}" - name = "${var.cluster_name}-etcd-${count.index}" + name = "etcd-${count.index}.${local.cluster_domain}" records = ["${module.masters.ip_addresses[count.index]}"] } @@ -100,12 +102,12 @@ resource "aws_route53_record" "etcd_cluster" { type = "SRV" ttl = "60" zone_id = "${local.private_zone_id}" - name = "_etcd-server-ssl._tcp.${var.cluster_name}" + name = "_etcd-server-ssl._tcp" records = ["${formatlist("0 10 2380 %s", aws_route53_record.etcd_a_nodes.*.fqdn)}"] } resource "aws_route53_zone" "int" { - name = "${var.base_domain}" + name = "${local.cluster_domain}" force_destroy = true vpc { diff --git a/data/data/aws/route53/base.tf b/data/data/aws/route53/base.tf index d9f4d06dc07..b92e435baab 100644 --- a/data/data/aws/route53/base.tf +++ b/data/data/aws/route53/base.tf @@ -6,11 +6,13 @@ locals { public_zone_id = "${data.aws_route53_zone.base.zone_id}" zone_id = "${var.private_zone_id}" + + cluster_domain = "${var.cluster_name}.${var.base_domain}" } resource "aws_route53_record" "api_external" { zone_id = "${local.public_zone_id}" - name = "${var.cluster_name}-api.${var.base_domain}" + name = "api.${local.cluster_domain}" type = "A" alias { @@ -22,7 +24,7 @@ resource "aws_route53_record" "api_external" { resource "aws_route53_record" "api_internal" { zone_id = "${var.private_zone_id}" - name = "${var.cluster_name}-api.${var.base_domain}" + name = "api.${local.cluster_domain}" type = "A" alias { diff --git a/data/data/aws/vpc/vpc.tf b/data/data/aws/vpc/vpc.tf index 4a44b92e75d..01b19e9d1fb 100644 --- a/data/data/aws/vpc/vpc.tf +++ b/data/data/aws/vpc/vpc.tf @@ -1,6 +1,8 @@ locals { new_private_cidr_range = "${cidrsubnet(data.aws_vpc.cluster_vpc.cidr_block,1,1)}" new_public_cidr_range = "${cidrsubnet(data.aws_vpc.cluster_vpc.cidr_block,1,0)}" + + cluster_domain = "${var.cluster_name}.${var.base_domain}" } resource "aws_vpc" "new_vpc" { @@ -9,7 +11,7 @@ resource "aws_vpc" "new_vpc" { enable_dns_support = true tags = "${merge(map( - "Name", "${var.cluster_name}.${var.base_domain}", + "Name", "${local.cluster_domain}", ), var.tags)}" } diff --git a/data/data/libvirt/main.tf b/data/data/libvirt/main.tf index 06bbac25313..869d151bef7 100644 --- a/data/data/libvirt/main.tf +++ b/data/data/libvirt/main.tf @@ -1,3 +1,7 @@ +locals { + cluster_domain = "${var.cluster_name}.${var.base_domain}" +} + provider "libvirt" { uri = "${var.libvirt_uri}" } @@ -36,7 +40,7 @@ resource "libvirt_network" "net" { mode = "nat" bridge = "${var.libvirt_network_if}" - domain = "${var.base_domain}" + domain = "${local.cluster_domain}" addresses = [ "${var.machine_cidr}", @@ -92,27 +96,27 @@ resource "libvirt_domain" "master" { data "libvirt_network_dns_host_template" "bootstrap" { count = "${var.bootstrap_dns ? 1 : 0}" ip = "${var.libvirt_bootstrap_ip}" - hostname = "${var.cluster_name}-api" + hostname = "api.${local.cluster_domain}" } data "libvirt_network_dns_host_template" "masters" { count = "${var.master_count}" ip = "${var.libvirt_master_ips[count.index]}" - hostname = "${var.cluster_name}-api" + hostname = "api.${local.cluster_domain}" } data "libvirt_network_dns_host_template" "etcds" { count = "${var.master_count}" ip = "${var.libvirt_master_ips[count.index]}" - hostname = "${var.cluster_name}-etcd-${count.index}" + hostname = "etcd-${count.index}.${local.cluster_domain}" } data "libvirt_network_dns_srv_template" "etcd_cluster" { count = "${var.master_count}" service = "etcd-server-ssl" protocol = "tcp" - domain = "${var.cluster_name}.${var.base_domain}" + domain = "${local.cluster_domain}" port = 2380 weight = 10 - target = "${var.cluster_name}-etcd-${count.index}.${var.base_domain}" + target = "etcd-${count.index}.${local.cluster_domain}" } diff --git a/data/data/openstack/main.tf b/data/data/openstack/main.tf index 55ae38e5e2d..0432e37fe50 100644 --- a/data/data/openstack/main.tf +++ b/data/data/openstack/main.tf @@ -1,3 +1,7 @@ +locals { + cluster_domain = "${var.cluster_name}.${var.base_domain}" +} + provider "openstack" { auth_url = "${var.openstack_credentials_auth_url}" cert = "${var.openstack_credentials_cert}" @@ -81,7 +85,7 @@ module "topology" { } resource "openstack_objectstorage_container_v1" "container" { - name = "${lower(var.cluster_name)}.${var.base_domain}" + name = "${local.cluster_domain}" metadata = "${merge(map( "Name", "${var.cluster_name}-ignition-master", diff --git a/data/data/openstack/service/main.tf b/data/data/openstack/service/main.tf index a7bb8db1880..bdfb650b9c6 100644 --- a/data/data/openstack/service/main.tf +++ b/data/data/openstack/service/main.tf @@ -134,19 +134,19 @@ data "ignition_file" "corefile" { errors reload 10s -${length(var.lb_floating_ip) == 0 ? "" : " file /etc/coredns/db.${var.cluster_domain} ${var.cluster_name}-api.${var.cluster_domain} {\n }\n"} +${length(var.lb_floating_ip) == 0 ? "" : " file /etc/coredns/db.${var.cluster_domain} api.${var.cluster_domain} {\n }\n"} - file /etc/coredns/db.${var.cluster_domain} _etcd-server-ssl._tcp.${var.cluster_name}.${var.cluster_domain} { + file /etc/coredns/db.${var.cluster_domain} _etcd-server-ssl._tcp.${var.cluster_domain} { } -${replace(join("\n", formatlist(" file /etc/coredns/db.${var.cluster_domain} ${var.cluster_name}-etcd-%s.${var.cluster_domain} {\n upstream /etc/resolv.conf\n }\n", var.master_port_names)), "master-port-", "")} +${replace(join("\n", formatlist(" file /etc/coredns/db.${var.cluster_domain} etcd-%s.${var.cluster_domain} {\n upstream /etc/resolv.conf\n }\n", var.master_port_names)), "master-port-", "")} forward . /etc/resolv.conf { } } -${var.cluster_name}.${var.cluster_domain} { +${var.cluster_domain} { log errors reload 10s @@ -168,7 +168,7 @@ data "ignition_file" "coredb" { content { content = < 0 { + parents = append(parents, domain[idx+1:]) + } + domain = domain[idx+1:] + } + + for _, p := range parents { + sZone, err := findPublicRoute53(client, p, logger) + if err != nil { + return "", err + } + if sZone != "" { + return sZone, nil + } + } + return "", nil +} + +// findPublicRoute53 finds a public route53 zone matching the dnsName. +// It returns "", when no public route53 zone could be found. +func findPublicRoute53(client *route53.Route53, dnsName string, logger logrus.FieldLogger) (string, error) { request := &route53.ListHostedZonesByNameInput{ - DNSName: aws.String(privateName), + DNSName: aws.String(dnsName), } for i := 0; true; i++ { - logger.Debugf("listing AWS hosted zones (page %d)", i) + logger.Debugf("listing AWS hosted zones %q (page %d)", dnsName, i) list, err := client.ListHostedZonesByName(request) if err != nil { return "", err } for _, zone := range list.HostedZones { - if *zone.Id == privateID { - continue - } - if *zone.Name != privateName { + if *zone.Name != dnsName { + // No name after this can match dnsName return "", nil } if zone.Config == nil || zone.Config.PrivateZone == nil { @@ -381,7 +407,6 @@ func getSharedHostedZone(client *route53.Route53, privateID string, logger logru break } - return "", nil } diff --git a/pkg/types/installconfig.go b/pkg/types/installconfig.go index 97ac99d0401..86c332f98d3 100644 --- a/pkg/types/installconfig.go +++ b/pkg/types/installconfig.go @@ -1,6 +1,8 @@ package types import ( + "fmt" + "github.com/openshift/installer/pkg/ipnet" "github.com/openshift/installer/pkg/types/aws" "github.com/openshift/installer/pkg/types/libvirt" @@ -64,6 +66,11 @@ type InstallConfig struct { PullSecret string `json:"pullSecret"` } +// ClusterDomain returns the DNS domain that all records for a cluster must belong to. +func (c *InstallConfig) ClusterDomain() string { + return fmt.Sprintf("%s.%s", c.ObjectMeta.Name, c.BaseDomain) +} + // Platform is the configuration for the specific platform upon which to perform // the installation. Only one of the platform configuration should be set. type Platform struct {