blob: cd592c451b77f0919c56122bfd73fdfdd1e502cc [file] [log] [blame]
#!/usr/bin/python3
#
# Copyright 2018 Mirantis, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, 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.
"""Prepare metadata python module
The module is aimed to prepare system files files (networking configs etc)
based on lab metadata.
Example:
python prepare-metadata --metadata-file '/etc/lab-metadata.yaml'
Example of lab-metadata.yaml
'52:54:00:10:94:78':
write_files:
- path: '/tmp/123.yaml'
content: |
foo: bar
Attributes:
metadata-file - The file with metadata
"""
__version__ = '1.0'
import argparse
import os
import yaml
import logging
import netifaces
import sys
LOG = logging.getLogger(__name__)
def main():
logging.basicConfig(
format='%(asctime)s - %(levelname)s - %(message)s'
)
LOG.setLevel(logging.INFO)
parser = argparse.ArgumentParser(
description=('Render system files based on metadata')
)
group = parser.add_argument_group()
group.add_argument(
'--metadata-file',
help='The path to metadata file.',
required=True
)
args = parser.parse_args()
with open(args.metadata_file) as f:
metadata = yaml.safe_load(f)
if not metadata:
LOG.info("The metadata is empty")
return
node_meta = get_node_metadata(metadata)
if node_meta is not None:
LOG.info(f"Processing node_metadata: {node_meta}")
create_files(node_meta.get('write_files', []))
else:
LOG.error("No matches to MACs for node_metadata found")
def get_interface_mac(iface_name):
mac = None
ifaddresses = netifaces.ifaddresses(iface_name)
link = ifaddresses.get(netifaces.AF_LINK, [])
if link:
return link[0]['addr']
def get_node_macs():
ifaces = netifaces.interfaces()
macs = [get_interface_mac(iface_name) for iface_name in ifaces]
return [mac for mac in macs if mac is not None]
def get_node_metadata(metadata):
for mac in get_node_macs():
if mac in metadata:
return metadata[mac]
def create_files(files_meta):
for file_meta in files_meta:
path = file_meta['path']
content = file_meta['content']
permissions = int(str(file_meta.get('permissions', '644')), base=8)
with open(path, "w") as f:
f.write(content)
os.chmod(path, permissions)
if __name__ == '__main__':
try:
main()
except Exception as e:
LOG.exception(f"Failed to apply image layout: {e}")
sys.exit(1)