cloudbase-init/cloudbaseinit/plugins/windows/pagefiles.py

80 lines
3.0 KiB
Python

# Copyright (c) 2017 Cloudbase Solutions Srl
#
# 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.
import os
from oslo_log import log as oslo_logging
from cloudbaseinit import conf as cloudbaseinit_conf
from cloudbaseinit import exception
from cloudbaseinit.osutils import factory as osutils_factory
from cloudbaseinit.plugins.common import base
CONF = cloudbaseinit_conf.CONF
LOG = oslo_logging.getLogger(__name__)
class PageFilesPlugin(base.BasePlugin):
def _get_page_file_volumes_by_mount_point(self, osutils):
page_file_volume_paths = []
for mount_point in CONF.page_file_volume_mount_points:
try:
paths = osutils.get_volume_path_names_by_mount_point(
mount_point)
if paths:
page_file_volume_paths.append(paths[0])
except exception.ItemNotFoundException:
LOG.info("Mount point not found: %s", mount_point)
return page_file_volume_paths
def _get_page_file_volumes_by_label(self, osutils):
page_file_logical_drives = []
logical_drives = osutils.get_logical_drives()
for logical_drive in logical_drives:
label = osutils.get_volume_label(logical_drive)
if not label:
continue
if label.upper() in [
v.upper() for v in CONF.page_file_volume_labels]:
page_file_logical_drives.append(logical_drive)
return page_file_logical_drives
def _get_page_file_volumes(self, osutils):
return list(set(self._get_page_file_volumes_by_mount_point(osutils)) |
set(self._get_page_file_volumes_by_label(osutils)))
def execute(self, service, shared_data):
osutils = osutils_factory.get_os_utils()
page_file_volumes = sorted(self._get_page_file_volumes(osutils))
reboot_required = False
if not page_file_volumes:
LOG.info("No page file volume found, skipping configuration")
else:
page_files = [
(os.path.join(v, "pagefile.sys"), 0, 0)
for v in page_file_volumes]
current_page_files = osutils.get_page_files()
if sorted(current_page_files) != sorted(page_files):
osutils.set_page_files(page_files)
LOG.info("Page file configuration set: %s", page_files)
reboot_required = True
return base.PLUGIN_EXECUTE_ON_NEXT_BOOT, reboot_required
def get_os_requirements(self):
return 'win32', (5, 2)