"""
Copyright 2019 Inmanta
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.
Contact: code@inmanta.com
"""
import datetime
import uuid
from typing import Any, Dict, List, NewType, Optional, Union
import pydantic
import inmanta.ast.export as ast_export
from inmanta import const
from inmanta.const import Change, ResourceState
from inmanta.types import ArgumentTypes, JsonType, SimpleTypes, StrictNonIntBool
class BaseModel(pydantic.BaseModel):
"""
Base class for all data objects in Inmanta
"""
class Config:
# Populate models with the value property of enums, rather than the raw enum.
# This is useful to serialise model.dict() later
use_enum_values = True
class ExtensionStatus(BaseModel):
"""
Status response for extensions loaded in the server
"""
name: str
version: str
package: str
class SliceStatus(BaseModel):
"""
Status response for slices loaded in the the server
"""
name: str
status: Dict[str, ArgumentTypes]
class FeatureStatus(BaseModel):
"""
Status of the feature
"""
slice: str
name: str
value: Optional[Any]
class StatusResponse(BaseModel):
"""
Response for the status method call
"""
product: str
edition: str
version: str
license: Union[str, Dict[str, SimpleTypes]]
extensions: List[ExtensionStatus]
slices: List[SliceStatus]
features: List[FeatureStatus]
[docs]class CompileData(BaseModel):
"""
Top level structure of compiler data to be exported.
"""
errors: List[ast_export.Error]
"""
All errors occurred while trying to compile.
"""
class CompileRun(BaseModel):
id: uuid.UUID
remote_id: Optional[uuid.UUID]
environment: uuid.UUID
requested: Optional[datetime.datetime]
started: Optional[datetime.datetime]
do_export: bool
force_update: bool
metadata: JsonType
environment_variables: Dict[str, str]
compile_data: Optional[CompileData]
ResourceVersionIdStr = NewType("ResourceVersionIdStr", str)
"""
The resource id with the version included.
"""
ResourceIdStr = NewType("ResourceIdStr", str)
"""
The resource id without the version
"""
ResourceType = NewType("ResourceType", str)
"""
The type of the resource
"""
class AttributeStateChange(BaseModel):
"""
Changes in the attribute
"""
current: Optional[Union[SimpleTypes, List[SimpleTypes], Dict[str, SimpleTypes]]] = None
desired: Optional[Union[SimpleTypes, List[SimpleTypes], Dict[str, SimpleTypes]]] = None
class Event(BaseModel):
"""
An event in the list of events generated by dependencies during deploy
"""
status: ResourceState
change: Change
changes: Dict[str, AttributeStateChange]
EnvSettingType = Union[StrictNonIntBool, int, str, Dict[str, Union[str, int, StrictNonIntBool]]]
class Environment(BaseModel):
"""
An inmanta environment.
:note: repo_url and repo_branch will be moved to the settings.
"""
id: uuid.UUID
name: str
project_id: uuid.UUID
repo_url: str
repo_branch: str
settings: Dict[str, EnvSettingType]
halted: bool
class Project(BaseModel):
"""
An inmanta environment.
"""
id: uuid.UUID
name: str
environments: List[Environment]
class EnvironmentSetting(BaseModel):
""" A class to define a new environment setting.
:param name: The name of the setting.
:param type: The type of the value. This type is mainly used for documentation purpose.
:param default: An optional default value for this setting. When a default is set and the
is requested from the database, it will return the default value and also store
the default value in the database.
:param doc: The documentation/help string for this setting
:param recompile: Trigger a recompile of the model when a setting is updated?
:param update_model: Update the configuration model (git pull on project and repos)
:param agent_restart: Restart autostarted agents when this settings is updated.
:param allowed_values: list of possible values (if type is enum)
"""
name: str
type: str
default: EnvSettingType
doc: str
recompile: bool
update_model: bool
agent_restart: bool
allowed_values: Optional[List[EnvSettingType]]
class EnvironmentSettingsReponse(BaseModel):
settings: Dict[str, EnvSettingType]
definition: Dict[str, EnvironmentSetting]
class ModelMetadata(BaseModel):
""" Model metadata
"""
inmanta_compile_state: const.Compilestate = const.Compilestate.success
message: str
type: str
extra_data: Optional[JsonType]
class Config:
fields = {"inmanta_compile_state": {"alias": "inmanta:compile:state"}}
class ModelVersionInfo(BaseModel):
""" Version information that can be associated with an orchestration model
:param export_metadata: Metadata associated with this version
:param model: A serialization of the complete orchestration model
"""
export_metadata: ModelMetadata
model: Optional[JsonType]
class Resource(BaseModel):
environment: uuid.UUID
model: int
resource_id: ResourceVersionIdStr
resource_type: ResourceType
resource_version_id: ResourceVersionIdStr
agent: str
last_deploy: Optional[datetime.datetime]
attributes: JsonType
status: const.ResourceState
class ResourceAction(BaseModel):
environment: uuid.UUID
version: int
resource_version_ids: List[ResourceVersionIdStr]
action_id: uuid.UUID
action: const.ResourceAction
started: datetime.datetime
finished: Optional[datetime.datetime]
messages: Optional[List[JsonType]]
status: Optional[const.ResourceState]
changes: Optional[JsonType]
change: Optional[const.Change]
send_event: Optional[bool]