def _ApplyFlags()

in perfkitbenchmarker/relational_db_spec.py [0:0]


  def _ApplyFlags(cls, config_values, flag_values):
    """Modifies config options based on runtime flag values.

    Can be overridden by derived classes to add support for specific flags.

    Args:
      config_values: dict mapping config option names to provided values. May be
        modified by this function.
      flag_values: flags.FlagValues. Runtime flags that may override the
        provided config values.
    """
    # TODO(user): Add flags for db_disk_spec.
    # Currently the only way to modify the disk spec of the
    # db is to change the benchmark spec in the benchmark source code
    # itself.
    super()._ApplyFlags(config_values, flag_values)

    # TODO(user): Rename flags 'managed_db_' -> 'db_'.
    has_db_machine_type = flag_values['db_machine_type'].present
    has_db_cpus = flag_values['db_cpus'].present
    has_db_memory = flag_values['db_memory'].present
    has_custom_machine_type = has_db_cpus and has_db_memory
    has_client_machine_type = flag_values['client_vm_machine_type'].present
    has_client_vm_cpus = flag_values['client_vm_cpus'].present
    has_client_vm_memory = flag_values['client_vm_memory'].present
    has_client_custom_machine_type = has_client_vm_cpus and has_client_vm_memory

    if has_custom_machine_type and has_db_machine_type:
      raise errors.Config.UnrecognizedOption(
          'db_cpus/db_memory can not be specified with '
          'db_machine_type.   Either specify a custom machine '
          'with cpus and memory or specify a predefined machine type.'
      )

    if not has_custom_machine_type and (has_db_cpus or has_db_memory):
      raise errors.Config.MissingOption(
          'To specify a custom database machine instance, both db_cpus '
          'and db_memory must be specified.'
      )

    if has_client_custom_machine_type and has_client_machine_type:
      raise errors.Config.UnrecognizedOption(
          'client_vm_cpus/client_vm_memory can not be specified with '
          'client_vm_machine_type.   Either specify a custom machine '
          'with cpus and memory or specify a predefined machine type.'
      )

    if not has_client_custom_machine_type and (
        has_client_vm_cpus or has_client_vm_memory
    ):
      raise errors.Config.MissingOption(
          'To specify a custom client VM, both client_vm_cpus '
          'and client_vm_memory must be specified.'
      )

    if flag_values['use_managed_db'].present:
      config_values['is_managed_db'] = flag_values.use_managed_db

    if flag_values['cloud'].present or 'cloud' not in config_values:
      config_values['cloud'] = flag_values.cloud
    if flag_values['db_engine'].present:
      config_values['engine'] = flag_values.db_engine
    if flag_values['db_engine_version'].present:
      config_values['engine_version'] = flag_values.db_engine_version
    if flag_values['database_name'].present:
      config_values['database_name'] = flag_values.database_name
    if flag_values['database_username'].present:
      config_values['database_username'] = flag_values.database_username
    if flag_values['database_password'].present:
      config_values['database_password'] = flag_values.database_password
    if flag_values['db_high_availability'].present:
      config_values['high_availability'] = flag_values.db_high_availability
    if flag_values['db_high_availability_type'].present:
      config_values['high_availability_type'] = (
          flag_values.db_high_availability_type
      )
    if flag_values['db_backup_enabled'].present:
      config_values['backup_enabled'] = flag_values.db_backup_enabled
    if flag_values['db_flags'].present:
      config_values['db_flags'] = flag_values.db_flags
    cloud = config_values['cloud']
    has_unmanaged_dbs = 'vm_groups' in config_values and (
        'servers' in config_values['vm_groups']
        or 'servers_replicas' in config_values['vm_groups']
    )

    # Set zone for db server
    # flag value order: db_zone (if specified) -> zone (if specified)
    if flag_values['db_zone'].present:
      config_values['db_spec'][cloud]['zone'] = flag_values.db_zone[0]
      config_values['zones'] = flag_values.db_zone
      if has_unmanaged_dbs:
        config_values['vm_groups']['servers']['vm_spec'][cloud]['zone'] = (
            flag_values.db_zone[0]
        )
    elif (
        flag_values['zone'].present
        and 'db_spec' in config_values
        and 'zones' in config_values
    ):
      config_values['db_spec'][cloud]['zone'] = flag_values.zone[0]
      config_values['zones'] = flag_values.zone
      if has_unmanaged_dbs:
        config_values['vm_groups']['servers']['vm_spec'][cloud]['zone'] = (
            flag_values.zone[0]
        )

    if flag_values['client_vm_count'].present:
      config_values['vm_groups']['clients'][
          'vm_count'
      ] = flag_values.client_vm_count

    # Set zone for client vm
    # flag value order: client_vm_zone (if specified) -> zone (if specified)
    if flag_values['client_vm_zone'].present:
      config_values['vm_groups']['clients']['vm_spec'][cloud][
          'zone'
      ] = flag_values.client_vm_zone
    elif (
        flag_values['zone'].present
        and 'vm_groups' in config_values
        and 'clients' in config_values['vm_groups']
    ):
      config_values['vm_groups']['clients']['vm_spec'][cloud]['zone'] = (
          flag_values.zone[0]
      )

    # Set zone for controller vm
    if (
        flag_values['zone'].present
        and 'vm_groups' in config_values
        and 'controller' in config_values['vm_groups']
    ):
      config_values['vm_groups']['controller']['vm_spec'][cloud]['zone'] = (
          flag_values.zone[0]
      )

    if has_db_machine_type:
      config_values['db_spec'][cloud][
          'machine_type'
      ] = flag_values.db_machine_type
      if has_unmanaged_dbs:
        config_values['vm_groups']['servers']['vm_spec'][cloud][
            'machine_type'
        ] = flag_values.db_machine_type
    if has_custom_machine_type:
      config_values['db_spec'][cloud]['machine_type'] = {
          'cpus': flag_values.db_cpus,
          'memory': flag_values.db_memory,
      }
      # tox and pylint have contradictory closing brace rules, so avoid having
      # opening and closing brackets on different lines.
      config_values_vm_groups = config_values['vm_groups']
      if has_unmanaged_dbs:
        config_values_vm_groups['servers']['vm_spec'][cloud]['machine_type'] = {
            'cpus': flag_values.db_cpus,
            'memory': flag_values.db_memory,
        }
    if flag_values['managed_db_azure_compute_units'].present:
      config_values['db_spec'][cloud]['machine_type'][
          'compute_units'
      ] = flag_values.managed_db_azure_compute_units
    if flag_values['managed_db_tier'].present:
      config_values['db_tier'] = flag_values.managed_db_tier
    if has_client_machine_type:
      config_values['vm_groups']['clients']['vm_spec'][cloud][
          'machine_type'
      ] = flag_values.client_vm_machine_type
    if has_client_custom_machine_type:
      config_values_vm_groups = config_values['vm_groups']
      config_values_vm_groups['clients']['vm_spec'][cloud]['machine_type'] = {
          'cpus': flag_values.client_vm_cpus,
          'memory': flag_values.client_vm_memory,
      }
    if flag_values['db_num_striped_disks'].present and has_unmanaged_dbs:
      config_values['vm_groups']['servers']['disk_spec'][cloud][
          'num_striped_disks'
      ] = flag_values.db_num_striped_disks
    if flag_values['db_disk_size'].present:
      config_values['db_disk_spec'][cloud][
          'disk_size'
      ] = flag_values.db_disk_size
      if has_unmanaged_dbs:
        config_values['vm_groups']['servers']['disk_spec'][cloud][
            'disk_size'
        ] = flag_values.db_disk_size
    if flag_values['db_disk_type'].present:
      config_values['db_disk_spec'][cloud][
          'disk_type'
      ] = flag_values.db_disk_type
      if has_unmanaged_dbs:
        config_values['vm_groups']['servers']['disk_spec'][cloud][
            'disk_type'
        ] = flag_values.db_disk_type
    if flag_values['db_disk_iops'].present:
      # This value will be used in aws_relation_db.py druing db creation
      config_values['db_disk_spec'][cloud][
          'provisioned_iops'
      ] = flag_values.db_disk_iops
      if has_unmanaged_dbs:
        config_values['vm_groups']['servers']['disk_spec'][cloud][
            'provisioned_iops'
        ] = flag_values.db_disk_iops
    if flag_values['db_disk_throughput'].present:
      config_values['db_disk_spec'][cloud][
          'provisioned_throughput'
      ] = flag_values.db_disk_throughput
      if has_unmanaged_dbs:
        config_values['vm_groups']['servers']['disk_spec'][cloud][
            'provisioned_throughput'
        ] = flag_values.db_disk_throughput

    if flag_values['client_vm_os_type'].present:
      config_values['vm_groups']['clients'][
          'os_type'
      ] = flag_values.client_vm_os_type
    if flag_values['server_vm_os_type'].present:
      config_values['vm_groups']['servers'][
          'os_type'
      ] = flag_values.server_vm_os_type

    if flag_values['client_gcp_min_cpu_platform'].present:
      config_values['vm_groups']['clients']['vm_spec'][cloud][
          'min_cpu_platform'
      ] = flag_values.client_gcp_min_cpu_platform
    if flag_values['server_gcp_min_cpu_platform'].present:
      config_values['vm_groups']['servers']['vm_spec'][cloud][
          'min_cpu_platform'
      ] = flag_values.server_gcp_min_cpu_platform
    if flag_values['server_gce_num_local_ssds'].present and has_unmanaged_dbs:
      config_values['vm_groups']['servers']['vm_spec'][cloud][
          'num_local_ssds'
      ] = flag_values.server_gce_num_local_ssds
    if flag_values['server_gce_ssd_interface'].present and has_unmanaged_dbs:
      config_values['vm_groups']['servers']['vm_spec'][cloud][
          'ssd_interface'
      ] = flag_values.server_gce_ssd_interface
      config_values['vm_groups']['servers']['disk_spec'][cloud][
          'interface'
      ] = flag_values.server_gce_ssd_interface
    if flag_values['client_vm_disk_size'].present:
      config_values['vm_groups']['clients']['disk_spec'][cloud][
          'disk_size'
      ] = flag_values.client_vm_disk_size
    if flag_values['client_vm_disk_type'].present:
      config_values['vm_groups']['clients']['disk_spec'][cloud][
          'disk_type'
      ] = flag_values.client_vm_disk_type
    if flag_values['client_vm_disk_iops'].present:
      config_values['vm_groups']['clients']['disk_spec'][cloud][
          'provisioned_iops'
      ] = flag_values.client_vm_disk_iops

    # Copy the servers vm group to the server replicas vm group if unmanaged
    # dbs are present.
    if (
        has_unmanaged_dbs
        and 'servers_replicas' in config_values['vm_groups']
        and 'vm_count' in config_values['vm_groups']['servers_replicas']
        and config_values['vm_groups']['servers_replicas']['vm_count'] > 0
    ):
      config_values['vm_groups']['servers_replicas'] = copy.deepcopy(
          config_values['vm_groups']['servers']
      )
      # Set the zone for replica server (if specified)
      if flag_values['db_replica_zones'].present:
        if (
            config_values['vm_groups']['servers']['vm_spec'][cloud]['zone']
            == flag_values.db_replica_zones[0]
        ):
          config_values['vm_groups']['servers_replicas']['vm_spec'][cloud][
              'zone'
          ] = flag_values.db_replica_zones[1]
        else:
          config_values['vm_groups']['servers_replicas']['vm_spec'][cloud][
              'zone'
          ] = flag_values.db_replica_zones[0]

      # Clear all the zones if the zone flag is present. This will prevent zone
      # values to be overwritten by the benchmark
      # spec.ConstructVirtualMachineGroup() method.
      if flag_values['zone'].present:
        flag_values.zone.clear()

    logging.warning('Relational db config values: %s', config_values)