# Copyright 2025 Google LLC. All Rights Reserved.
# 
# 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.
from connector import channel
from google3.cloud.graphite.mmv2.services.google.dataproc import cluster_pb2
from google3.cloud.graphite.mmv2.services.google.dataproc import cluster_pb2_grpc

from typing import List


class Cluster(object):
    def __init__(
        self,
        project: str = None,
        name: str = None,
        config: dict = None,
        labels: dict = None,
        status: dict = None,
        status_history: list = None,
        cluster_uuid: str = None,
        metrics: dict = None,
        location: str = None,
        virtual_cluster_config: dict = None,
        service_account_file: str = "",
    ):

        channel.initialize()
        self.project = project
        self.name = name
        self.config = config
        self.labels = labels
        self.location = location
        self.virtual_cluster_config = virtual_cluster_config
        self.service_account_file = service_account_file

    def apply(self):
        stub = cluster_pb2_grpc.DataprocClusterServiceStub(channel.Channel())
        request = cluster_pb2.ApplyDataprocClusterRequest()
        if Primitive.to_proto(self.project):
            request.resource.project = Primitive.to_proto(self.project)

        if Primitive.to_proto(self.name):
            request.resource.name = Primitive.to_proto(self.name)

        if ClusterConfig.to_proto(self.config):
            request.resource.config.CopyFrom(ClusterConfig.to_proto(self.config))
        else:
            request.resource.ClearField("config")
        if Primitive.to_proto(self.labels):
            request.resource.labels = Primitive.to_proto(self.labels)

        if Primitive.to_proto(self.location):
            request.resource.location = Primitive.to_proto(self.location)

        if ClusterVirtualClusterConfig.to_proto(self.virtual_cluster_config):
            request.resource.virtual_cluster_config.CopyFrom(
                ClusterVirtualClusterConfig.to_proto(self.virtual_cluster_config)
            )
        else:
            request.resource.ClearField("virtual_cluster_config")
        request.service_account_file = self.service_account_file

        response = stub.ApplyDataprocCluster(request)
        self.project = Primitive.from_proto(response.project)
        self.name = Primitive.from_proto(response.name)
        self.config = ClusterConfig.from_proto(response.config)
        self.labels = Primitive.from_proto(response.labels)
        self.status = ClusterStatus.from_proto(response.status)
        self.status_history = ClusterStatusHistoryArray.from_proto(
            response.status_history
        )
        self.cluster_uuid = Primitive.from_proto(response.cluster_uuid)
        self.metrics = ClusterMetrics.from_proto(response.metrics)
        self.location = Primitive.from_proto(response.location)
        self.virtual_cluster_config = ClusterVirtualClusterConfig.from_proto(
            response.virtual_cluster_config
        )

    def delete(self):
        stub = cluster_pb2_grpc.DataprocClusterServiceStub(channel.Channel())
        request = cluster_pb2.DeleteDataprocClusterRequest()
        request.service_account_file = self.service_account_file
        if Primitive.to_proto(self.project):
            request.resource.project = Primitive.to_proto(self.project)

        if Primitive.to_proto(self.name):
            request.resource.name = Primitive.to_proto(self.name)

        if ClusterConfig.to_proto(self.config):
            request.resource.config.CopyFrom(ClusterConfig.to_proto(self.config))
        else:
            request.resource.ClearField("config")
        if Primitive.to_proto(self.labels):
            request.resource.labels = Primitive.to_proto(self.labels)

        if Primitive.to_proto(self.location):
            request.resource.location = Primitive.to_proto(self.location)

        if ClusterVirtualClusterConfig.to_proto(self.virtual_cluster_config):
            request.resource.virtual_cluster_config.CopyFrom(
                ClusterVirtualClusterConfig.to_proto(self.virtual_cluster_config)
            )
        else:
            request.resource.ClearField("virtual_cluster_config")
        response = stub.DeleteDataprocCluster(request)

    @classmethod
    def list(self, project, location, service_account_file=""):
        stub = cluster_pb2_grpc.DataprocClusterServiceStub(channel.Channel())
        request = cluster_pb2.ListDataprocClusterRequest()
        request.service_account_file = service_account_file
        request.Project = project

        request.Location = location

        return stub.ListDataprocCluster(request).items

    def to_proto(self):
        resource = cluster_pb2.DataprocCluster()
        if Primitive.to_proto(self.project):
            resource.project = Primitive.to_proto(self.project)
        if Primitive.to_proto(self.name):
            resource.name = Primitive.to_proto(self.name)
        if ClusterConfig.to_proto(self.config):
            resource.config.CopyFrom(ClusterConfig.to_proto(self.config))
        else:
            resource.ClearField("config")
        if Primitive.to_proto(self.labels):
            resource.labels = Primitive.to_proto(self.labels)
        if Primitive.to_proto(self.location):
            resource.location = Primitive.to_proto(self.location)
        if ClusterVirtualClusterConfig.to_proto(self.virtual_cluster_config):
            resource.virtual_cluster_config.CopyFrom(
                ClusterVirtualClusterConfig.to_proto(self.virtual_cluster_config)
            )
        else:
            resource.ClearField("virtual_cluster_config")
        return resource


class ClusterConfig(object):

    def __init__(
        self,
        staging_bucket: str = None,
        temp_bucket: str = None,
        gce_cluster_config: dict = None,
        master_config: dict = None,
        worker_config: dict = None,
        secondary_worker_config: dict = None,
        software_config: dict = None,
        initialization_actions: list = None,
        encryption_config: dict = None,
        autoscaling_config: dict = None,
        security_config: dict = None,
        lifecycle_config: dict = None,
        endpoint_config: dict = None,
        metastore_config: dict = None,
        dataproc_metric_config: dict = None,
    ):
        self.staging_bucket = staging_bucket
        self.temp_bucket = temp_bucket
        self.gce_cluster_config = gce_cluster_config
        self.master_config = master_config
        self.worker_config = worker_config
        self.secondary_worker_config = secondary_worker_config
        self.software_config = software_config
        self.initialization_actions = initialization_actions
        self.encryption_config = encryption_config
        self.autoscaling_config = autoscaling_config
        self.security_config = security_config
        self.lifecycle_config = lifecycle_config
        self.endpoint_config = endpoint_config
        self.metastore_config = metastore_config
        self.dataproc_metric_config = dataproc_metric_config

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = cluster_pb2.DataprocClusterConfig()
        if Primitive.to_proto(resource.staging_bucket):
            res.staging_bucket = Primitive.to_proto(resource.staging_bucket)
        if Primitive.to_proto(resource.temp_bucket):
            res.temp_bucket = Primitive.to_proto(resource.temp_bucket)
        if ClusterConfigGceClusterConfig.to_proto(resource.gce_cluster_config):
            res.gce_cluster_config.CopyFrom(
                ClusterConfigGceClusterConfig.to_proto(resource.gce_cluster_config)
            )
        else:
            res.ClearField("gce_cluster_config")
        if ClusterConfigMasterConfig.to_proto(resource.master_config):
            res.master_config.CopyFrom(
                ClusterConfigMasterConfig.to_proto(resource.master_config)
            )
        else:
            res.ClearField("master_config")
        if ClusterConfigWorkerConfig.to_proto(resource.worker_config):
            res.worker_config.CopyFrom(
                ClusterConfigWorkerConfig.to_proto(resource.worker_config)
            )
        else:
            res.ClearField("worker_config")
        if ClusterConfigSecondaryWorkerConfig.to_proto(
            resource.secondary_worker_config
        ):
            res.secondary_worker_config.CopyFrom(
                ClusterConfigSecondaryWorkerConfig.to_proto(
                    resource.secondary_worker_config
                )
            )
        else:
            res.ClearField("secondary_worker_config")
        if ClusterConfigSoftwareConfig.to_proto(resource.software_config):
            res.software_config.CopyFrom(
                ClusterConfigSoftwareConfig.to_proto(resource.software_config)
            )
        else:
            res.ClearField("software_config")
        if ClusterConfigInitializationActionsArray.to_proto(
            resource.initialization_actions
        ):
            res.initialization_actions.extend(
                ClusterConfigInitializationActionsArray.to_proto(
                    resource.initialization_actions
                )
            )
        if ClusterConfigEncryptionConfig.to_proto(resource.encryption_config):
            res.encryption_config.CopyFrom(
                ClusterConfigEncryptionConfig.to_proto(resource.encryption_config)
            )
        else:
            res.ClearField("encryption_config")
        if ClusterConfigAutoscalingConfig.to_proto(resource.autoscaling_config):
            res.autoscaling_config.CopyFrom(
                ClusterConfigAutoscalingConfig.to_proto(resource.autoscaling_config)
            )
        else:
            res.ClearField("autoscaling_config")
        if ClusterConfigSecurityConfig.to_proto(resource.security_config):
            res.security_config.CopyFrom(
                ClusterConfigSecurityConfig.to_proto(resource.security_config)
            )
        else:
            res.ClearField("security_config")
        if ClusterConfigLifecycleConfig.to_proto(resource.lifecycle_config):
            res.lifecycle_config.CopyFrom(
                ClusterConfigLifecycleConfig.to_proto(resource.lifecycle_config)
            )
        else:
            res.ClearField("lifecycle_config")
        if ClusterConfigEndpointConfig.to_proto(resource.endpoint_config):
            res.endpoint_config.CopyFrom(
                ClusterConfigEndpointConfig.to_proto(resource.endpoint_config)
            )
        else:
            res.ClearField("endpoint_config")
        if ClusterConfigMetastoreConfig.to_proto(resource.metastore_config):
            res.metastore_config.CopyFrom(
                ClusterConfigMetastoreConfig.to_proto(resource.metastore_config)
            )
        else:
            res.ClearField("metastore_config")
        if ClusterConfigDataprocMetricConfig.to_proto(resource.dataproc_metric_config):
            res.dataproc_metric_config.CopyFrom(
                ClusterConfigDataprocMetricConfig.to_proto(
                    resource.dataproc_metric_config
                )
            )
        else:
            res.ClearField("dataproc_metric_config")
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterConfig(
            staging_bucket=Primitive.from_proto(resource.staging_bucket),
            temp_bucket=Primitive.from_proto(resource.temp_bucket),
            gce_cluster_config=ClusterConfigGceClusterConfig.from_proto(
                resource.gce_cluster_config
            ),
            master_config=ClusterConfigMasterConfig.from_proto(resource.master_config),
            worker_config=ClusterConfigWorkerConfig.from_proto(resource.worker_config),
            secondary_worker_config=ClusterConfigSecondaryWorkerConfig.from_proto(
                resource.secondary_worker_config
            ),
            software_config=ClusterConfigSoftwareConfig.from_proto(
                resource.software_config
            ),
            initialization_actions=ClusterConfigInitializationActionsArray.from_proto(
                resource.initialization_actions
            ),
            encryption_config=ClusterConfigEncryptionConfig.from_proto(
                resource.encryption_config
            ),
            autoscaling_config=ClusterConfigAutoscalingConfig.from_proto(
                resource.autoscaling_config
            ),
            security_config=ClusterConfigSecurityConfig.from_proto(
                resource.security_config
            ),
            lifecycle_config=ClusterConfigLifecycleConfig.from_proto(
                resource.lifecycle_config
            ),
            endpoint_config=ClusterConfigEndpointConfig.from_proto(
                resource.endpoint_config
            ),
            metastore_config=ClusterConfigMetastoreConfig.from_proto(
                resource.metastore_config
            ),
            dataproc_metric_config=ClusterConfigDataprocMetricConfig.from_proto(
                resource.dataproc_metric_config
            ),
        )


class ClusterConfigArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [ClusterConfig.to_proto(i) for i in resources]

    @classmethod
    def from_proto(self, resources):
        return [ClusterConfig.from_proto(i) for i in resources]


class ClusterConfigGceClusterConfig(object):

    def __init__(
        self,
        zone: str = None,
        network: str = None,
        subnetwork: str = None,
        internal_ip_only: bool = None,
        private_ipv6_google_access: str = None,
        service_account: str = None,
        service_account_scopes: list = None,
        tags: list = None,
        metadata: dict = None,
        reservation_affinity: dict = None,
        node_group_affinity: dict = None,
        shielded_instance_config: dict = None,
        confidential_instance_config: dict = None,
    ):
        self.zone = zone
        self.network = network
        self.subnetwork = subnetwork
        self.internal_ip_only = internal_ip_only
        self.private_ipv6_google_access = private_ipv6_google_access
        self.service_account = service_account
        self.service_account_scopes = service_account_scopes
        self.tags = tags
        self.metadata = metadata
        self.reservation_affinity = reservation_affinity
        self.node_group_affinity = node_group_affinity
        self.shielded_instance_config = shielded_instance_config
        self.confidential_instance_config = confidential_instance_config

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = cluster_pb2.DataprocClusterConfigGceClusterConfig()
        if Primitive.to_proto(resource.zone):
            res.zone = Primitive.to_proto(resource.zone)
        if Primitive.to_proto(resource.network):
            res.network = Primitive.to_proto(resource.network)
        if Primitive.to_proto(resource.subnetwork):
            res.subnetwork = Primitive.to_proto(resource.subnetwork)
        if Primitive.to_proto(resource.internal_ip_only):
            res.internal_ip_only = Primitive.to_proto(resource.internal_ip_only)
        if ClusterConfigGceClusterConfigPrivateIPv6GoogleAccessEnum.to_proto(
            resource.private_ipv6_google_access
        ):
            res.private_ipv6_google_access = (
                ClusterConfigGceClusterConfigPrivateIPv6GoogleAccessEnum.to_proto(
                    resource.private_ipv6_google_access
                )
            )
        if Primitive.to_proto(resource.service_account):
            res.service_account = Primitive.to_proto(resource.service_account)
        if Primitive.to_proto(resource.service_account_scopes):
            res.service_account_scopes.extend(
                Primitive.to_proto(resource.service_account_scopes)
            )
        if Primitive.to_proto(resource.tags):
            res.tags.extend(Primitive.to_proto(resource.tags))
        if Primitive.to_proto(resource.metadata):
            res.metadata = Primitive.to_proto(resource.metadata)
        if ClusterConfigGceClusterConfigReservationAffinity.to_proto(
            resource.reservation_affinity
        ):
            res.reservation_affinity.CopyFrom(
                ClusterConfigGceClusterConfigReservationAffinity.to_proto(
                    resource.reservation_affinity
                )
            )
        else:
            res.ClearField("reservation_affinity")
        if ClusterConfigGceClusterConfigNodeGroupAffinity.to_proto(
            resource.node_group_affinity
        ):
            res.node_group_affinity.CopyFrom(
                ClusterConfigGceClusterConfigNodeGroupAffinity.to_proto(
                    resource.node_group_affinity
                )
            )
        else:
            res.ClearField("node_group_affinity")
        if ClusterConfigGceClusterConfigShieldedInstanceConfig.to_proto(
            resource.shielded_instance_config
        ):
            res.shielded_instance_config.CopyFrom(
                ClusterConfigGceClusterConfigShieldedInstanceConfig.to_proto(
                    resource.shielded_instance_config
                )
            )
        else:
            res.ClearField("shielded_instance_config")
        if ClusterConfigGceClusterConfigConfidentialInstanceConfig.to_proto(
            resource.confidential_instance_config
        ):
            res.confidential_instance_config.CopyFrom(
                ClusterConfigGceClusterConfigConfidentialInstanceConfig.to_proto(
                    resource.confidential_instance_config
                )
            )
        else:
            res.ClearField("confidential_instance_config")
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterConfigGceClusterConfig(
            zone=Primitive.from_proto(resource.zone),
            network=Primitive.from_proto(resource.network),
            subnetwork=Primitive.from_proto(resource.subnetwork),
            internal_ip_only=Primitive.from_proto(resource.internal_ip_only),
            private_ipv6_google_access=ClusterConfigGceClusterConfigPrivateIPv6GoogleAccessEnum.from_proto(
                resource.private_ipv6_google_access
            ),
            service_account=Primitive.from_proto(resource.service_account),
            service_account_scopes=Primitive.from_proto(
                resource.service_account_scopes
            ),
            tags=Primitive.from_proto(resource.tags),
            metadata=Primitive.from_proto(resource.metadata),
            reservation_affinity=ClusterConfigGceClusterConfigReservationAffinity.from_proto(
                resource.reservation_affinity
            ),
            node_group_affinity=ClusterConfigGceClusterConfigNodeGroupAffinity.from_proto(
                resource.node_group_affinity
            ),
            shielded_instance_config=ClusterConfigGceClusterConfigShieldedInstanceConfig.from_proto(
                resource.shielded_instance_config
            ),
            confidential_instance_config=ClusterConfigGceClusterConfigConfidentialInstanceConfig.from_proto(
                resource.confidential_instance_config
            ),
        )


class ClusterConfigGceClusterConfigArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [ClusterConfigGceClusterConfig.to_proto(i) for i in resources]

    @classmethod
    def from_proto(self, resources):
        return [ClusterConfigGceClusterConfig.from_proto(i) for i in resources]


class ClusterConfigGceClusterConfigReservationAffinity(object):

    def __init__(
        self, consume_reservation_type: str = None, key: str = None, values: list = None
    ):
        self.consume_reservation_type = consume_reservation_type
        self.key = key
        self.values = values

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = cluster_pb2.DataprocClusterConfigGceClusterConfigReservationAffinity()
        if ClusterConfigGceClusterConfigReservationAffinityConsumeReservationTypeEnum.to_proto(
            resource.consume_reservation_type
        ):
            res.consume_reservation_type = ClusterConfigGceClusterConfigReservationAffinityConsumeReservationTypeEnum.to_proto(
                resource.consume_reservation_type
            )
        if Primitive.to_proto(resource.key):
            res.key = Primitive.to_proto(resource.key)
        if Primitive.to_proto(resource.values):
            res.values.extend(Primitive.to_proto(resource.values))
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterConfigGceClusterConfigReservationAffinity(
            consume_reservation_type=ClusterConfigGceClusterConfigReservationAffinityConsumeReservationTypeEnum.from_proto(
                resource.consume_reservation_type
            ),
            key=Primitive.from_proto(resource.key),
            values=Primitive.from_proto(resource.values),
        )


class ClusterConfigGceClusterConfigReservationAffinityArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [
            ClusterConfigGceClusterConfigReservationAffinity.to_proto(i)
            for i in resources
        ]

    @classmethod
    def from_proto(self, resources):
        return [
            ClusterConfigGceClusterConfigReservationAffinity.from_proto(i)
            for i in resources
        ]


class ClusterConfigGceClusterConfigNodeGroupAffinity(object):

    def __init__(self, node_group: str = None):
        self.node_group = node_group

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = cluster_pb2.DataprocClusterConfigGceClusterConfigNodeGroupAffinity()
        if Primitive.to_proto(resource.node_group):
            res.node_group = Primitive.to_proto(resource.node_group)
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterConfigGceClusterConfigNodeGroupAffinity(
            node_group=Primitive.from_proto(resource.node_group),
        )


class ClusterConfigGceClusterConfigNodeGroupAffinityArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [
            ClusterConfigGceClusterConfigNodeGroupAffinity.to_proto(i)
            for i in resources
        ]

    @classmethod
    def from_proto(self, resources):
        return [
            ClusterConfigGceClusterConfigNodeGroupAffinity.from_proto(i)
            for i in resources
        ]


class ClusterConfigGceClusterConfigShieldedInstanceConfig(object):

    def __init__(
        self,
        enable_secure_boot: bool = None,
        enable_vtpm: bool = None,
        enable_integrity_monitoring: bool = None,
    ):
        self.enable_secure_boot = enable_secure_boot
        self.enable_vtpm = enable_vtpm
        self.enable_integrity_monitoring = enable_integrity_monitoring

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = cluster_pb2.DataprocClusterConfigGceClusterConfigShieldedInstanceConfig()
        if Primitive.to_proto(resource.enable_secure_boot):
            res.enable_secure_boot = Primitive.to_proto(resource.enable_secure_boot)
        if Primitive.to_proto(resource.enable_vtpm):
            res.enable_vtpm = Primitive.to_proto(resource.enable_vtpm)
        if Primitive.to_proto(resource.enable_integrity_monitoring):
            res.enable_integrity_monitoring = Primitive.to_proto(
                resource.enable_integrity_monitoring
            )
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterConfigGceClusterConfigShieldedInstanceConfig(
            enable_secure_boot=Primitive.from_proto(resource.enable_secure_boot),
            enable_vtpm=Primitive.from_proto(resource.enable_vtpm),
            enable_integrity_monitoring=Primitive.from_proto(
                resource.enable_integrity_monitoring
            ),
        )


class ClusterConfigGceClusterConfigShieldedInstanceConfigArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [
            ClusterConfigGceClusterConfigShieldedInstanceConfig.to_proto(i)
            for i in resources
        ]

    @classmethod
    def from_proto(self, resources):
        return [
            ClusterConfigGceClusterConfigShieldedInstanceConfig.from_proto(i)
            for i in resources
        ]


class ClusterConfigGceClusterConfigConfidentialInstanceConfig(object):

    def __init__(self, enable_confidential_compute: bool = None):
        self.enable_confidential_compute = enable_confidential_compute

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = (
            cluster_pb2.DataprocClusterConfigGceClusterConfigConfidentialInstanceConfig()
        )
        if Primitive.to_proto(resource.enable_confidential_compute):
            res.enable_confidential_compute = Primitive.to_proto(
                resource.enable_confidential_compute
            )
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterConfigGceClusterConfigConfidentialInstanceConfig(
            enable_confidential_compute=Primitive.from_proto(
                resource.enable_confidential_compute
            ),
        )


class ClusterConfigGceClusterConfigConfidentialInstanceConfigArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [
            ClusterConfigGceClusterConfigConfidentialInstanceConfig.to_proto(i)
            for i in resources
        ]

    @classmethod
    def from_proto(self, resources):
        return [
            ClusterConfigGceClusterConfigConfidentialInstanceConfig.from_proto(i)
            for i in resources
        ]


class ClusterConfigMasterConfig(object):

    def __init__(
        self,
        num_instances: int = None,
        instance_names: list = None,
        image: str = None,
        machine_type: str = None,
        disk_config: dict = None,
        is_preemptible: bool = None,
        preemptibility: str = None,
        managed_group_config: dict = None,
        accelerators: list = None,
        min_cpu_platform: str = None,
        instance_references: list = None,
    ):
        self.num_instances = num_instances
        self.instance_names = instance_names
        self.image = image
        self.machine_type = machine_type
        self.disk_config = disk_config
        self.is_preemptible = is_preemptible
        self.preemptibility = preemptibility
        self.managed_group_config = managed_group_config
        self.accelerators = accelerators
        self.min_cpu_platform = min_cpu_platform
        self.instance_references = instance_references

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = cluster_pb2.DataprocClusterConfigMasterConfig()
        if Primitive.to_proto(resource.num_instances):
            res.num_instances = Primitive.to_proto(resource.num_instances)
        if Primitive.to_proto(resource.instance_names):
            res.instance_names.extend(Primitive.to_proto(resource.instance_names))
        if Primitive.to_proto(resource.image):
            res.image = Primitive.to_proto(resource.image)
        if Primitive.to_proto(resource.machine_type):
            res.machine_type = Primitive.to_proto(resource.machine_type)
        if ClusterConfigMasterConfigDiskConfig.to_proto(resource.disk_config):
            res.disk_config.CopyFrom(
                ClusterConfigMasterConfigDiskConfig.to_proto(resource.disk_config)
            )
        else:
            res.ClearField("disk_config")
        if Primitive.to_proto(resource.is_preemptible):
            res.is_preemptible = Primitive.to_proto(resource.is_preemptible)
        if ClusterConfigMasterConfigPreemptibilityEnum.to_proto(
            resource.preemptibility
        ):
            res.preemptibility = ClusterConfigMasterConfigPreemptibilityEnum.to_proto(
                resource.preemptibility
            )
        if ClusterConfigMasterConfigManagedGroupConfig.to_proto(
            resource.managed_group_config
        ):
            res.managed_group_config.CopyFrom(
                ClusterConfigMasterConfigManagedGroupConfig.to_proto(
                    resource.managed_group_config
                )
            )
        else:
            res.ClearField("managed_group_config")
        if ClusterConfigMasterConfigAcceleratorsArray.to_proto(resource.accelerators):
            res.accelerators.extend(
                ClusterConfigMasterConfigAcceleratorsArray.to_proto(
                    resource.accelerators
                )
            )
        if Primitive.to_proto(resource.min_cpu_platform):
            res.min_cpu_platform = Primitive.to_proto(resource.min_cpu_platform)
        if ClusterConfigMasterConfigInstanceReferencesArray.to_proto(
            resource.instance_references
        ):
            res.instance_references.extend(
                ClusterConfigMasterConfigInstanceReferencesArray.to_proto(
                    resource.instance_references
                )
            )
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterConfigMasterConfig(
            num_instances=Primitive.from_proto(resource.num_instances),
            instance_names=Primitive.from_proto(resource.instance_names),
            image=Primitive.from_proto(resource.image),
            machine_type=Primitive.from_proto(resource.machine_type),
            disk_config=ClusterConfigMasterConfigDiskConfig.from_proto(
                resource.disk_config
            ),
            is_preemptible=Primitive.from_proto(resource.is_preemptible),
            preemptibility=ClusterConfigMasterConfigPreemptibilityEnum.from_proto(
                resource.preemptibility
            ),
            managed_group_config=ClusterConfigMasterConfigManagedGroupConfig.from_proto(
                resource.managed_group_config
            ),
            accelerators=ClusterConfigMasterConfigAcceleratorsArray.from_proto(
                resource.accelerators
            ),
            min_cpu_platform=Primitive.from_proto(resource.min_cpu_platform),
            instance_references=ClusterConfigMasterConfigInstanceReferencesArray.from_proto(
                resource.instance_references
            ),
        )


class ClusterConfigMasterConfigArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [ClusterConfigMasterConfig.to_proto(i) for i in resources]

    @classmethod
    def from_proto(self, resources):
        return [ClusterConfigMasterConfig.from_proto(i) for i in resources]


class ClusterConfigMasterConfigDiskConfig(object):

    def __init__(
        self,
        boot_disk_type: str = None,
        boot_disk_size_gb: int = None,
        num_local_ssds: int = None,
        local_ssd_interface: str = None,
    ):
        self.boot_disk_type = boot_disk_type
        self.boot_disk_size_gb = boot_disk_size_gb
        self.num_local_ssds = num_local_ssds
        self.local_ssd_interface = local_ssd_interface

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = cluster_pb2.DataprocClusterConfigMasterConfigDiskConfig()
        if Primitive.to_proto(resource.boot_disk_type):
            res.boot_disk_type = Primitive.to_proto(resource.boot_disk_type)
        if Primitive.to_proto(resource.boot_disk_size_gb):
            res.boot_disk_size_gb = Primitive.to_proto(resource.boot_disk_size_gb)
        if Primitive.to_proto(resource.num_local_ssds):
            res.num_local_ssds = Primitive.to_proto(resource.num_local_ssds)
        if Primitive.to_proto(resource.local_ssd_interface):
            res.local_ssd_interface = Primitive.to_proto(resource.local_ssd_interface)
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterConfigMasterConfigDiskConfig(
            boot_disk_type=Primitive.from_proto(resource.boot_disk_type),
            boot_disk_size_gb=Primitive.from_proto(resource.boot_disk_size_gb),
            num_local_ssds=Primitive.from_proto(resource.num_local_ssds),
            local_ssd_interface=Primitive.from_proto(resource.local_ssd_interface),
        )


class ClusterConfigMasterConfigDiskConfigArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [ClusterConfigMasterConfigDiskConfig.to_proto(i) for i in resources]

    @classmethod
    def from_proto(self, resources):
        return [ClusterConfigMasterConfigDiskConfig.from_proto(i) for i in resources]


class ClusterConfigMasterConfigManagedGroupConfig(object):

    def __init__(
        self,
        instance_template_name: str = None,
        instance_group_manager_name: str = None,
    ):
        self.instance_template_name = instance_template_name
        self.instance_group_manager_name = instance_group_manager_name

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = cluster_pb2.DataprocClusterConfigMasterConfigManagedGroupConfig()
        if Primitive.to_proto(resource.instance_template_name):
            res.instance_template_name = Primitive.to_proto(
                resource.instance_template_name
            )
        if Primitive.to_proto(resource.instance_group_manager_name):
            res.instance_group_manager_name = Primitive.to_proto(
                resource.instance_group_manager_name
            )
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterConfigMasterConfigManagedGroupConfig(
            instance_template_name=Primitive.from_proto(
                resource.instance_template_name
            ),
            instance_group_manager_name=Primitive.from_proto(
                resource.instance_group_manager_name
            ),
        )


class ClusterConfigMasterConfigManagedGroupConfigArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [
            ClusterConfigMasterConfigManagedGroupConfig.to_proto(i) for i in resources
        ]

    @classmethod
    def from_proto(self, resources):
        return [
            ClusterConfigMasterConfigManagedGroupConfig.from_proto(i) for i in resources
        ]


class ClusterConfigMasterConfigAccelerators(object):

    def __init__(self, accelerator_type: str = None, accelerator_count: int = None):
        self.accelerator_type = accelerator_type
        self.accelerator_count = accelerator_count

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = cluster_pb2.DataprocClusterConfigMasterConfigAccelerators()
        if Primitive.to_proto(resource.accelerator_type):
            res.accelerator_type = Primitive.to_proto(resource.accelerator_type)
        if Primitive.to_proto(resource.accelerator_count):
            res.accelerator_count = Primitive.to_proto(resource.accelerator_count)
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterConfigMasterConfigAccelerators(
            accelerator_type=Primitive.from_proto(resource.accelerator_type),
            accelerator_count=Primitive.from_proto(resource.accelerator_count),
        )


class ClusterConfigMasterConfigAcceleratorsArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [ClusterConfigMasterConfigAccelerators.to_proto(i) for i in resources]

    @classmethod
    def from_proto(self, resources):
        return [ClusterConfigMasterConfigAccelerators.from_proto(i) for i in resources]


class ClusterConfigMasterConfigInstanceReferences(object):

    def __init__(
        self,
        instance_name: str = None,
        instance_id: str = None,
        public_key: str = None,
        public_ecies_key: str = None,
    ):
        self.instance_name = instance_name
        self.instance_id = instance_id
        self.public_key = public_key
        self.public_ecies_key = public_ecies_key

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = cluster_pb2.DataprocClusterConfigMasterConfigInstanceReferences()
        if Primitive.to_proto(resource.instance_name):
            res.instance_name = Primitive.to_proto(resource.instance_name)
        if Primitive.to_proto(resource.instance_id):
            res.instance_id = Primitive.to_proto(resource.instance_id)
        if Primitive.to_proto(resource.public_key):
            res.public_key = Primitive.to_proto(resource.public_key)
        if Primitive.to_proto(resource.public_ecies_key):
            res.public_ecies_key = Primitive.to_proto(resource.public_ecies_key)
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterConfigMasterConfigInstanceReferences(
            instance_name=Primitive.from_proto(resource.instance_name),
            instance_id=Primitive.from_proto(resource.instance_id),
            public_key=Primitive.from_proto(resource.public_key),
            public_ecies_key=Primitive.from_proto(resource.public_ecies_key),
        )


class ClusterConfigMasterConfigInstanceReferencesArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [
            ClusterConfigMasterConfigInstanceReferences.to_proto(i) for i in resources
        ]

    @classmethod
    def from_proto(self, resources):
        return [
            ClusterConfigMasterConfigInstanceReferences.from_proto(i) for i in resources
        ]


class ClusterConfigWorkerConfig(object):

    def __init__(
        self,
        num_instances: int = None,
        instance_names: list = None,
        image: str = None,
        machine_type: str = None,
        disk_config: dict = None,
        is_preemptible: bool = None,
        preemptibility: str = None,
        managed_group_config: dict = None,
        accelerators: list = None,
        min_cpu_platform: str = None,
        instance_references: list = None,
    ):
        self.num_instances = num_instances
        self.instance_names = instance_names
        self.image = image
        self.machine_type = machine_type
        self.disk_config = disk_config
        self.is_preemptible = is_preemptible
        self.preemptibility = preemptibility
        self.managed_group_config = managed_group_config
        self.accelerators = accelerators
        self.min_cpu_platform = min_cpu_platform
        self.instance_references = instance_references

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = cluster_pb2.DataprocClusterConfigWorkerConfig()
        if Primitive.to_proto(resource.num_instances):
            res.num_instances = Primitive.to_proto(resource.num_instances)
        if Primitive.to_proto(resource.instance_names):
            res.instance_names.extend(Primitive.to_proto(resource.instance_names))
        if Primitive.to_proto(resource.image):
            res.image = Primitive.to_proto(resource.image)
        if Primitive.to_proto(resource.machine_type):
            res.machine_type = Primitive.to_proto(resource.machine_type)
        if ClusterConfigWorkerConfigDiskConfig.to_proto(resource.disk_config):
            res.disk_config.CopyFrom(
                ClusterConfigWorkerConfigDiskConfig.to_proto(resource.disk_config)
            )
        else:
            res.ClearField("disk_config")
        if Primitive.to_proto(resource.is_preemptible):
            res.is_preemptible = Primitive.to_proto(resource.is_preemptible)
        if ClusterConfigWorkerConfigPreemptibilityEnum.to_proto(
            resource.preemptibility
        ):
            res.preemptibility = ClusterConfigWorkerConfigPreemptibilityEnum.to_proto(
                resource.preemptibility
            )
        if ClusterConfigWorkerConfigManagedGroupConfig.to_proto(
            resource.managed_group_config
        ):
            res.managed_group_config.CopyFrom(
                ClusterConfigWorkerConfigManagedGroupConfig.to_proto(
                    resource.managed_group_config
                )
            )
        else:
            res.ClearField("managed_group_config")
        if ClusterConfigWorkerConfigAcceleratorsArray.to_proto(resource.accelerators):
            res.accelerators.extend(
                ClusterConfigWorkerConfigAcceleratorsArray.to_proto(
                    resource.accelerators
                )
            )
        if Primitive.to_proto(resource.min_cpu_platform):
            res.min_cpu_platform = Primitive.to_proto(resource.min_cpu_platform)
        if ClusterConfigWorkerConfigInstanceReferencesArray.to_proto(
            resource.instance_references
        ):
            res.instance_references.extend(
                ClusterConfigWorkerConfigInstanceReferencesArray.to_proto(
                    resource.instance_references
                )
            )
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterConfigWorkerConfig(
            num_instances=Primitive.from_proto(resource.num_instances),
            instance_names=Primitive.from_proto(resource.instance_names),
            image=Primitive.from_proto(resource.image),
            machine_type=Primitive.from_proto(resource.machine_type),
            disk_config=ClusterConfigWorkerConfigDiskConfig.from_proto(
                resource.disk_config
            ),
            is_preemptible=Primitive.from_proto(resource.is_preemptible),
            preemptibility=ClusterConfigWorkerConfigPreemptibilityEnum.from_proto(
                resource.preemptibility
            ),
            managed_group_config=ClusterConfigWorkerConfigManagedGroupConfig.from_proto(
                resource.managed_group_config
            ),
            accelerators=ClusterConfigWorkerConfigAcceleratorsArray.from_proto(
                resource.accelerators
            ),
            min_cpu_platform=Primitive.from_proto(resource.min_cpu_platform),
            instance_references=ClusterConfigWorkerConfigInstanceReferencesArray.from_proto(
                resource.instance_references
            ),
        )


class ClusterConfigWorkerConfigArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [ClusterConfigWorkerConfig.to_proto(i) for i in resources]

    @classmethod
    def from_proto(self, resources):
        return [ClusterConfigWorkerConfig.from_proto(i) for i in resources]


class ClusterConfigWorkerConfigDiskConfig(object):

    def __init__(
        self,
        boot_disk_type: str = None,
        boot_disk_size_gb: int = None,
        num_local_ssds: int = None,
        local_ssd_interface: str = None,
    ):
        self.boot_disk_type = boot_disk_type
        self.boot_disk_size_gb = boot_disk_size_gb
        self.num_local_ssds = num_local_ssds
        self.local_ssd_interface = local_ssd_interface

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = cluster_pb2.DataprocClusterConfigWorkerConfigDiskConfig()
        if Primitive.to_proto(resource.boot_disk_type):
            res.boot_disk_type = Primitive.to_proto(resource.boot_disk_type)
        if Primitive.to_proto(resource.boot_disk_size_gb):
            res.boot_disk_size_gb = Primitive.to_proto(resource.boot_disk_size_gb)
        if Primitive.to_proto(resource.num_local_ssds):
            res.num_local_ssds = Primitive.to_proto(resource.num_local_ssds)
        if Primitive.to_proto(resource.local_ssd_interface):
            res.local_ssd_interface = Primitive.to_proto(resource.local_ssd_interface)
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterConfigWorkerConfigDiskConfig(
            boot_disk_type=Primitive.from_proto(resource.boot_disk_type),
            boot_disk_size_gb=Primitive.from_proto(resource.boot_disk_size_gb),
            num_local_ssds=Primitive.from_proto(resource.num_local_ssds),
            local_ssd_interface=Primitive.from_proto(resource.local_ssd_interface),
        )


class ClusterConfigWorkerConfigDiskConfigArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [ClusterConfigWorkerConfigDiskConfig.to_proto(i) for i in resources]

    @classmethod
    def from_proto(self, resources):
        return [ClusterConfigWorkerConfigDiskConfig.from_proto(i) for i in resources]


class ClusterConfigWorkerConfigManagedGroupConfig(object):

    def __init__(
        self,
        instance_template_name: str = None,
        instance_group_manager_name: str = None,
    ):
        self.instance_template_name = instance_template_name
        self.instance_group_manager_name = instance_group_manager_name

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = cluster_pb2.DataprocClusterConfigWorkerConfigManagedGroupConfig()
        if Primitive.to_proto(resource.instance_template_name):
            res.instance_template_name = Primitive.to_proto(
                resource.instance_template_name
            )
        if Primitive.to_proto(resource.instance_group_manager_name):
            res.instance_group_manager_name = Primitive.to_proto(
                resource.instance_group_manager_name
            )
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterConfigWorkerConfigManagedGroupConfig(
            instance_template_name=Primitive.from_proto(
                resource.instance_template_name
            ),
            instance_group_manager_name=Primitive.from_proto(
                resource.instance_group_manager_name
            ),
        )


class ClusterConfigWorkerConfigManagedGroupConfigArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [
            ClusterConfigWorkerConfigManagedGroupConfig.to_proto(i) for i in resources
        ]

    @classmethod
    def from_proto(self, resources):
        return [
            ClusterConfigWorkerConfigManagedGroupConfig.from_proto(i) for i in resources
        ]


class ClusterConfigWorkerConfigAccelerators(object):

    def __init__(self, accelerator_type: str = None, accelerator_count: int = None):
        self.accelerator_type = accelerator_type
        self.accelerator_count = accelerator_count

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = cluster_pb2.DataprocClusterConfigWorkerConfigAccelerators()
        if Primitive.to_proto(resource.accelerator_type):
            res.accelerator_type = Primitive.to_proto(resource.accelerator_type)
        if Primitive.to_proto(resource.accelerator_count):
            res.accelerator_count = Primitive.to_proto(resource.accelerator_count)
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterConfigWorkerConfigAccelerators(
            accelerator_type=Primitive.from_proto(resource.accelerator_type),
            accelerator_count=Primitive.from_proto(resource.accelerator_count),
        )


class ClusterConfigWorkerConfigAcceleratorsArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [ClusterConfigWorkerConfigAccelerators.to_proto(i) for i in resources]

    @classmethod
    def from_proto(self, resources):
        return [ClusterConfigWorkerConfigAccelerators.from_proto(i) for i in resources]


class ClusterConfigWorkerConfigInstanceReferences(object):

    def __init__(
        self,
        instance_name: str = None,
        instance_id: str = None,
        public_key: str = None,
        public_ecies_key: str = None,
    ):
        self.instance_name = instance_name
        self.instance_id = instance_id
        self.public_key = public_key
        self.public_ecies_key = public_ecies_key

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = cluster_pb2.DataprocClusterConfigWorkerConfigInstanceReferences()
        if Primitive.to_proto(resource.instance_name):
            res.instance_name = Primitive.to_proto(resource.instance_name)
        if Primitive.to_proto(resource.instance_id):
            res.instance_id = Primitive.to_proto(resource.instance_id)
        if Primitive.to_proto(resource.public_key):
            res.public_key = Primitive.to_proto(resource.public_key)
        if Primitive.to_proto(resource.public_ecies_key):
            res.public_ecies_key = Primitive.to_proto(resource.public_ecies_key)
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterConfigWorkerConfigInstanceReferences(
            instance_name=Primitive.from_proto(resource.instance_name),
            instance_id=Primitive.from_proto(resource.instance_id),
            public_key=Primitive.from_proto(resource.public_key),
            public_ecies_key=Primitive.from_proto(resource.public_ecies_key),
        )


class ClusterConfigWorkerConfigInstanceReferencesArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [
            ClusterConfigWorkerConfigInstanceReferences.to_proto(i) for i in resources
        ]

    @classmethod
    def from_proto(self, resources):
        return [
            ClusterConfigWorkerConfigInstanceReferences.from_proto(i) for i in resources
        ]


class ClusterConfigSecondaryWorkerConfig(object):

    def __init__(
        self,
        num_instances: int = None,
        instance_names: list = None,
        image: str = None,
        machine_type: str = None,
        disk_config: dict = None,
        is_preemptible: bool = None,
        preemptibility: str = None,
        managed_group_config: dict = None,
        accelerators: list = None,
        min_cpu_platform: str = None,
        instance_references: list = None,
    ):
        self.num_instances = num_instances
        self.instance_names = instance_names
        self.image = image
        self.machine_type = machine_type
        self.disk_config = disk_config
        self.is_preemptible = is_preemptible
        self.preemptibility = preemptibility
        self.managed_group_config = managed_group_config
        self.accelerators = accelerators
        self.min_cpu_platform = min_cpu_platform
        self.instance_references = instance_references

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = cluster_pb2.DataprocClusterConfigSecondaryWorkerConfig()
        if Primitive.to_proto(resource.num_instances):
            res.num_instances = Primitive.to_proto(resource.num_instances)
        if Primitive.to_proto(resource.instance_names):
            res.instance_names.extend(Primitive.to_proto(resource.instance_names))
        if Primitive.to_proto(resource.image):
            res.image = Primitive.to_proto(resource.image)
        if Primitive.to_proto(resource.machine_type):
            res.machine_type = Primitive.to_proto(resource.machine_type)
        if ClusterConfigSecondaryWorkerConfigDiskConfig.to_proto(resource.disk_config):
            res.disk_config.CopyFrom(
                ClusterConfigSecondaryWorkerConfigDiskConfig.to_proto(
                    resource.disk_config
                )
            )
        else:
            res.ClearField("disk_config")
        if Primitive.to_proto(resource.is_preemptible):
            res.is_preemptible = Primitive.to_proto(resource.is_preemptible)
        if ClusterConfigSecondaryWorkerConfigPreemptibilityEnum.to_proto(
            resource.preemptibility
        ):
            res.preemptibility = (
                ClusterConfigSecondaryWorkerConfigPreemptibilityEnum.to_proto(
                    resource.preemptibility
                )
            )
        if ClusterConfigSecondaryWorkerConfigManagedGroupConfig.to_proto(
            resource.managed_group_config
        ):
            res.managed_group_config.CopyFrom(
                ClusterConfigSecondaryWorkerConfigManagedGroupConfig.to_proto(
                    resource.managed_group_config
                )
            )
        else:
            res.ClearField("managed_group_config")
        if ClusterConfigSecondaryWorkerConfigAcceleratorsArray.to_proto(
            resource.accelerators
        ):
            res.accelerators.extend(
                ClusterConfigSecondaryWorkerConfigAcceleratorsArray.to_proto(
                    resource.accelerators
                )
            )
        if Primitive.to_proto(resource.min_cpu_platform):
            res.min_cpu_platform = Primitive.to_proto(resource.min_cpu_platform)
        if ClusterConfigSecondaryWorkerConfigInstanceReferencesArray.to_proto(
            resource.instance_references
        ):
            res.instance_references.extend(
                ClusterConfigSecondaryWorkerConfigInstanceReferencesArray.to_proto(
                    resource.instance_references
                )
            )
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterConfigSecondaryWorkerConfig(
            num_instances=Primitive.from_proto(resource.num_instances),
            instance_names=Primitive.from_proto(resource.instance_names),
            image=Primitive.from_proto(resource.image),
            machine_type=Primitive.from_proto(resource.machine_type),
            disk_config=ClusterConfigSecondaryWorkerConfigDiskConfig.from_proto(
                resource.disk_config
            ),
            is_preemptible=Primitive.from_proto(resource.is_preemptible),
            preemptibility=ClusterConfigSecondaryWorkerConfigPreemptibilityEnum.from_proto(
                resource.preemptibility
            ),
            managed_group_config=ClusterConfigSecondaryWorkerConfigManagedGroupConfig.from_proto(
                resource.managed_group_config
            ),
            accelerators=ClusterConfigSecondaryWorkerConfigAcceleratorsArray.from_proto(
                resource.accelerators
            ),
            min_cpu_platform=Primitive.from_proto(resource.min_cpu_platform),
            instance_references=ClusterConfigSecondaryWorkerConfigInstanceReferencesArray.from_proto(
                resource.instance_references
            ),
        )


class ClusterConfigSecondaryWorkerConfigArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [ClusterConfigSecondaryWorkerConfig.to_proto(i) for i in resources]

    @classmethod
    def from_proto(self, resources):
        return [ClusterConfigSecondaryWorkerConfig.from_proto(i) for i in resources]


class ClusterConfigSecondaryWorkerConfigDiskConfig(object):

    def __init__(
        self,
        boot_disk_type: str = None,
        boot_disk_size_gb: int = None,
        num_local_ssds: int = None,
        local_ssd_interface: str = None,
    ):
        self.boot_disk_type = boot_disk_type
        self.boot_disk_size_gb = boot_disk_size_gb
        self.num_local_ssds = num_local_ssds
        self.local_ssd_interface = local_ssd_interface

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = cluster_pb2.DataprocClusterConfigSecondaryWorkerConfigDiskConfig()
        if Primitive.to_proto(resource.boot_disk_type):
            res.boot_disk_type = Primitive.to_proto(resource.boot_disk_type)
        if Primitive.to_proto(resource.boot_disk_size_gb):
            res.boot_disk_size_gb = Primitive.to_proto(resource.boot_disk_size_gb)
        if Primitive.to_proto(resource.num_local_ssds):
            res.num_local_ssds = Primitive.to_proto(resource.num_local_ssds)
        if Primitive.to_proto(resource.local_ssd_interface):
            res.local_ssd_interface = Primitive.to_proto(resource.local_ssd_interface)
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterConfigSecondaryWorkerConfigDiskConfig(
            boot_disk_type=Primitive.from_proto(resource.boot_disk_type),
            boot_disk_size_gb=Primitive.from_proto(resource.boot_disk_size_gb),
            num_local_ssds=Primitive.from_proto(resource.num_local_ssds),
            local_ssd_interface=Primitive.from_proto(resource.local_ssd_interface),
        )


class ClusterConfigSecondaryWorkerConfigDiskConfigArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [
            ClusterConfigSecondaryWorkerConfigDiskConfig.to_proto(i) for i in resources
        ]

    @classmethod
    def from_proto(self, resources):
        return [
            ClusterConfigSecondaryWorkerConfigDiskConfig.from_proto(i)
            for i in resources
        ]


class ClusterConfigSecondaryWorkerConfigManagedGroupConfig(object):

    def __init__(
        self,
        instance_template_name: str = None,
        instance_group_manager_name: str = None,
    ):
        self.instance_template_name = instance_template_name
        self.instance_group_manager_name = instance_group_manager_name

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = cluster_pb2.DataprocClusterConfigSecondaryWorkerConfigManagedGroupConfig()
        if Primitive.to_proto(resource.instance_template_name):
            res.instance_template_name = Primitive.to_proto(
                resource.instance_template_name
            )
        if Primitive.to_proto(resource.instance_group_manager_name):
            res.instance_group_manager_name = Primitive.to_proto(
                resource.instance_group_manager_name
            )
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterConfigSecondaryWorkerConfigManagedGroupConfig(
            instance_template_name=Primitive.from_proto(
                resource.instance_template_name
            ),
            instance_group_manager_name=Primitive.from_proto(
                resource.instance_group_manager_name
            ),
        )


class ClusterConfigSecondaryWorkerConfigManagedGroupConfigArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [
            ClusterConfigSecondaryWorkerConfigManagedGroupConfig.to_proto(i)
            for i in resources
        ]

    @classmethod
    def from_proto(self, resources):
        return [
            ClusterConfigSecondaryWorkerConfigManagedGroupConfig.from_proto(i)
            for i in resources
        ]


class ClusterConfigSecondaryWorkerConfigAccelerators(object):

    def __init__(self, accelerator_type: str = None, accelerator_count: int = None):
        self.accelerator_type = accelerator_type
        self.accelerator_count = accelerator_count

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = cluster_pb2.DataprocClusterConfigSecondaryWorkerConfigAccelerators()
        if Primitive.to_proto(resource.accelerator_type):
            res.accelerator_type = Primitive.to_proto(resource.accelerator_type)
        if Primitive.to_proto(resource.accelerator_count):
            res.accelerator_count = Primitive.to_proto(resource.accelerator_count)
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterConfigSecondaryWorkerConfigAccelerators(
            accelerator_type=Primitive.from_proto(resource.accelerator_type),
            accelerator_count=Primitive.from_proto(resource.accelerator_count),
        )


class ClusterConfigSecondaryWorkerConfigAcceleratorsArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [
            ClusterConfigSecondaryWorkerConfigAccelerators.to_proto(i)
            for i in resources
        ]

    @classmethod
    def from_proto(self, resources):
        return [
            ClusterConfigSecondaryWorkerConfigAccelerators.from_proto(i)
            for i in resources
        ]


class ClusterConfigSecondaryWorkerConfigInstanceReferences(object):

    def __init__(
        self,
        instance_name: str = None,
        instance_id: str = None,
        public_key: str = None,
        public_ecies_key: str = None,
    ):
        self.instance_name = instance_name
        self.instance_id = instance_id
        self.public_key = public_key
        self.public_ecies_key = public_ecies_key

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = cluster_pb2.DataprocClusterConfigSecondaryWorkerConfigInstanceReferences()
        if Primitive.to_proto(resource.instance_name):
            res.instance_name = Primitive.to_proto(resource.instance_name)
        if Primitive.to_proto(resource.instance_id):
            res.instance_id = Primitive.to_proto(resource.instance_id)
        if Primitive.to_proto(resource.public_key):
            res.public_key = Primitive.to_proto(resource.public_key)
        if Primitive.to_proto(resource.public_ecies_key):
            res.public_ecies_key = Primitive.to_proto(resource.public_ecies_key)
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterConfigSecondaryWorkerConfigInstanceReferences(
            instance_name=Primitive.from_proto(resource.instance_name),
            instance_id=Primitive.from_proto(resource.instance_id),
            public_key=Primitive.from_proto(resource.public_key),
            public_ecies_key=Primitive.from_proto(resource.public_ecies_key),
        )


class ClusterConfigSecondaryWorkerConfigInstanceReferencesArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [
            ClusterConfigSecondaryWorkerConfigInstanceReferences.to_proto(i)
            for i in resources
        ]

    @classmethod
    def from_proto(self, resources):
        return [
            ClusterConfigSecondaryWorkerConfigInstanceReferences.from_proto(i)
            for i in resources
        ]


class ClusterConfigSoftwareConfig(object):

    def __init__(
        self,
        image_version: str = None,
        properties: dict = None,
        optional_components: list = None,
    ):
        self.image_version = image_version
        self.properties = properties
        self.optional_components = optional_components

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = cluster_pb2.DataprocClusterConfigSoftwareConfig()
        if Primitive.to_proto(resource.image_version):
            res.image_version = Primitive.to_proto(resource.image_version)
        if Primitive.to_proto(resource.properties):
            res.properties = Primitive.to_proto(resource.properties)
        if ClusterConfigSoftwareConfigOptionalComponentsEnumArray.to_proto(
            resource.optional_components
        ):
            res.optional_components.extend(
                ClusterConfigSoftwareConfigOptionalComponentsEnumArray.to_proto(
                    resource.optional_components
                )
            )
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterConfigSoftwareConfig(
            image_version=Primitive.from_proto(resource.image_version),
            properties=Primitive.from_proto(resource.properties),
            optional_components=ClusterConfigSoftwareConfigOptionalComponentsEnumArray.from_proto(
                resource.optional_components
            ),
        )


class ClusterConfigSoftwareConfigArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [ClusterConfigSoftwareConfig.to_proto(i) for i in resources]

    @classmethod
    def from_proto(self, resources):
        return [ClusterConfigSoftwareConfig.from_proto(i) for i in resources]


class ClusterConfigInitializationActions(object):

    def __init__(self, executable_file: str = None, execution_timeout: str = None):
        self.executable_file = executable_file
        self.execution_timeout = execution_timeout

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = cluster_pb2.DataprocClusterConfigInitializationActions()
        if Primitive.to_proto(resource.executable_file):
            res.executable_file = Primitive.to_proto(resource.executable_file)
        if Primitive.to_proto(resource.execution_timeout):
            res.execution_timeout = Primitive.to_proto(resource.execution_timeout)
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterConfigInitializationActions(
            executable_file=Primitive.from_proto(resource.executable_file),
            execution_timeout=Primitive.from_proto(resource.execution_timeout),
        )


class ClusterConfigInitializationActionsArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [ClusterConfigInitializationActions.to_proto(i) for i in resources]

    @classmethod
    def from_proto(self, resources):
        return [ClusterConfigInitializationActions.from_proto(i) for i in resources]


class ClusterConfigEncryptionConfig(object):

    def __init__(self, gce_pd_kms_key_name: str = None):
        self.gce_pd_kms_key_name = gce_pd_kms_key_name

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = cluster_pb2.DataprocClusterConfigEncryptionConfig()
        if Primitive.to_proto(resource.gce_pd_kms_key_name):
            res.gce_pd_kms_key_name = Primitive.to_proto(resource.gce_pd_kms_key_name)
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterConfigEncryptionConfig(
            gce_pd_kms_key_name=Primitive.from_proto(resource.gce_pd_kms_key_name),
        )


class ClusterConfigEncryptionConfigArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [ClusterConfigEncryptionConfig.to_proto(i) for i in resources]

    @classmethod
    def from_proto(self, resources):
        return [ClusterConfigEncryptionConfig.from_proto(i) for i in resources]


class ClusterConfigAutoscalingConfig(object):

    def __init__(self, policy: str = None):
        self.policy = policy

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = cluster_pb2.DataprocClusterConfigAutoscalingConfig()
        if Primitive.to_proto(resource.policy):
            res.policy = Primitive.to_proto(resource.policy)
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterConfigAutoscalingConfig(
            policy=Primitive.from_proto(resource.policy),
        )


class ClusterConfigAutoscalingConfigArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [ClusterConfigAutoscalingConfig.to_proto(i) for i in resources]

    @classmethod
    def from_proto(self, resources):
        return [ClusterConfigAutoscalingConfig.from_proto(i) for i in resources]


class ClusterConfigSecurityConfig(object):

    def __init__(self, kerberos_config: dict = None, identity_config: dict = None):
        self.kerberos_config = kerberos_config
        self.identity_config = identity_config

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = cluster_pb2.DataprocClusterConfigSecurityConfig()
        if ClusterConfigSecurityConfigKerberosConfig.to_proto(resource.kerberos_config):
            res.kerberos_config.CopyFrom(
                ClusterConfigSecurityConfigKerberosConfig.to_proto(
                    resource.kerberos_config
                )
            )
        else:
            res.ClearField("kerberos_config")
        if ClusterConfigSecurityConfigIdentityConfig.to_proto(resource.identity_config):
            res.identity_config.CopyFrom(
                ClusterConfigSecurityConfigIdentityConfig.to_proto(
                    resource.identity_config
                )
            )
        else:
            res.ClearField("identity_config")
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterConfigSecurityConfig(
            kerberos_config=ClusterConfigSecurityConfigKerberosConfig.from_proto(
                resource.kerberos_config
            ),
            identity_config=ClusterConfigSecurityConfigIdentityConfig.from_proto(
                resource.identity_config
            ),
        )


class ClusterConfigSecurityConfigArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [ClusterConfigSecurityConfig.to_proto(i) for i in resources]

    @classmethod
    def from_proto(self, resources):
        return [ClusterConfigSecurityConfig.from_proto(i) for i in resources]


class ClusterConfigSecurityConfigKerberosConfig(object):

    def __init__(
        self,
        enable_kerberos: bool = None,
        root_principal_password: str = None,
        kms_key: str = None,
        keystore: str = None,
        truststore: str = None,
        keystore_password: str = None,
        key_password: str = None,
        truststore_password: str = None,
        cross_realm_trust_realm: str = None,
        cross_realm_trust_kdc: str = None,
        cross_realm_trust_admin_server: str = None,
        cross_realm_trust_shared_password: str = None,
        kdc_db_key: str = None,
        tgt_lifetime_hours: int = None,
        realm: str = None,
    ):
        self.enable_kerberos = enable_kerberos
        self.root_principal_password = root_principal_password
        self.kms_key = kms_key
        self.keystore = keystore
        self.truststore = truststore
        self.keystore_password = keystore_password
        self.key_password = key_password
        self.truststore_password = truststore_password
        self.cross_realm_trust_realm = cross_realm_trust_realm
        self.cross_realm_trust_kdc = cross_realm_trust_kdc
        self.cross_realm_trust_admin_server = cross_realm_trust_admin_server
        self.cross_realm_trust_shared_password = cross_realm_trust_shared_password
        self.kdc_db_key = kdc_db_key
        self.tgt_lifetime_hours = tgt_lifetime_hours
        self.realm = realm

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = cluster_pb2.DataprocClusterConfigSecurityConfigKerberosConfig()
        if Primitive.to_proto(resource.enable_kerberos):
            res.enable_kerberos = Primitive.to_proto(resource.enable_kerberos)
        if Primitive.to_proto(resource.root_principal_password):
            res.root_principal_password = Primitive.to_proto(
                resource.root_principal_password
            )
        if Primitive.to_proto(resource.kms_key):
            res.kms_key = Primitive.to_proto(resource.kms_key)
        if Primitive.to_proto(resource.keystore):
            res.keystore = Primitive.to_proto(resource.keystore)
        if Primitive.to_proto(resource.truststore):
            res.truststore = Primitive.to_proto(resource.truststore)
        if Primitive.to_proto(resource.keystore_password):
            res.keystore_password = Primitive.to_proto(resource.keystore_password)
        if Primitive.to_proto(resource.key_password):
            res.key_password = Primitive.to_proto(resource.key_password)
        if Primitive.to_proto(resource.truststore_password):
            res.truststore_password = Primitive.to_proto(resource.truststore_password)
        if Primitive.to_proto(resource.cross_realm_trust_realm):
            res.cross_realm_trust_realm = Primitive.to_proto(
                resource.cross_realm_trust_realm
            )
        if Primitive.to_proto(resource.cross_realm_trust_kdc):
            res.cross_realm_trust_kdc = Primitive.to_proto(
                resource.cross_realm_trust_kdc
            )
        if Primitive.to_proto(resource.cross_realm_trust_admin_server):
            res.cross_realm_trust_admin_server = Primitive.to_proto(
                resource.cross_realm_trust_admin_server
            )
        if Primitive.to_proto(resource.cross_realm_trust_shared_password):
            res.cross_realm_trust_shared_password = Primitive.to_proto(
                resource.cross_realm_trust_shared_password
            )
        if Primitive.to_proto(resource.kdc_db_key):
            res.kdc_db_key = Primitive.to_proto(resource.kdc_db_key)
        if Primitive.to_proto(resource.tgt_lifetime_hours):
            res.tgt_lifetime_hours = Primitive.to_proto(resource.tgt_lifetime_hours)
        if Primitive.to_proto(resource.realm):
            res.realm = Primitive.to_proto(resource.realm)
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterConfigSecurityConfigKerberosConfig(
            enable_kerberos=Primitive.from_proto(resource.enable_kerberos),
            root_principal_password=Primitive.from_proto(
                resource.root_principal_password
            ),
            kms_key=Primitive.from_proto(resource.kms_key),
            keystore=Primitive.from_proto(resource.keystore),
            truststore=Primitive.from_proto(resource.truststore),
            keystore_password=Primitive.from_proto(resource.keystore_password),
            key_password=Primitive.from_proto(resource.key_password),
            truststore_password=Primitive.from_proto(resource.truststore_password),
            cross_realm_trust_realm=Primitive.from_proto(
                resource.cross_realm_trust_realm
            ),
            cross_realm_trust_kdc=Primitive.from_proto(resource.cross_realm_trust_kdc),
            cross_realm_trust_admin_server=Primitive.from_proto(
                resource.cross_realm_trust_admin_server
            ),
            cross_realm_trust_shared_password=Primitive.from_proto(
                resource.cross_realm_trust_shared_password
            ),
            kdc_db_key=Primitive.from_proto(resource.kdc_db_key),
            tgt_lifetime_hours=Primitive.from_proto(resource.tgt_lifetime_hours),
            realm=Primitive.from_proto(resource.realm),
        )


class ClusterConfigSecurityConfigKerberosConfigArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [
            ClusterConfigSecurityConfigKerberosConfig.to_proto(i) for i in resources
        ]

    @classmethod
    def from_proto(self, resources):
        return [
            ClusterConfigSecurityConfigKerberosConfig.from_proto(i) for i in resources
        ]


class ClusterConfigSecurityConfigIdentityConfig(object):

    def __init__(self, user_service_account_mapping: dict = None):
        self.user_service_account_mapping = user_service_account_mapping

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = cluster_pb2.DataprocClusterConfigSecurityConfigIdentityConfig()
        if Primitive.to_proto(resource.user_service_account_mapping):
            res.user_service_account_mapping = Primitive.to_proto(
                resource.user_service_account_mapping
            )
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterConfigSecurityConfigIdentityConfig(
            user_service_account_mapping=Primitive.from_proto(
                resource.user_service_account_mapping
            ),
        )


class ClusterConfigSecurityConfigIdentityConfigArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [
            ClusterConfigSecurityConfigIdentityConfig.to_proto(i) for i in resources
        ]

    @classmethod
    def from_proto(self, resources):
        return [
            ClusterConfigSecurityConfigIdentityConfig.from_proto(i) for i in resources
        ]


class ClusterConfigLifecycleConfig(object):

    def __init__(
        self,
        idle_delete_ttl: str = None,
        auto_delete_time: str = None,
        auto_delete_ttl: str = None,
        idle_start_time: str = None,
    ):
        self.idle_delete_ttl = idle_delete_ttl
        self.auto_delete_time = auto_delete_time
        self.auto_delete_ttl = auto_delete_ttl
        self.idle_start_time = idle_start_time

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = cluster_pb2.DataprocClusterConfigLifecycleConfig()
        if Primitive.to_proto(resource.idle_delete_ttl):
            res.idle_delete_ttl = Primitive.to_proto(resource.idle_delete_ttl)
        if Primitive.to_proto(resource.auto_delete_time):
            res.auto_delete_time = Primitive.to_proto(resource.auto_delete_time)
        if Primitive.to_proto(resource.auto_delete_ttl):
            res.auto_delete_ttl = Primitive.to_proto(resource.auto_delete_ttl)
        if Primitive.to_proto(resource.idle_start_time):
            res.idle_start_time = Primitive.to_proto(resource.idle_start_time)
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterConfigLifecycleConfig(
            idle_delete_ttl=Primitive.from_proto(resource.idle_delete_ttl),
            auto_delete_time=Primitive.from_proto(resource.auto_delete_time),
            auto_delete_ttl=Primitive.from_proto(resource.auto_delete_ttl),
            idle_start_time=Primitive.from_proto(resource.idle_start_time),
        )


class ClusterConfigLifecycleConfigArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [ClusterConfigLifecycleConfig.to_proto(i) for i in resources]

    @classmethod
    def from_proto(self, resources):
        return [ClusterConfigLifecycleConfig.from_proto(i) for i in resources]


class ClusterConfigEndpointConfig(object):

    def __init__(self, http_ports: dict = None, enable_http_port_access: bool = None):
        self.http_ports = http_ports
        self.enable_http_port_access = enable_http_port_access

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = cluster_pb2.DataprocClusterConfigEndpointConfig()
        if Primitive.to_proto(resource.http_ports):
            res.http_ports = Primitive.to_proto(resource.http_ports)
        if Primitive.to_proto(resource.enable_http_port_access):
            res.enable_http_port_access = Primitive.to_proto(
                resource.enable_http_port_access
            )
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterConfigEndpointConfig(
            http_ports=Primitive.from_proto(resource.http_ports),
            enable_http_port_access=Primitive.from_proto(
                resource.enable_http_port_access
            ),
        )


class ClusterConfigEndpointConfigArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [ClusterConfigEndpointConfig.to_proto(i) for i in resources]

    @classmethod
    def from_proto(self, resources):
        return [ClusterConfigEndpointConfig.from_proto(i) for i in resources]


class ClusterConfigMetastoreConfig(object):

    def __init__(self, dataproc_metastore_service: str = None):
        self.dataproc_metastore_service = dataproc_metastore_service

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = cluster_pb2.DataprocClusterConfigMetastoreConfig()
        if Primitive.to_proto(resource.dataproc_metastore_service):
            res.dataproc_metastore_service = Primitive.to_proto(
                resource.dataproc_metastore_service
            )
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterConfigMetastoreConfig(
            dataproc_metastore_service=Primitive.from_proto(
                resource.dataproc_metastore_service
            ),
        )


class ClusterConfigMetastoreConfigArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [ClusterConfigMetastoreConfig.to_proto(i) for i in resources]

    @classmethod
    def from_proto(self, resources):
        return [ClusterConfigMetastoreConfig.from_proto(i) for i in resources]


class ClusterConfigDataprocMetricConfig(object):

    def __init__(self, metrics: list = None):
        self.metrics = metrics

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = cluster_pb2.DataprocClusterConfigDataprocMetricConfig()
        if ClusterConfigDataprocMetricConfigMetricsArray.to_proto(resource.metrics):
            res.metrics.extend(
                ClusterConfigDataprocMetricConfigMetricsArray.to_proto(resource.metrics)
            )
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterConfigDataprocMetricConfig(
            metrics=ClusterConfigDataprocMetricConfigMetricsArray.from_proto(
                resource.metrics
            ),
        )


class ClusterConfigDataprocMetricConfigArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [ClusterConfigDataprocMetricConfig.to_proto(i) for i in resources]

    @classmethod
    def from_proto(self, resources):
        return [ClusterConfigDataprocMetricConfig.from_proto(i) for i in resources]


class ClusterConfigDataprocMetricConfigMetrics(object):

    def __init__(self, metric_source: str = None, metric_overrides: list = None):
        self.metric_source = metric_source
        self.metric_overrides = metric_overrides

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = cluster_pb2.DataprocClusterConfigDataprocMetricConfigMetrics()
        if ClusterConfigDataprocMetricConfigMetricsMetricSourceEnum.to_proto(
            resource.metric_source
        ):
            res.metric_source = (
                ClusterConfigDataprocMetricConfigMetricsMetricSourceEnum.to_proto(
                    resource.metric_source
                )
            )
        if Primitive.to_proto(resource.metric_overrides):
            res.metric_overrides.extend(Primitive.to_proto(resource.metric_overrides))
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterConfigDataprocMetricConfigMetrics(
            metric_source=ClusterConfigDataprocMetricConfigMetricsMetricSourceEnum.from_proto(
                resource.metric_source
            ),
            metric_overrides=Primitive.from_proto(resource.metric_overrides),
        )


class ClusterConfigDataprocMetricConfigMetricsArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [ClusterConfigDataprocMetricConfigMetrics.to_proto(i) for i in resources]

    @classmethod
    def from_proto(self, resources):
        return [
            ClusterConfigDataprocMetricConfigMetrics.from_proto(i) for i in resources
        ]


class ClusterStatus(object):

    def __init__(
        self,
        state: str = None,
        detail: str = None,
        state_start_time: str = None,
        substate: str = None,
    ):
        self.state = state
        self.detail = detail
        self.state_start_time = state_start_time
        self.substate = substate

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = cluster_pb2.DataprocClusterStatus()
        if ClusterStatusStateEnum.to_proto(resource.state):
            res.state = ClusterStatusStateEnum.to_proto(resource.state)
        if Primitive.to_proto(resource.detail):
            res.detail = Primitive.to_proto(resource.detail)
        if Primitive.to_proto(resource.state_start_time):
            res.state_start_time = Primitive.to_proto(resource.state_start_time)
        if ClusterStatusSubstateEnum.to_proto(resource.substate):
            res.substate = ClusterStatusSubstateEnum.to_proto(resource.substate)
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterStatus(
            state=ClusterStatusStateEnum.from_proto(resource.state),
            detail=Primitive.from_proto(resource.detail),
            state_start_time=Primitive.from_proto(resource.state_start_time),
            substate=ClusterStatusSubstateEnum.from_proto(resource.substate),
        )


class ClusterStatusArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [ClusterStatus.to_proto(i) for i in resources]

    @classmethod
    def from_proto(self, resources):
        return [ClusterStatus.from_proto(i) for i in resources]


class ClusterStatusHistory(object):

    def __init__(
        self,
        state: str = None,
        detail: str = None,
        state_start_time: str = None,
        substate: str = None,
    ):
        self.state = state
        self.detail = detail
        self.state_start_time = state_start_time
        self.substate = substate

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = cluster_pb2.DataprocClusterStatusHistory()
        if ClusterStatusHistoryStateEnum.to_proto(resource.state):
            res.state = ClusterStatusHistoryStateEnum.to_proto(resource.state)
        if Primitive.to_proto(resource.detail):
            res.detail = Primitive.to_proto(resource.detail)
        if Primitive.to_proto(resource.state_start_time):
            res.state_start_time = Primitive.to_proto(resource.state_start_time)
        if ClusterStatusHistorySubstateEnum.to_proto(resource.substate):
            res.substate = ClusterStatusHistorySubstateEnum.to_proto(resource.substate)
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterStatusHistory(
            state=ClusterStatusHistoryStateEnum.from_proto(resource.state),
            detail=Primitive.from_proto(resource.detail),
            state_start_time=Primitive.from_proto(resource.state_start_time),
            substate=ClusterStatusHistorySubstateEnum.from_proto(resource.substate),
        )


class ClusterStatusHistoryArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [ClusterStatusHistory.to_proto(i) for i in resources]

    @classmethod
    def from_proto(self, resources):
        return [ClusterStatusHistory.from_proto(i) for i in resources]


class ClusterMetrics(object):

    def __init__(self, hdfs_metrics: dict = None, yarn_metrics: dict = None):
        self.hdfs_metrics = hdfs_metrics
        self.yarn_metrics = yarn_metrics

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = cluster_pb2.DataprocClusterMetrics()
        if Primitive.to_proto(resource.hdfs_metrics):
            res.hdfs_metrics = Primitive.to_proto(resource.hdfs_metrics)
        if Primitive.to_proto(resource.yarn_metrics):
            res.yarn_metrics = Primitive.to_proto(resource.yarn_metrics)
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterMetrics(
            hdfs_metrics=Primitive.from_proto(resource.hdfs_metrics),
            yarn_metrics=Primitive.from_proto(resource.yarn_metrics),
        )


class ClusterMetricsArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [ClusterMetrics.to_proto(i) for i in resources]

    @classmethod
    def from_proto(self, resources):
        return [ClusterMetrics.from_proto(i) for i in resources]


class ClusterVirtualClusterConfig(object):

    def __init__(
        self,
        staging_bucket: str = None,
        kubernetes_cluster_config: dict = None,
        auxiliary_services_config: dict = None,
    ):
        self.staging_bucket = staging_bucket
        self.kubernetes_cluster_config = kubernetes_cluster_config
        self.auxiliary_services_config = auxiliary_services_config

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = cluster_pb2.DataprocClusterVirtualClusterConfig()
        if Primitive.to_proto(resource.staging_bucket):
            res.staging_bucket = Primitive.to_proto(resource.staging_bucket)
        if ClusterVirtualClusterConfigKubernetesClusterConfig.to_proto(
            resource.kubernetes_cluster_config
        ):
            res.kubernetes_cluster_config.CopyFrom(
                ClusterVirtualClusterConfigKubernetesClusterConfig.to_proto(
                    resource.kubernetes_cluster_config
                )
            )
        else:
            res.ClearField("kubernetes_cluster_config")
        if ClusterVirtualClusterConfigAuxiliaryServicesConfig.to_proto(
            resource.auxiliary_services_config
        ):
            res.auxiliary_services_config.CopyFrom(
                ClusterVirtualClusterConfigAuxiliaryServicesConfig.to_proto(
                    resource.auxiliary_services_config
                )
            )
        else:
            res.ClearField("auxiliary_services_config")
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterVirtualClusterConfig(
            staging_bucket=Primitive.from_proto(resource.staging_bucket),
            kubernetes_cluster_config=ClusterVirtualClusterConfigKubernetesClusterConfig.from_proto(
                resource.kubernetes_cluster_config
            ),
            auxiliary_services_config=ClusterVirtualClusterConfigAuxiliaryServicesConfig.from_proto(
                resource.auxiliary_services_config
            ),
        )


class ClusterVirtualClusterConfigArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [ClusterVirtualClusterConfig.to_proto(i) for i in resources]

    @classmethod
    def from_proto(self, resources):
        return [ClusterVirtualClusterConfig.from_proto(i) for i in resources]


class ClusterVirtualClusterConfigKubernetesClusterConfig(object):

    def __init__(
        self,
        kubernetes_namespace: str = None,
        gke_cluster_config: dict = None,
        kubernetes_software_config: dict = None,
    ):
        self.kubernetes_namespace = kubernetes_namespace
        self.gke_cluster_config = gke_cluster_config
        self.kubernetes_software_config = kubernetes_software_config

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = cluster_pb2.DataprocClusterVirtualClusterConfigKubernetesClusterConfig()
        if Primitive.to_proto(resource.kubernetes_namespace):
            res.kubernetes_namespace = Primitive.to_proto(resource.kubernetes_namespace)
        if ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfig.to_proto(
            resource.gke_cluster_config
        ):
            res.gke_cluster_config.CopyFrom(
                ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfig.to_proto(
                    resource.gke_cluster_config
                )
            )
        else:
            res.ClearField("gke_cluster_config")
        if ClusterVirtualClusterConfigKubernetesClusterConfigKubernetesSoftwareConfig.to_proto(
            resource.kubernetes_software_config
        ):
            res.kubernetes_software_config.CopyFrom(
                ClusterVirtualClusterConfigKubernetesClusterConfigKubernetesSoftwareConfig.to_proto(
                    resource.kubernetes_software_config
                )
            )
        else:
            res.ClearField("kubernetes_software_config")
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterVirtualClusterConfigKubernetesClusterConfig(
            kubernetes_namespace=Primitive.from_proto(resource.kubernetes_namespace),
            gke_cluster_config=ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfig.from_proto(
                resource.gke_cluster_config
            ),
            kubernetes_software_config=ClusterVirtualClusterConfigKubernetesClusterConfigKubernetesSoftwareConfig.from_proto(
                resource.kubernetes_software_config
            ),
        )


class ClusterVirtualClusterConfigKubernetesClusterConfigArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [
            ClusterVirtualClusterConfigKubernetesClusterConfig.to_proto(i)
            for i in resources
        ]

    @classmethod
    def from_proto(self, resources):
        return [
            ClusterVirtualClusterConfigKubernetesClusterConfig.from_proto(i)
            for i in resources
        ]


class ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfig(object):

    def __init__(self, gke_cluster_target: str = None, node_pool_target: list = None):
        self.gke_cluster_target = gke_cluster_target
        self.node_pool_target = node_pool_target

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = (
            cluster_pb2.DataprocClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfig()
        )
        if Primitive.to_proto(resource.gke_cluster_target):
            res.gke_cluster_target = Primitive.to_proto(resource.gke_cluster_target)
        if ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetArray.to_proto(
            resource.node_pool_target
        ):
            res.node_pool_target.extend(
                ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetArray.to_proto(
                    resource.node_pool_target
                )
            )
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfig(
            gke_cluster_target=Primitive.from_proto(resource.gke_cluster_target),
            node_pool_target=ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetArray.from_proto(
                resource.node_pool_target
            ),
        )


class ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [
            ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfig.to_proto(
                i
            )
            for i in resources
        ]

    @classmethod
    def from_proto(self, resources):
        return [
            ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfig.from_proto(
                i
            )
            for i in resources
        ]


class ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTarget(
    object
):

    def __init__(
        self, node_pool: str = None, roles: list = None, node_pool_config: dict = None
    ):
        self.node_pool = node_pool
        self.roles = roles
        self.node_pool_config = node_pool_config

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = (
            cluster_pb2.DataprocClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTarget()
        )
        if Primitive.to_proto(resource.node_pool):
            res.node_pool = Primitive.to_proto(resource.node_pool)
        if ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetRolesEnumArray.to_proto(
            resource.roles
        ):
            res.roles.extend(
                ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetRolesEnumArray.to_proto(
                    resource.roles
                )
            )
        if ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfig.to_proto(
            resource.node_pool_config
        ):
            res.node_pool_config.CopyFrom(
                ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfig.to_proto(
                    resource.node_pool_config
                )
            )
        else:
            res.ClearField("node_pool_config")
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTarget(
            node_pool=Primitive.from_proto(resource.node_pool),
            roles=ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetRolesEnumArray.from_proto(
                resource.roles
            ),
            node_pool_config=ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfig.from_proto(
                resource.node_pool_config
            ),
        )


class ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetArray(
    object
):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [
            ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTarget.to_proto(
                i
            )
            for i in resources
        ]

    @classmethod
    def from_proto(self, resources):
        return [
            ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTarget.from_proto(
                i
            )
            for i in resources
        ]


class ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfig(
    object
):

    def __init__(
        self, config: dict = None, locations: list = None, autoscaling: dict = None
    ):
        self.config = config
        self.locations = locations
        self.autoscaling = autoscaling

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = (
            cluster_pb2.DataprocClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfig()
        )
        if ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfigConfig.to_proto(
            resource.config
        ):
            res.config.CopyFrom(
                ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfigConfig.to_proto(
                    resource.config
                )
            )
        else:
            res.ClearField("config")
        if Primitive.to_proto(resource.locations):
            res.locations.extend(Primitive.to_proto(resource.locations))
        if ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfigAutoscaling.to_proto(
            resource.autoscaling
        ):
            res.autoscaling.CopyFrom(
                ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfigAutoscaling.to_proto(
                    resource.autoscaling
                )
            )
        else:
            res.ClearField("autoscaling")
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfig(
            config=ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfigConfig.from_proto(
                resource.config
            ),
            locations=Primitive.from_proto(resource.locations),
            autoscaling=ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfigAutoscaling.from_proto(
                resource.autoscaling
            ),
        )


class ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfigArray(
    object
):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [
            ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfig.to_proto(
                i
            )
            for i in resources
        ]

    @classmethod
    def from_proto(self, resources):
        return [
            ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfig.from_proto(
                i
            )
            for i in resources
        ]


class ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfigConfig(
    object
):

    def __init__(
        self,
        machine_type: str = None,
        local_ssd_count: int = None,
        preemptible: bool = None,
        accelerators: list = None,
        min_cpu_platform: str = None,
        boot_disk_kms_key: str = None,
        ephemeral_storage_config: dict = None,
        spot: bool = None,
    ):
        self.machine_type = machine_type
        self.local_ssd_count = local_ssd_count
        self.preemptible = preemptible
        self.accelerators = accelerators
        self.min_cpu_platform = min_cpu_platform
        self.boot_disk_kms_key = boot_disk_kms_key
        self.ephemeral_storage_config = ephemeral_storage_config
        self.spot = spot

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = (
            cluster_pb2.DataprocClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfigConfig()
        )
        if Primitive.to_proto(resource.machine_type):
            res.machine_type = Primitive.to_proto(resource.machine_type)
        if Primitive.to_proto(resource.local_ssd_count):
            res.local_ssd_count = Primitive.to_proto(resource.local_ssd_count)
        if Primitive.to_proto(resource.preemptible):
            res.preemptible = Primitive.to_proto(resource.preemptible)
        if ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfigConfigAcceleratorsArray.to_proto(
            resource.accelerators
        ):
            res.accelerators.extend(
                ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfigConfigAcceleratorsArray.to_proto(
                    resource.accelerators
                )
            )
        if Primitive.to_proto(resource.min_cpu_platform):
            res.min_cpu_platform = Primitive.to_proto(resource.min_cpu_platform)
        if Primitive.to_proto(resource.boot_disk_kms_key):
            res.boot_disk_kms_key = Primitive.to_proto(resource.boot_disk_kms_key)
        if ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfigConfigEphemeralStorageConfig.to_proto(
            resource.ephemeral_storage_config
        ):
            res.ephemeral_storage_config.CopyFrom(
                ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfigConfigEphemeralStorageConfig.to_proto(
                    resource.ephemeral_storage_config
                )
            )
        else:
            res.ClearField("ephemeral_storage_config")
        if Primitive.to_proto(resource.spot):
            res.spot = Primitive.to_proto(resource.spot)
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfigConfig(
            machine_type=Primitive.from_proto(resource.machine_type),
            local_ssd_count=Primitive.from_proto(resource.local_ssd_count),
            preemptible=Primitive.from_proto(resource.preemptible),
            accelerators=ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfigConfigAcceleratorsArray.from_proto(
                resource.accelerators
            ),
            min_cpu_platform=Primitive.from_proto(resource.min_cpu_platform),
            boot_disk_kms_key=Primitive.from_proto(resource.boot_disk_kms_key),
            ephemeral_storage_config=ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfigConfigEphemeralStorageConfig.from_proto(
                resource.ephemeral_storage_config
            ),
            spot=Primitive.from_proto(resource.spot),
        )


class ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfigConfigArray(
    object
):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [
            ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfigConfig.to_proto(
                i
            )
            for i in resources
        ]

    @classmethod
    def from_proto(self, resources):
        return [
            ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfigConfig.from_proto(
                i
            )
            for i in resources
        ]


class ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfigConfigAccelerators(
    object
):

    def __init__(
        self,
        accelerator_count: int = None,
        accelerator_type: str = None,
        gpu_partition_size: str = None,
    ):
        self.accelerator_count = accelerator_count
        self.accelerator_type = accelerator_type
        self.gpu_partition_size = gpu_partition_size

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = (
            cluster_pb2.DataprocClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfigConfigAccelerators()
        )
        if Primitive.to_proto(resource.accelerator_count):
            res.accelerator_count = Primitive.to_proto(resource.accelerator_count)
        if Primitive.to_proto(resource.accelerator_type):
            res.accelerator_type = Primitive.to_proto(resource.accelerator_type)
        if Primitive.to_proto(resource.gpu_partition_size):
            res.gpu_partition_size = Primitive.to_proto(resource.gpu_partition_size)
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfigConfigAccelerators(
            accelerator_count=Primitive.from_proto(resource.accelerator_count),
            accelerator_type=Primitive.from_proto(resource.accelerator_type),
            gpu_partition_size=Primitive.from_proto(resource.gpu_partition_size),
        )


class ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfigConfigAcceleratorsArray(
    object
):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [
            ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfigConfigAccelerators.to_proto(
                i
            )
            for i in resources
        ]

    @classmethod
    def from_proto(self, resources):
        return [
            ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfigConfigAccelerators.from_proto(
                i
            )
            for i in resources
        ]


class ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfigConfigEphemeralStorageConfig(
    object
):

    def __init__(self, local_ssd_count: int = None):
        self.local_ssd_count = local_ssd_count

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = (
            cluster_pb2.DataprocClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfigConfigEphemeralStorageConfig()
        )
        if Primitive.to_proto(resource.local_ssd_count):
            res.local_ssd_count = Primitive.to_proto(resource.local_ssd_count)
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfigConfigEphemeralStorageConfig(
            local_ssd_count=Primitive.from_proto(resource.local_ssd_count),
        )


class ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfigConfigEphemeralStorageConfigArray(
    object
):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [
            ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfigConfigEphemeralStorageConfig.to_proto(
                i
            )
            for i in resources
        ]

    @classmethod
    def from_proto(self, resources):
        return [
            ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfigConfigEphemeralStorageConfig.from_proto(
                i
            )
            for i in resources
        ]


class ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfigAutoscaling(
    object
):

    def __init__(self, min_node_count: int = None, max_node_count: int = None):
        self.min_node_count = min_node_count
        self.max_node_count = max_node_count

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = (
            cluster_pb2.DataprocClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfigAutoscaling()
        )
        if Primitive.to_proto(resource.min_node_count):
            res.min_node_count = Primitive.to_proto(resource.min_node_count)
        if Primitive.to_proto(resource.max_node_count):
            res.max_node_count = Primitive.to_proto(resource.max_node_count)
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfigAutoscaling(
            min_node_count=Primitive.from_proto(resource.min_node_count),
            max_node_count=Primitive.from_proto(resource.max_node_count),
        )


class ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfigAutoscalingArray(
    object
):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [
            ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfigAutoscaling.to_proto(
                i
            )
            for i in resources
        ]

    @classmethod
    def from_proto(self, resources):
        return [
            ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetNodePoolConfigAutoscaling.from_proto(
                i
            )
            for i in resources
        ]


class ClusterVirtualClusterConfigKubernetesClusterConfigKubernetesSoftwareConfig(
    object
):

    def __init__(self, component_version: dict = None, properties: dict = None):
        self.component_version = component_version
        self.properties = properties

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = (
            cluster_pb2.DataprocClusterVirtualClusterConfigKubernetesClusterConfigKubernetesSoftwareConfig()
        )
        if Primitive.to_proto(resource.component_version):
            res.component_version = Primitive.to_proto(resource.component_version)
        if Primitive.to_proto(resource.properties):
            res.properties = Primitive.to_proto(resource.properties)
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return (
            ClusterVirtualClusterConfigKubernetesClusterConfigKubernetesSoftwareConfig(
                component_version=Primitive.from_proto(resource.component_version),
                properties=Primitive.from_proto(resource.properties),
            )
        )


class ClusterVirtualClusterConfigKubernetesClusterConfigKubernetesSoftwareConfigArray(
    object
):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [
            ClusterVirtualClusterConfigKubernetesClusterConfigKubernetesSoftwareConfig.to_proto(
                i
            )
            for i in resources
        ]

    @classmethod
    def from_proto(self, resources):
        return [
            ClusterVirtualClusterConfigKubernetesClusterConfigKubernetesSoftwareConfig.from_proto(
                i
            )
            for i in resources
        ]


class ClusterVirtualClusterConfigAuxiliaryServicesConfig(object):

    def __init__(
        self, metastore_config: dict = None, spark_history_server_config: dict = None
    ):
        self.metastore_config = metastore_config
        self.spark_history_server_config = spark_history_server_config

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = cluster_pb2.DataprocClusterVirtualClusterConfigAuxiliaryServicesConfig()
        if ClusterVirtualClusterConfigAuxiliaryServicesConfigMetastoreConfig.to_proto(
            resource.metastore_config
        ):
            res.metastore_config.CopyFrom(
                ClusterVirtualClusterConfigAuxiliaryServicesConfigMetastoreConfig.to_proto(
                    resource.metastore_config
                )
            )
        else:
            res.ClearField("metastore_config")
        if ClusterVirtualClusterConfigAuxiliaryServicesConfigSparkHistoryServerConfig.to_proto(
            resource.spark_history_server_config
        ):
            res.spark_history_server_config.CopyFrom(
                ClusterVirtualClusterConfigAuxiliaryServicesConfigSparkHistoryServerConfig.to_proto(
                    resource.spark_history_server_config
                )
            )
        else:
            res.ClearField("spark_history_server_config")
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterVirtualClusterConfigAuxiliaryServicesConfig(
            metastore_config=ClusterVirtualClusterConfigAuxiliaryServicesConfigMetastoreConfig.from_proto(
                resource.metastore_config
            ),
            spark_history_server_config=ClusterVirtualClusterConfigAuxiliaryServicesConfigSparkHistoryServerConfig.from_proto(
                resource.spark_history_server_config
            ),
        )


class ClusterVirtualClusterConfigAuxiliaryServicesConfigArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [
            ClusterVirtualClusterConfigAuxiliaryServicesConfig.to_proto(i)
            for i in resources
        ]

    @classmethod
    def from_proto(self, resources):
        return [
            ClusterVirtualClusterConfigAuxiliaryServicesConfig.from_proto(i)
            for i in resources
        ]


class ClusterVirtualClusterConfigAuxiliaryServicesConfigMetastoreConfig(object):

    def __init__(self, dataproc_metastore_service: str = None):
        self.dataproc_metastore_service = dataproc_metastore_service

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = (
            cluster_pb2.DataprocClusterVirtualClusterConfigAuxiliaryServicesConfigMetastoreConfig()
        )
        if Primitive.to_proto(resource.dataproc_metastore_service):
            res.dataproc_metastore_service = Primitive.to_proto(
                resource.dataproc_metastore_service
            )
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return ClusterVirtualClusterConfigAuxiliaryServicesConfigMetastoreConfig(
            dataproc_metastore_service=Primitive.from_proto(
                resource.dataproc_metastore_service
            ),
        )


class ClusterVirtualClusterConfigAuxiliaryServicesConfigMetastoreConfigArray(object):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [
            ClusterVirtualClusterConfigAuxiliaryServicesConfigMetastoreConfig.to_proto(
                i
            )
            for i in resources
        ]

    @classmethod
    def from_proto(self, resources):
        return [
            ClusterVirtualClusterConfigAuxiliaryServicesConfigMetastoreConfig.from_proto(
                i
            )
            for i in resources
        ]


class ClusterVirtualClusterConfigAuxiliaryServicesConfigSparkHistoryServerConfig(
    object
):

    def __init__(self, dataproc_cluster: str = None):
        self.dataproc_cluster = dataproc_cluster

    @classmethod
    def to_proto(self, resource):
        if not resource:
            return None

        res = (
            cluster_pb2.DataprocClusterVirtualClusterConfigAuxiliaryServicesConfigSparkHistoryServerConfig()
        )
        if Primitive.to_proto(resource.dataproc_cluster):
            res.dataproc_cluster = Primitive.to_proto(resource.dataproc_cluster)
        return res

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return None

        return (
            ClusterVirtualClusterConfigAuxiliaryServicesConfigSparkHistoryServerConfig(
                dataproc_cluster=Primitive.from_proto(resource.dataproc_cluster),
            )
        )


class ClusterVirtualClusterConfigAuxiliaryServicesConfigSparkHistoryServerConfigArray(
    object
):
    @classmethod
    def to_proto(self, resources):
        if not resources:
            return resources
        return [
            ClusterVirtualClusterConfigAuxiliaryServicesConfigSparkHistoryServerConfig.to_proto(
                i
            )
            for i in resources
        ]

    @classmethod
    def from_proto(self, resources):
        return [
            ClusterVirtualClusterConfigAuxiliaryServicesConfigSparkHistoryServerConfig.from_proto(
                i
            )
            for i in resources
        ]


class ClusterConfigGceClusterConfigPrivateIPv6GoogleAccessEnum(object):
    @classmethod
    def to_proto(self, resource):
        if not resource:
            return resource
        return cluster_pb2.DataprocClusterConfigGceClusterConfigPrivateIPv6GoogleAccessEnum.Value(
            "DataprocClusterConfigGceClusterConfigPrivateIPv6GoogleAccessEnum%s"
            % resource
        )

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return resource
        return cluster_pb2.DataprocClusterConfigGceClusterConfigPrivateIPv6GoogleAccessEnum.Name(
            resource
        )[
            len("DataprocClusterConfigGceClusterConfigPrivateIPv6GoogleAccessEnum") :
        ]


class ClusterConfigGceClusterConfigReservationAffinityConsumeReservationTypeEnum(
    object
):
    @classmethod
    def to_proto(self, resource):
        if not resource:
            return resource
        return cluster_pb2.DataprocClusterConfigGceClusterConfigReservationAffinityConsumeReservationTypeEnum.Value(
            "DataprocClusterConfigGceClusterConfigReservationAffinityConsumeReservationTypeEnum%s"
            % resource
        )

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return resource
        return cluster_pb2.DataprocClusterConfigGceClusterConfigReservationAffinityConsumeReservationTypeEnum.Name(
            resource
        )[
            len(
                "DataprocClusterConfigGceClusterConfigReservationAffinityConsumeReservationTypeEnum"
            ) :
        ]


class ClusterConfigMasterConfigPreemptibilityEnum(object):
    @classmethod
    def to_proto(self, resource):
        if not resource:
            return resource
        return cluster_pb2.DataprocClusterConfigMasterConfigPreemptibilityEnum.Value(
            "DataprocClusterConfigMasterConfigPreemptibilityEnum%s" % resource
        )

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return resource
        return cluster_pb2.DataprocClusterConfigMasterConfigPreemptibilityEnum.Name(
            resource
        )[len("DataprocClusterConfigMasterConfigPreemptibilityEnum") :]


class ClusterConfigWorkerConfigPreemptibilityEnum(object):
    @classmethod
    def to_proto(self, resource):
        if not resource:
            return resource
        return cluster_pb2.DataprocClusterConfigWorkerConfigPreemptibilityEnum.Value(
            "DataprocClusterConfigWorkerConfigPreemptibilityEnum%s" % resource
        )

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return resource
        return cluster_pb2.DataprocClusterConfigWorkerConfigPreemptibilityEnum.Name(
            resource
        )[len("DataprocClusterConfigWorkerConfigPreemptibilityEnum") :]


class ClusterConfigSecondaryWorkerConfigPreemptibilityEnum(object):
    @classmethod
    def to_proto(self, resource):
        if not resource:
            return resource
        return cluster_pb2.DataprocClusterConfigSecondaryWorkerConfigPreemptibilityEnum.Value(
            "DataprocClusterConfigSecondaryWorkerConfigPreemptibilityEnum%s" % resource
        )

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return resource
        return cluster_pb2.DataprocClusterConfigSecondaryWorkerConfigPreemptibilityEnum.Name(
            resource
        )[
            len("DataprocClusterConfigSecondaryWorkerConfigPreemptibilityEnum") :
        ]


class ClusterConfigSoftwareConfigOptionalComponentsEnum(object):
    @classmethod
    def to_proto(self, resource):
        if not resource:
            return resource
        return (
            cluster_pb2.DataprocClusterConfigSoftwareConfigOptionalComponentsEnum.Value(
                "DataprocClusterConfigSoftwareConfigOptionalComponentsEnum%s" % resource
            )
        )

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return resource
        return (
            cluster_pb2.DataprocClusterConfigSoftwareConfigOptionalComponentsEnum.Name(
                resource
            )[len("DataprocClusterConfigSoftwareConfigOptionalComponentsEnum") :]
        )


class ClusterConfigDataprocMetricConfigMetricsMetricSourceEnum(object):
    @classmethod
    def to_proto(self, resource):
        if not resource:
            return resource
        return cluster_pb2.DataprocClusterConfigDataprocMetricConfigMetricsMetricSourceEnum.Value(
            "DataprocClusterConfigDataprocMetricConfigMetricsMetricSourceEnum%s"
            % resource
        )

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return resource
        return cluster_pb2.DataprocClusterConfigDataprocMetricConfigMetricsMetricSourceEnum.Name(
            resource
        )[
            len("DataprocClusterConfigDataprocMetricConfigMetricsMetricSourceEnum") :
        ]


class ClusterStatusStateEnum(object):
    @classmethod
    def to_proto(self, resource):
        if not resource:
            return resource
        return cluster_pb2.DataprocClusterStatusStateEnum.Value(
            "DataprocClusterStatusStateEnum%s" % resource
        )

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return resource
        return cluster_pb2.DataprocClusterStatusStateEnum.Name(resource)[
            len("DataprocClusterStatusStateEnum") :
        ]


class ClusterStatusSubstateEnum(object):
    @classmethod
    def to_proto(self, resource):
        if not resource:
            return resource
        return cluster_pb2.DataprocClusterStatusSubstateEnum.Value(
            "DataprocClusterStatusSubstateEnum%s" % resource
        )

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return resource
        return cluster_pb2.DataprocClusterStatusSubstateEnum.Name(resource)[
            len("DataprocClusterStatusSubstateEnum") :
        ]


class ClusterStatusHistoryStateEnum(object):
    @classmethod
    def to_proto(self, resource):
        if not resource:
            return resource
        return cluster_pb2.DataprocClusterStatusHistoryStateEnum.Value(
            "DataprocClusterStatusHistoryStateEnum%s" % resource
        )

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return resource
        return cluster_pb2.DataprocClusterStatusHistoryStateEnum.Name(resource)[
            len("DataprocClusterStatusHistoryStateEnum") :
        ]


class ClusterStatusHistorySubstateEnum(object):
    @classmethod
    def to_proto(self, resource):
        if not resource:
            return resource
        return cluster_pb2.DataprocClusterStatusHistorySubstateEnum.Value(
            "DataprocClusterStatusHistorySubstateEnum%s" % resource
        )

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return resource
        return cluster_pb2.DataprocClusterStatusHistorySubstateEnum.Name(resource)[
            len("DataprocClusterStatusHistorySubstateEnum") :
        ]


class ClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetRolesEnum(
    object
):
    @classmethod
    def to_proto(self, resource):
        if not resource:
            return resource
        return cluster_pb2.DataprocClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetRolesEnum.Value(
            "DataprocClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetRolesEnum%s"
            % resource
        )

    @classmethod
    def from_proto(self, resource):
        if not resource:
            return resource
        return cluster_pb2.DataprocClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetRolesEnum.Name(
            resource
        )[
            len(
                "DataprocClusterVirtualClusterConfigKubernetesClusterConfigGkeClusterConfigNodePoolTargetRolesEnum"
            ) :
        ]


class Primitive(object):
    @classmethod
    def to_proto(self, s):
        if not s:
            return ""
        return s

    @classmethod
    def from_proto(self, s):
        return s
