diff --git a/README.md b/README.md index 8018c4622..c158036d3 100644 --- a/README.md +++ b/README.md @@ -123,16 +123,13 @@ To install a Kubernetes cluster using Kubemarine: nodes: - name: "k8s-control-plane-1" - address: "10.101.0.1" - internal_address: "192.168.0.1" + internal_address: "10.101.0.1" roles: ["balancer", "control-plane", "worker"] - name: "k8s-control-plane-2" - address: "10.101.0.2" - internal_address: "192.168.0.2" + internal_address: "10.101.0.2" roles: ["balancer", "control-plane", "worker"] - name: "k8s-control-plane-3" - address: "10.101.0.3" - internal_address: "192.168.0.3" + internal_address: "10.101.0.3" roles: ["balancer", "control-plane", "worker"] cluster_name: "k8s.example.com" diff --git a/kubemarine/procedures/remove_node.py b/kubemarine/procedures/remove_node.py index 047266812..8fefbfd48 100755 --- a/kubemarine/procedures/remove_node.py +++ b/kubemarine/procedures/remove_node.py @@ -99,7 +99,9 @@ def remove_node_finalize_inventory(cluster: KubernetesCluster, inventory_to_fina if inventory_to_finalize['services'].get('kubeadm', {}).get('apiServer', {}).get('certSANs'): for node in nodes_for_removal.get_ordered_members_list(provide_node_configs=True): - hostnames = [node['name'], node['address'], node['internal_address']] + hostnames = [node['name'], node['internal_address']] + if node.get('address') is not None: + hostnames.append(node['address']) for name in hostnames: if name in inventory_to_finalize['services']['kubeadm']['apiServer']['certSANs']: inventory_to_finalize['services']['kubeadm']['apiServer']['certSANs'].remove(name) @@ -108,7 +110,7 @@ def remove_node_finalize_inventory(cluster: KubernetesCluster, inventory_to_fina for node in nodes_for_removal.get_ordered_members_list(provide_node_configs=True): if inventory_to_finalize['services']['etc_hosts'].get(node['internal_address']): del inventory_to_finalize['services']['etc_hosts'][node['internal_address']] - if inventory_to_finalize['services']['etc_hosts'].get(node['address']): + if node.get('address') is not None and inventory_to_finalize['services']['etc_hosts'].get(node['address']): del inventory_to_finalize['services']['etc_hosts'][node['address']] coredns.enrich_add_hosts_config(inventory_to_finalize, cluster) diff --git a/kubemarine/system.py b/kubemarine/system.py index 3c5cf3a85..6c75b8ed0 100644 --- a/kubemarine/system.py +++ b/kubemarine/system.py @@ -92,12 +92,9 @@ def enrich_inventory(inventory, cluster): external_node_ip_names = inventory['services']['etc_hosts'].get(node['address'], []) external_node_ip_names.append("%s-external.%s" % (node['name'], cluster.inventory['cluster_name'])) external_node_ip_names.append(node['name'] + "-external") + external_node_ip_names = list(set(external_node_ip_names)) inventory['services']['etc_hosts'][node['address']] = external_node_ip_names - uniq_node_hostnames = list(set(inventory['services']['etc_hosts'][node['address']])) - inventory['services']['etc_hosts'][node['address']] = uniq_node_hostnames - - return inventory diff --git a/test/unit/test_inventory.py b/test/unit/test_inventory.py index 10d910ec6..a8fdd414c 100755 --- a/test/unit/test_inventory.py +++ b/test/unit/test_inventory.py @@ -12,11 +12,11 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. - - +import copy import unittest from kubemarine import demo +from kubemarine.core import utils class TestInventoryValidation(unittest.TestCase): @@ -96,5 +96,63 @@ def test_roles_in_inventory(self): self.assertIn('master', roles) self.assertIn('control-plane', roles) + def test_internal_address_inventory(self): + inventory = demo.generate_inventory() + for node in inventory['nodes']: + node.pop('address') + + cluster = demo.new_cluster(inventory) + for node in cluster.inventory['nodes']: + self.assertNotIn('address', node) + + final_inventory = utils.get_final_inventory(cluster, inventory) + for node in final_inventory['nodes']: + self.assertNotIn('address', node) + + def test_internal_address_remove_node_inventory(self): + inventory = demo.generate_inventory(**demo.MINIHA_KEEPALIVED) + for node in inventory['nodes']: + node.pop('address') + procedure_inventory = { + 'nodes': [copy.deepcopy(inventory['nodes'][0])] + } + + # Remove node inventory + context = demo.create_silent_context(procedure='remove_node') + cluster = demo.new_cluster(inventory, procedure_inventory=procedure_inventory, context=context) + for node in cluster.inventory['nodes']: + self.assertNotIn('address', node) + + final_inventory = utils.get_final_inventory(cluster) + for node in final_inventory['nodes']: + self.assertNotIn('address', node) + + def test_internal_address_add_node_inventory(self): + inventory = demo.generate_inventory(**demo.MINIHA_KEEPALIVED) + for node in inventory['nodes']: + node.pop('address') + + # Add node inventory + context = demo.create_silent_context(procedure='add_node') + host_different_os = inventory['nodes'][0]['internal_address'] + context['nodes'] = self._nodes_context_one_different_os(inventory, host_different_os) + procedure_inventory = {'nodes': [inventory['nodes'].pop(0)]} + cluster = demo.new_cluster(inventory, procedure_inventory=procedure_inventory, context=context) + for node in cluster.inventory['nodes']: + self.assertNotIn('address', node) + + final_inventory = utils.get_final_inventory(cluster) + for node in final_inventory['nodes']: + self.assertNotIn('address', node) + + def _nodes_context_one_different_os(self, inventory, host_different_os): + nodes_context = demo.generate_nodes_context(inventory, os_name='ubuntu', os_version='20.04') + nodes_context[host_different_os]['os'] = { + 'name': 'centos', + 'family': 'rhel', + 'version': '7.9' + } + return nodes_context + if __name__ == '__main__': unittest.main()