class PoolCreateData(Base): pool_id = fields.Integer() cus = fields.Integer() sus = fields.Integer() ipv4us = fields.Integer() node_ids = fields.List(fields.String()) currencies = fields.List(fields.String())
class VirtualMachine(Base): id = fields.Integer() name = fields.String(default="") hub_url = fields.String(default="") description = fields.String(default="") network_connection = fields.List(fields.Object(ContainerNetworkConnection)) network_id = fields.String() farmer_tid = fields.Integer() size = fields.Integer() info = fields.Object(ReservationInfo) ssh_keys = fields.List(fields.String()) public_ip = fields.Integer() ipaddress = fields.IPAddress() SIZES = VMSIZES def resource_units(self): resource_units = ResourceUnitAmount() size = VMSIZES.get(self.size) if not size: raise j.exceptions.Input(f"VM size {self.size} not supported") resource_units.cru += size["cru"] resource_units.mru += size["mru"] resource_units.sru += size["sru"] return resource_units
class GatewayProxy(Base): id = fields.Integer() domain = fields.String(default="") addr = fields.String(default="") port = fields.Integer() port_tls = fields.Integer() info = fields.Object(ReservationInfo)
class PoolCreate(Base): json = fields.String() data_reservation = fields.Object(PoolCreateData) customer_tid = fields.Integer() customer_signature = fields.String() sponsor_tid = fields.Integer() sponsor_signature = fields.String()
class Network(Base): name = fields.String(default="") workload_id = fields.Integer() iprange = fields.IPRange(default="10.10.0.0/16") stats_aggregator = fields.List(fields.Object(Statsaggregator)) network_resources = fields.List(fields.Object(NetworkResource)) farmer_tid = fields.Integer()
class S3ZDB(VDCHostBase): size = fields.Integer() port = fields.Integer() namespace = fields.String() proxy_address = fields.String() @classmethod def from_workload(cls, workload): result_json = j.data.serializers.json.loads(workload.info.result.data_json) if not result_json: j.logger.warning(f"Couldn't get result details for zdb workload: {workload.id}") return if "IPs" in result_json: ip = result_json["IPs"][0] else: ip = result_json["IP"] namespace = result_json["Namespace"] port = result_json["Port"] zdb = cls() zdb.node_id = workload.info.node_id zdb.pool_id = workload.info.pool_id zdb.wid = workload.id zdb.size = workload.size zdb.ip_address = ip zdb.port = port zdb.namespace = namespace return zdb
class TfgridSolution1(Base): id = fields.Integer() name = fields.String(default="") solution_type = fields.Enum(SolutionType) rid = fields.Integer() form_info = fields.Typed(dict) explorer = fields.String(default="")
class Container(Base): id = fields.Integer() flist = fields.String(default="") hub_url = fields.String(default="") storage_url = fields.String(default="") environment = fields.Typed(dict) secret_environment = fields.Typed(dict) entrypoint = fields.String(default="") interactive = fields.Boolean(default=True) volumes = fields.List(fields.Object(ContainerMount)) network_connection = fields.List(fields.Object(ContainerNetworkConnection)) stats = fields.List(fields.Object(ContainerStats)) farmer_tid = fields.Integer() logs = fields.List(fields.Object(ContainerLogs)) capacity = fields.Object(ContainerCapacity) info = fields.Object(ReservationInfo) def resource_units(self): cap = self.capacity resource_units = ResourceUnitAmount() resource_units.cru = cap.cpu resource_units.mru = round(cap.memory / 1024 * 10000) / 10000 storage_size = round(cap.disk_size / 1024 * 10000) / 10000 storage_size = max(0, storage_size - 50) # we offer the 50 first GB of storage for container root filesystem if cap.disk_type == DiskType.HDD: resource_units.hru += storage_size elif cap.disk_type == DiskType.SSD: resource_units.sru += storage_size return resource_units
class K8s(Base): id = fields.Integer() size = fields.Integer() network_id = fields.String(default="") ipaddress = fields.IPAddress() cluster_secret = fields.String(default="") master_ips = fields.List(fields.IPAddress()) ssh_keys = fields.List(fields.String()) public_ip = fields.Integer() stats_aggregator = fields.List(fields.Object(Statsaggregator)) info = fields.Object(ReservationInfo) datastore_endpoint = fields.String(default="") disable_default_ingress = fields.Boolean(default=True) SIZES = VMSIZES def resource_units(self): resource_units = ResourceUnitAmount() size = VMSIZES.get(self.size) if not size: raise j.exceptions.Input(f"kubernetes size {self.size} not supported") resource_units.cru += size["cru"] resource_units.mru += size["mru"] resource_units.sru += size["sru"] return resource_units
class GatewayProxy(Base): id = fields.Integer() domain = fields.String(default="") addr = fields.String(default="") port = fields.Integer() port_tls = fields.Integer() info = fields.Object(ReservationInfo) def resource_units(self): return ResourceUnitAmount()
class ZdbNamespace(Base): id = fields.Integer() node_id = fields.String(default="") size = fields.Integer() mode = fields.Enum(ZDBMode) password = fields.String(default="") disk_type = fields.Enum(DiskType) public = fields.Boolean(default=False) stats_aggregator = fields.List(fields.Object(Statsaggregator)) info = fields.Object(ReservationInfo)
class NetworkResource(Base): id = fields.Integer() name = fields.String(default="") network_iprange = fields.IPRange(default="10.10.0.0/16") wireguard_private_key_encrypted = fields.String(default="") wireguard_public_key = fields.String(default="") wireguard_listen_port = fields.Integer() iprange = fields.IPRange(default="10.10.10.0/24") peers = fields.List(fields.Object(WireguardPeer)) info = fields.Object(ReservationInfo)
class K8s(Base): id = fields.Integer() size = fields.Integer() network_id = fields.String(default="") ipaddress = fields.IPAddress() cluster_secret = fields.String(default="") master_ips = fields.List(fields.IPAddress()) ssh_keys = fields.List(fields.String()) stats_aggregator = fields.List(fields.Object(Statsaggregator)) info = fields.Object(ReservationInfo)
class Pool(Base): pool_id = fields.Integer() cus = fields.Float() sus = fields.Float() node_ids = fields.List(fields.String()) last_updated = fields.DateTime() active_cu = fields.Float() active_su = fields.Float() empty_at = fields.Integer() # can't be set to date because of max int64 value customer_tid = fields.Integer() active_workload_ids = fields.List(fields.Integer())
class PoolPayment(Base): id = fields.Integer() farmer_id = fields.Integer() address = fields.String() expiration = fields.DateTime() asset = fields.String() amount = fields.Integer() paid = fields.Boolean() released = fields.Boolean() canceled = fields.Boolean() cause = fields.String()
class TfgridSolutionsPayment1(Base): id = fields.Integer() rid = fields.Integer() explorer = fields.String(default="") currency = fields.String(default="") escrow_address = fields.String(default="") escrow_asset = fields.String(default="") total_amount = fields.String(default="") transaction_fees = fields.String(default="") payment_source = fields.String(default="") farmer_payments = fields.Typed(dict, default={}) time = fields.DateTime(default=datetime.utcnow)
class Farm(Base): id = fields.Integer() threebot_id = fields.Integer() iyo_organization = fields.String(default="") name = fields.String(default="") wallet_addresses = fields.List(fields.Object(WalletAddress)) location = fields.Object(Location) email = fields.Email() resource_prices = fields.List(fields.Object(ResourceUnitPrice)) prefix_zero = fields.IPRange() def __str__(self): return " - ".join([x for x in [self.name, str(self.location)] if x])
class Reservation(Base): id = fields.Integer() json = fields.String(default="") data_reservation = fields.Object(ReservationData) customer_tid = fields.Integer() customer_signature = fields.String(default="") next_action = fields.Enum(NextAction) signatures_provision = fields.List(fields.Object(Signature)) signatures_farmer = fields.List(fields.Object(Signature)) signatures_delete = fields.List(fields.Object(Signature)) epoch = fields.DateTime(default=datetime.utcnow) metadata = fields.String(default="") results = fields.List(fields.Object(ReservationResult))
class WorkloadsAmount(Base): network = fields.Integer() volume = fields.Integer() zdb_namespace = fields.Integer() container = fields.Integer() k8s_vm = fields.Integer() proxy = fields.Integer() reverse_proxy = fields.Integer() subdomain = fields.Integer() delegate_domain = fields.Integer()
class Volume(Base): id = fields.Integer() size = fields.Integer() type = fields.Enum(DiskType) stats_aggregator = fields.List(fields.Object(Statsaggregator)) info = fields.Object(ReservationInfo) def resource_units(self): resource_units = ResourceUnitAmount() if self.type == DiskType.HDD: resource_units.hru += self.size elif self.type == DiskType.SSD: resource_units.sru += self.size return resource_units
class Gateway(Base): node_id = fields.String(default="") os_version = fields.String(default="") farm_id = fields.Integer() created = fields.DateTime() updated = fields.DateTime() uptime = fields.Integer() address = fields.String(default="") location = fields.Object(Location) public_key_hex = fields.String(default="") workloads = fields.Object(WorkloadsAmount) managed_domains = fields.List(fields.String()) tcp_router_port = fields.Integer() dns_nameserver = fields.List(fields.String()) free_to_use = fields.Boolean()
class SSHClient(Client): name = fields.String() sshkey = fields.String() host = fields.String(default="127.0.0.1") user = fields.String(default="root") port = fields.Integer() forward_agent = fields.Boolean(default=True) connect_timeout = fields.Integer(default=10) # gateway = ? FIXME: should help with proxyjumps. http://docs.fabfile.org/en/2.4/concepts/networking.html#ssh-gateways # connect_kwargs = ? FIXME: how to pass dict? inline_ssh_env = fields.Boolean(default=True) # whether to send environment variables “inline” as prefixes in front of command strings (export VARNAME=value && mycommand here), instead of trying to submit them through the SSH protocol itself (which is the default behavior). This is necessary if the remote server has a restricted AcceptEnv setting (which is the common default). def __init__(self): super().__init__() self.__client = None def _sshkey(self): return j.clients.sshkey.get(self.sshkey) @property def sshclient(self): if not self.__client: connection_kwargs = dict( host=self.host, user=self.user, port=self.port, forward_agent=self.forward_agent, connect_timeout=self.connect_timeout, connect_kwargs={ "key_filename": self._sshkey().private_key_path, }) # FIXME: coredump here. # if self._sshkey.passphrase: # connection_kwargs["connect_kwargs"]["passphrase"] = self._sshkey().passphrase self.__client = j.core.executors.RemoteExecutor(**connection_kwargs) return self.__client def reset_connection(self): self.__client = None def __getattr__(self, name): return getattr(self.sshclient, name) def __dir__(self): return list(self.__dict__.keys()) + dir(self.sshclient)
class Address(Base): x = fields.Integer() name = fields.String() def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.x = 123
class KubernetesNode(VDCHostBase): role = fields.Enum(KubernetesRole) public_ip = fields.IPRange() _size = fields.Integer() @property def size(self): return VDC_SIZE.K8SNodeFlavor(self._size) @classmethod def from_workload(cls, workload): node = cls() node.wid = workload.id node.ip_address = workload.ipaddress if workload.master_ips: node.role = KubernetesRole.WORKER else: node.role = KubernetesRole.MASTER node.node_id = workload.info.node_id node.pool_id = workload.info.pool_id if workload.public_ip: zos = get_zos() public_ip_workload = zos.workloads.get(workload.public_ip) address = str(netaddr.IPNetwork(public_ip_workload.ipaddress).ip) node.public_ip = address node._size = ( VDC_SIZE.K8SNodeFlavor(workload.size).value if workload.size in [size.value for size in K8S_SIZES] else VDC_SIZE.K8SNodeFlavor.SMALL.value ) return node
class VMachine(VDCWorkloadBase): name = fields.String() public_ip = fields.Object(PublicIP) size = fields.Integer() resources = fields.Typed(dict) ip_address = fields.String(default="") @classmethod def from_workload(cls, workload): vmachine = cls() vmachine.wid = workload.id metadata = j.sals.reservation_chatflow.reservation_chatflow.decrypt_reservation_metadata(workload.info.metadata) metadata = j.data.serializers.json.loads(metadata) vmachine.name = metadata["form_info"]["name"] vmachine.pool_id = workload.info.pool_id vmachine.node_id = workload.info.node_id vmachine.size = workload.size vmachine.resources = VMSIZES.get(workload.size) vmachine.ip_address = workload.ipaddress if workload.public_ip: vmachine.public_ip.wid = workload.public_ip zos = get_zos() public_ip_workload = zos.workloads.get(workload.public_ip) address = str(netaddr.IPNetwork(public_ip_workload.ipaddress).ip) vmachine.public_ip.address = address return vmachine
class Address(Base): x = fields.Integer() name = fields.String() def __init__(self): super().__init__() self.x = 123
class Container(Base): id = fields.Integer() flist = fields.String(default="") hub_url = fields.String(default="") storage_url = fields.String(default="") environment = fields.Typed(dict) secret_environment = fields.Typed(dict) entrypoint = fields.String(default="") interactive = fields.Boolean(default=True) volumes = fields.List(fields.Object(ContainerMount)) network_connection = fields.List(fields.Object(ContainerNetworkConnection)) stats_aggregator = fields.List(fields.Object(Statsaggregator)) farmer_tid = fields.Integer() logs = fields.List(fields.Object(ContainerLogs)) capacity = fields.Object(ContainerCapacity) info = fields.Object(ReservationInfo)
class GatewayDelegate(Base): id = fields.Integer() domain = fields.String(default="") info = fields.Object(ReservationInfo) def resource_units(self): return ResourceUnitAmount()
class Gateway4to6(Base): id = fields.Integer() public_key = fields.String(default="") info = fields.Object(ReservationInfo) def resource_units(self): return ResourceUnitAmount()
class SonicClient(Client): host = fields.String(default="127.0.0.1") port = fields.Integer(default=1491) password = fields.String(default="pass") def __init__(self): super().__init__() self.cached_client_search = None self.cached_client_ingest = None self.push = self.client_ingest.push self.pop = self.client_ingest.pop self.count = self.client_ingest.count self.flush = self.client_ingest.flush self.flush_collection = self.client_ingest.flush_collection self.flush_bucket = self.client_ingest.flush_bucket self.flush_object = self.client_ingest.flush_object self.query = self.client_search.query self.suggest = self.client_search.suggest @property def client_ingest(self): if not self.cached_client_ingest: self.cached_client_ingest = IngestClient(host=self.host, port=self.port, password=self.password) return self.cached_client_ingest @property def client_search(self): if not self.cached_client_search: self.cached_client_search = SearchClient(host=self.host, port=self.port, password=self.password) return self.cached_client_search