Initial Commit

This commit is contained in:
2023-09-08 19:05:37 +03:00
commit 7e60195cb7
185 changed files with 27107 additions and 0 deletions

View File

View File

@@ -0,0 +1,9 @@
from helpers.database import db
from safrs import SAFRSBase
from safrs.api_methods import search
class BaseModel(SAFRSBase, db.Model):
__abstract__ = True
SAFRSBase.search = search

View File

View File

@@ -0,0 +1,21 @@
from sqlalchemy import Column, String, Integer
from sqlalchemy.orm import relationship
from models.common.base import BaseModel
class contour(BaseModel):
"""
description: Technological infrastructure contours.
"""
__tablename__ = "tcc_contours"
_s_collection_name = "contours"
_s_class_name = "contours"
exclude_rels = ["vcenter", "pcentral"]
id = Column(Integer, primary_key=True, autoincrement=True, index=True)
name = Column(String(64), unique=True, index=True, nullable=False)
description = Column(String(255))
vcenter = relationship("vcenter", back_populates="contour")
pcentral = relationship("pcentral", back_populates="contour")

View File

@@ -0,0 +1,27 @@
from sqlalchemy import Column, String, Integer
from sqlalchemy.orm import relationship
from models.common.base import BaseModel
class environment(BaseModel):
"""
description: Technological infrastructure environments.
"""
__tablename__ = "tcc_environments"
_s_collection_name = "environments"
_s_class_name = "environment"
id = Column(Integer, primary_key=True, autoincrement=True, index=True)
name = Column(String(32), unique=True, index=True, nullable=False)
color = Column(String(7), index=False, nullable=True)
cluster = relationship("cluster", back_populates="environment")
pelement = relationship("pelement", back_populates="environment")
def to_dict(self):
result = BaseModel.to_dict(self)
result['name'] = result['name'].upper()
return result

View File

@@ -0,0 +1,21 @@
from datetime import datetime
from sqlalchemy import Column, String, Integer, DateTime
from models.common.base import BaseModel
class timestamp(BaseModel):
"""
description: Timestamps.
"""
__tablename__ = "tcc_timestamps"
_s_collection_name = "timestamps"
_s_class_name = "timestamps"
id = Column(Integer, primary_key=True, autoincrement=True, index=True)
name = Column(String(64), unique=True, nullable=False)
timestamp = Column(
DateTime,
default=datetime.utcnow,
onupdate=datetime.utcnow
)

View File

View File

View File

@@ -0,0 +1,40 @@
from sqlalchemy import (
Column,
String,
Integer,
ForeignKey
)
from sqlalchemy.orm import relationship
from models.common.base import BaseModel
class pcentral(BaseModel):
"""
description: Nutanix prism central model
"""
__tablename__ = "tnc_pcentrals"
_s_collection_name = "pcentrals"
_s_class_name = "pcentral"
id = Column(Integer, primary_key=True, autoincrement=True, index=True)
name = Column(String(32), unique=True, index=True, nullable=False)
hostname = Column(String(64), unique=True, index=True, nullable=True)
ncc_version = Column(String(16), index=True, nullable=False)
aos_version = Column(String(16), index=True, nullable=False)
contour_id = Column(Integer, ForeignKey("tcc_contours.id"))
contour = relationship("contour", back_populates="pcentral")
npcreport = relationship(
"npcreport",
backref="pcentral",
cascade="save-update, delete",
lazy="dynamic"
)
pelement = relationship(
"pelement",
backref="pcentral",
cascade="save-update, delete",
lazy="dynamic"
)

View File

@@ -0,0 +1,52 @@
from sqlalchemy import (
Column,
String,
Integer,
ForeignKey
)
from sqlalchemy.orm import relationship
from models.common.base import BaseModel
class pelement(BaseModel):
"""
description: Nutanix prism element model
"""
__tablename__ = "tnc_pelement"
_s_collection_name = "pelements"
_s_class_name = "pelement"
id = Column(Integer, primary_key=True, autoincrement=True, index=True)
ip = Column(String(15), unique=True, nullable=False)
name = Column(String(32), unique=True, nullable=False)
hostname = Column(String(64), unique=True, nullable=True)
description = Column(String(64), unique=False, nullable=False)
ncc_version = Column(String(16), index=True, nullable=False)
aos_version = Column(String(16), index=True, nullable=False)
cpu_decomiss = Column(Integer, nullable=True)
pcentral_id = Column(Integer, ForeignKey("tnc_pcentrals.id"))
environment_id = Column(Integer, ForeignKey("tcc_environments.id"))
environment = relationship("environment", back_populates="pelement")
pelement = relationship(
"npereport",
backref="pelement",
cascade="save-update, delete",
lazy="dynamic"
)
maintenance = relationship(
"nmreport",
backref="pelement",
cascade="save-update, delete",
lazy="dynamic"
)
def to_dict(self):
result = BaseModel.to_dict(self)
if (result['hostname'] is None):
result['hostname'] = result['hostname']
return result

View File

@@ -0,0 +1,37 @@
from datetime import datetime
from sqlalchemy import (
Column,
String,
Integer,
DateTime,
ForeignKey
)
from models.common.base import BaseModel
class nmreport(BaseModel):
"""
description: Nutanix hosts in maintenance mode report
"""
__tablename__ = "tnrm_report"
_s_collection_name = "nmreport"
_s_class_name = "nmreport"
id = Column(Integer, primary_key=True, autoincrement=True, index=True)
ip = Column(String(15), unique=True, nullable=False)
ipmi = Column(String(15), unique=True, nullable=False)
hypervisor_name = Column(String(64), unique=True, nullable=False)
hypervisor_type = Column(String(32), index=True)
hypervisor_state = Column(String(64), index=True)
serial = Column(String(32), unique=True, nullable=False)
reason = Column(String(255), nullable=True)
date = Column(DateTime, default=datetime.utcnow)
pelement_id = Column(
Integer,
ForeignKey("tnc_pelement.id"),
nullable=False,
index=True
)

View File

@@ -0,0 +1,34 @@
from sqlalchemy import (
Column,
Integer,
ForeignKey
)
from models.common.base import BaseModel
class npcreport(BaseModel):
"""
description: Nutanix prism central report model
"""
__tablename__ = "tnrpc_report"
_s_collection_name = "npcreport"
_s_class_name = "prismCentral"
id = Column(Integer, primary_key=True, autoincrement=True, index=True)
vms_total = Column(Integer, nullable=False)
cert_status = Column(Integer, nullable=False)
aos_status = Column(Integer, nullable=False)
projects_total = Column(Integer, nullable=False)
alerts_crit_ack = Column(Integer, nullable=False)
alerts_crit_nack = Column(Integer, nullable=False)
alerts_warn_ack = Column(Integer, nullable=False)
alerts_warn_nack = Column(Integer, nullable=False)
pcentral_id = Column(
Integer,
ForeignKey("tnc_pcentrals.id"),
nullable=False,
index=True
)

View File

@@ -0,0 +1,49 @@
from sqlalchemy import (
Column,
String,
Integer,
ForeignKey
)
from sqlalchemy.orm import relationship
from models.common.base import BaseModel
class npereport(BaseModel):
"""
description: Nutanix prism element report model
"""
__tablename__ = "tnrpe_report"
_s_collection_name = "npereport"
_s_class_name = "prismElement"
id = Column(Integer, primary_key=True, autoincrement=True, index=True)
vms_total = Column(Integer, nullable=False)
cert_status = Column(Integer, nullable=False)
aos_status = Column(Integer, nullable=False)
storage_dedup = Column(Integer, nullable=False)
hosts_total = Column(Integer, nullable=False)
hosts_in_maintenance = Column(Integer, nullable=False)
storage_usage = Column(Integer, nullable=False)
cpu_usage = Column(Integer, nullable=False)
mem_usage = Column(Integer, nullable=False)
hypervisor = Column(String(32), nullable=True)
hypervisor_version = Column(String(32), nullable=True)
alerts_crit_ack = Column(Integer, nullable=False)
alerts_crit_nack = Column(Integer, nullable=False)
alerts_warn_ack = Column(Integer, nullable=False)
alerts_warn_nack = Column(Integer, nullable=False)
redundancy_factor = Column(Integer, nullable=False)
pelement_id = Column(
Integer,
ForeignKey("tnc_pelement.id"),
nullable=False,
index=True
)
decomission = relationship(
"nureport",
backref="npereport",
cascade="save-update, delete",
lazy="dynamic"
)

View File

@@ -0,0 +1,31 @@
from sqlalchemy import (
Column,
Integer,
Float,
ForeignKey
)
from models.common.base import BaseModel
class nureport(BaseModel):
"""
description: Nutanix utilization report
"""
__tablename__ = "tnru_report"
_s_collection_name = "nureport"
_s_class_name = "utilization"
id = Column(Integer, primary_key=True, autoincrement=True, index=True)
cpu_avg = Column(Float, nullable=False)
cpu_peak = Column(Float, nullable=False)
mem_avg = Column(Float, nullable=False)
mem_peak = Column(Float, nullable=False)
storage = Column(Float, nullable=False)
pelement_id = Column(
Integer,
ForeignKey("tnrpe_report.id"),
nullable=False,
index=True
)

View File

View File

View File

@@ -0,0 +1,54 @@
from sqlalchemy import (
Column,
String,
Integer,
ForeignKey
)
from sqlalchemy.orm import relationship
from models.common.base import BaseModel
class cluster(BaseModel):
"""
description: VMware cluster model
"""
__tablename__ = "tvc_clusters"
_s_collection_name = "clusters"
exclude_rels = ["capacity", "datastores", "sharedNetwork"]
id = Column(Integer, primary_key=True, autoincrement=True, index=True)
name = Column(String(64), unique=True, index=True, nullable=False)
vcenter_id = Column(Integer, ForeignKey("tvc_vcenters.id"), nullable=False)
environment_id = Column(
Integer,
ForeignKey("tcc_environments.id"),
nullable=True
)
vcenter = relationship("vcenter", back_populates="cluster")
environment = relationship("environment", back_populates="cluster")
capacity = relationship(
"capacity",
backref="cluster",
cascade="save-update, delete",
lazy="dynamic"
)
maintenance = relationship(
"maintenance",
backref="cluster",
cascade="save-update, delete",
lazy="dynamic"
)
datastores = relationship(
"datastore",
backref="cluster",
cascade="save-update, delete",
lazy="dynamic"
)
sharedNetwork = relationship(
"sharedNetwork",
backref="cluster",
cascade="save-update, delete",
lazy="dynamic"
)

View File

@@ -0,0 +1,36 @@
from sqlalchemy import (
Column,
String,
Integer,
ForeignKey
)
from sqlalchemy.orm import relationship
from models.common.base import BaseModel
class vcenter(BaseModel):
"""
description: VMware vcenter model
"""
__tablename__ = "tvc_vcenters"
_s_collection_name = "vcenters"
exclude_rels = ["rvm_vcenter"]
id = Column(Integer, primary_key=True, autoincrement=True, index=True)
hostname = Column(String(64), unique=True, index=True, nullable=False)
contour_id = Column(Integer, ForeignKey("tcc_contours.id"))
cluster = relationship(
"cluster",
back_populates="vcenter",
cascade="save-update, delete"
)
contour = relationship("contour", back_populates="vcenter")
vcenter = relationship(
"maintenance",
backref="vcenter",
cascade="save-update, delete"
)

View File

@@ -0,0 +1,25 @@
from datetime import datetime
from sqlalchemy import Column, Integer, DateTime
from sqlalchemy.orm import relationship
from models.common.base import BaseModel
class frame(BaseModel):
__tablename__ = "tvrc_frames"
_s_collection_name = "frames"
http_methods = {"get", "post", "delete"}
id = Column(Integer, primary_key=True, autoincrement=True, index=True)
timestamp = Column(
DateTime,
default=datetime.utcnow,
onupdate=datetime.utcnow
)
capacity = relationship(
"capacity",
backref="frame",
cascade="save-update, delete"
)

View File

@@ -0,0 +1,131 @@
from safrs import jsonapi_rpc, SAFRSFormattedResponse
from sqlalchemy import (
Column,
Integer,
Float,
ForeignKey
)
from helpers.database import db
from helpers.math import safe_division
from models.common.base import BaseModel
from models.vmware.reports.capacity.frame import frame
class capacity(BaseModel):
"""
description: Capacity report model
"""
__tablename__ = "tvrc_report"
_s_collection_name = "capacity"
http_methods = {"get", "post"}
id = Column(Integer, primary_key=True, autoincrement=True, index=True)
hosts_on_duty = Column(Integer, nullable=False)
hosts_in_maintenance = Column(Integer, nullable=False)
hosts_reserved = Column(Integer, nullable=False)
hosts_staged_dcm = Column(Integer, nullable=False)
vms_total = Column(Integer, nullable=False)
sockets_total = Column(Integer, nullable=False)
pcpu_total = Column(Integer, nullable=False)
pcpu_host_max = Column(Integer, nullable=False)
vcpu_provisioned = Column(Integer, nullable=False)
pmemory_total = Column(Float, nullable=False)
vmemory_provisioned = Column(Float, nullable=False)
pstorage_total = Column(Float, nullable=False)
vstorage_used = Column(Float, nullable=False)
vstorage_provisioned = Column(Float, nullable=False)
rdm_total = Column(Float, nullable=False)
pcpu_ovp_target = Column(Float, nullable=False)
pmemory_ovp_target = Column(Float, nullable=False)
pstorage_ovp_target = Column(Float, nullable=False)
pcpu_retire_target = Column(Float, nullable=False)
frame_id = Column(
Integer, ForeignKey("tvrc_frames.id"),
nullable=False,
index=True
)
cluster_id = Column(
Integer,
ForeignKey("tvc_clusters.id"),
nullable=False,
index=True
)
@classmethod
@jsonapi_rpc(http_methods=["GET"])
def get_last(self, *args, **kwargs):
"""
description : Get capacity report by last frameid
summary : Get last capacity report
tags:
- capacity
produces:
- application/xml
- application/json
"""
frame_obj = db.session.query(frame).order_by(frame.id.desc()).first()
reports = db.session.query(capacity).\
filter(capacity.frame_id == frame_obj.id).all()
data = [reports]
response = SAFRSFormattedResponse(
data,
self._s_meta(),
{},
{},
len(reports)
)
return response
def __init__(self, *args, **kwargs):
pcpu_ovp_current = kwargs.pop("pcpu_ovp_current", None) # noqa
pmemory_ovp_current = kwargs.pop("pmemory_ovp_current", None) # noqa
pstorage_ovp_current = kwargs.pop("pstorage_ovp_current", None) # noqa
cpu_cap_used = kwargs.pop("cpu_cap_used", None) # noqa
mem_cap_used = kwargs.pop("mem_cap_used", None) # noqa
str_cap_used = kwargs.pop("str_cap_used", None) # noqa
hosts_total = kwargs.pop("hosts_total", None) # noqa
BaseModel.__init__(self, **kwargs)
def to_dict(self):
result = BaseModel.to_dict(self)
result['pcpu_ovp_current'] = safe_division(
result['vcpu_provisioned'],
result['pcpu_total']
)
result['pmemory_ovp_current'] = safe_division(
result['vmemory_provisioned'],
result['pmemory_total']
)
result['pstorage_ovp_current'] = safe_division(
result['vstorage_provisioned'],
result['pstorage_total']
)
result['cpu_cap_used'] = round(safe_division(
result['pcpu_ovp_current'],
result['pcpu_ovp_target']
)*100)
result['mem_cap_used'] = round(safe_division(
result['pmemory_ovp_current'],
result['pmemory_ovp_target']
)*100)
result['str_cap_used'] = round(safe_division(
result['pstorage_ovp_current'],
result['pstorage_ovp_target']
)*100)
result['hosts_total'] = result['hosts_on_duty'] +\
result['hosts_reserved'] +\
result['hosts_in_maintenance']
return result

View File

@@ -0,0 +1,56 @@
from sqlalchemy import (
Column,
String,
Integer,
ForeignKey
)
from helpers.math import safe_division
from models.common.base import BaseModel
class datastore(BaseModel):
"""
description: Datastores report model
"""
__tablename__ = "tvrd_report"
_s_collection_name = "datastores"
id = Column(Integer, primary_key=True, autoincrement=True, index=True)
name = Column(String(64), index=True, nullable=False)
space_used = Column(Integer, nullable=False)
space_total = Column(Integer, nullable=False)
space_provisioned = Column(Integer, nullable=False)
cluster_id = Column(
Integer,
ForeignKey("tvc_clusters.id"),
nullable=False,
index=True
)
def __init__(self, *args, **kwargs):
ovp_current = kwargs.pop("ovp_current", None) # noqa
space_free_percent = kwargs.pop("space_free_percent", None) # noqa
cap_used = kwargs.pop("cap_used", None) # noqa
BaseModel.__init__(self, **kwargs)
def to_dict(self):
result = BaseModel.to_dict(self)
result["ovp_current"] = safe_division(
result["space_provisioned"],
result["space_total"]
)
result["space_free_percent"] = round((1 - safe_division(
result["space_used"],
result["space_total"]
))*100, 0)
result['cap_used'] = round(safe_division(
result['ovp_current'],
2
)*100)
return result

View File

@@ -0,0 +1,38 @@
from sqlalchemy import (
Column,
String,
Integer,
DateTime,
ForeignKey
)
from models.common.base import BaseModel
class maintenance(BaseModel):
__tablename__ = "tvrm_report"
_s_collection_name = "maintenance"
http_methods = {"get", "post", "delete"}
id = Column(Integer, primary_key=True, autoincrement=True, index=True)
folder = Column(String(255), nullable=False)
hostname = Column(String(64), unique=True, nullable=False)
state = Column(String(64), index=True)
reason = Column(String(255))
placedby = Column(String(64))
placedbyFN = Column(String(64))
date = Column(DateTime)
vcenter_id = Column(
Integer,
ForeignKey("tvc_vcenters.id"),
nullable=False,
index=True
)
cluster_id = Column(
Integer,
ForeignKey("tvc_clusters.id"),
nullable=True,
index=True
)

View File

@@ -0,0 +1,49 @@
from sqlalchemy import (
Column,
String,
Integer,
Float,
ForeignKey
)
from models.common.base import BaseModel
class sharedNetwork(BaseModel):
"""
description: Shared Networks report model
"""
__tablename__ = "tvrsn_report"
_s_collection_name = "sharedNetworks"
id = Column(Integer, primary_key=True, autoincrement=True, index=True)
vrf = Column(String(64), nullable=False)
vrfId = Column(Integer, nullable=False, index=True)
subnet = Column(String(15), nullable=False)
subnetId = Column(Integer, nullable=False, unique=True, index=True)
subnetMask = Column(Integer, nullable=False)
requestsID = Column(String(32))
bussinessLine = Column(String(32))
subnetManager = Column(String(32), index=True)
virtSubnetName = Column(String(32))
virtSubnetUUID = Column(String(32))
freeIPPercent = Column(Float, nullable=False)
cluster_id = Column(
Integer,
ForeignKey("tvc_clusters.id"),
nullable=True,
index=True
)
def __init__(self, *args, **kwargs):
platform = kwargs.pop("platform", None) # noqa
BaseModel.__init__(self, **kwargs)
def to_dict(self):
result = BaseModel.to_dict(self)
result["platform"] = "vmware"
return result