Provider Management
MOF support multi cloud provider with plugin style. User can implement their own cloud provider plugin.
Architecture#
MOF defines provider and jarvis interface to implement. MOF will keep defining builtin providers.
- AWS (Stable)
- Alibaba Cloud (Beta)
- Tencent Cloud (Beta)
- GCP (TODO)
- Azure (TODO)
- Huawei Cloud (TODO)
Provider interface#
Definition#
Defines cloud provider metadata like credentials etc.
Function | Description |
---|---|
GetDef() | Returns definition of cloud provider |
type DefManager interface {
GetDef() *Def
}
type Def struct {
Name string `yaml:"name" json:"name"`
Version string `yaml:"version" json:"version"`
HomeUrl map[string]string `yaml:"homeUrl" json:"homeUrl"`
DocsUrl map[string]string `yaml:"docsUrl" json:"docsUrl"`
Location []struct {
Name string `yaml:"name" json:"name"`
Default bool `yaml:"default" json:"default"`
} `yaml:"location" json:"location"`
CredField []struct {
Name string `yaml:"name" json:"name"`
Required bool `yaml:"required" json:"required"`
Example string `yaml:"example" json:"example"`
Type string `yaml:"type" json:"type"`
} `yaml:"credFields" json:"credFields"`
}
Provider manager#
Responsible for create and remove provider instance from user.
Function | Description |
---|---|
CreateProvider() | Create a provider instance and store it into DB |
RemoveSensitive() | Remove sensitive fields in provider while response to API |
EncryptSensitive() | Encrypt provider credential |
DecryptSensitive() | Decrypt provider credential |
type ProvManager interface {
CreateProvider(meta *ReqMeta, name, location string, credentials map[string]string) (*Provider, error)
RemoveSensitive(instance *Provider)
EncryptSensitive(meta *ReqMeta, instance *Provider) error
DecryptSensitive(meta *ReqMeta, instance *Provider) error
}
type Provider struct {
ModelBase
Id int64 `yaml:"id" json:"id" gorm:"primaryKey" example:"1"`
UserId string `yaml:"userId" json:"userId" gorm:"index" example:"xxx"`
Version string `yaml:"version" json:"version" gorm:"index" example:"v1"`
Name string `yaml:"name" json:"name" gorm:"index" example:"aws-test"`
Type string `yaml:"type" json:"type" gorm:"index" example:"AWS"`
Location string `yaml:"location" json:"location" example:"global"`
Credentials map[string]string `yaml:"credentials" json:"credentials" gorm:"-"`
Extensions map[string]string `yaml:"extensions" json:"extensions" gorm:"-"`
CredentialsFlatten string `yaml:"-" json:"-"`
ExtensionsFlatten string `yaml:"-" json:"-"`
}
Offer manager#
Responsible for syncing and retrieving cloud service offers.
Function | Description |
---|---|
ListOffers() | List cloud service offers |
SyncOffers() | Sync cloud service offers |
OfferLastUpdatedAt() | As name described |
type OfferManager interface {
ListOffers(meta *ReqMeta, req *ListOffersReq) (*ListOffersResp, error)
SyncOffers(meta *ReqMeta, req *SyncOffersReq) (*SyncOffersResp, error)
OfferLastUpdatedAt() (time.Time, error)
}
Resource manager#
Responsible for collecting and aggregating cloud resource and usage metrics.
Function | Description |
---|---|
ResourceSummary() | Summarise cloud resources |
RefreshResource() | Sync cloud resource list |
GetArch() | Generate tree chart based on resources |
ListResources() | List resources |
GetResourceDetail() | Get resource detail |
GetResourceMetrics() | Get resource usage metrics |
type ResourceManager interface {
ResourceSummary(meta *ReqMeta, instances ...*Provider) (*ResourceSummaryResp, error)
RefreshResource(meta *ReqMeta, instance *Provider) (*RefreshResourceResp, error)
GetArch(meta *ReqMeta, instance *Provider) (*GetArchResp, error)
ListResources(meta *ReqMeta, instance *Provider) (*ListResourcesResp, error)
GetResourceDetail(meta *ReqMeta, instance *Provider) (*GetResourceDetailResp, error)
GetResourceMetrics(meta *ReqMeta, instance *Provider) (*GetResourceMetricsResp, error)
}
Tag manager#
Responsible for tagging and untagging cloud resources.
Function | Description |
---|---|
ListTags() | List tags |
ListResourcesByTag() | List resources with tags |
TagResource() | Tag resource |
UntagResource() | Untag resource |
ListTaggableDimensions() | List tag dimensions |
type TagManager interface {
ListTags(meta *ReqMeta, instance *Provider) (*ListTagsResp, error)
ListResourcesByTag(meta *ReqMeta, instance *Provider) (*ListResourcesByTagResp, error)
TagResource(meta *ReqMeta, instance *Provider, req *TagResourceReq) (*TagResourceResp, error)
UntagResource(meta *ReqMeta, instance *Provider, req *UntagResourceReq) (*UntagResourceResp, error)
ListTaggableDimensions(meta *ReqMeta, instance *Provider) (*ListTaggableDimensionsResp, error)
}
Cost analyzer#
Responsible for collecting and aggregating cloud cost.
Function | Description |
---|---|
CostSummary() | Get cost summary of multiple providers |
GetCost() | Get cost detail metrics |
type Analyser interface {
CostSummary(meta *ReqMeta, instances ...*Provider) (*CostSummaryResp, error)
GetCost(meta *ReqMeta, instance *Provider) (*GetCostResp, error)
}
Cost optimizer#
Responsible for generating optimization.
Function | Description |
---|---|
OptimizationSummary() | Get optimization summary |
ListOptimizations() | List optimizations |
RefreshOptimizations() | Refresh optimization |
type Optimizer interface {
OptimizationSummary(meta *ReqMeta, instances ...*Provider) (*OptimizeSummaryResp, error)
ListOptimizations(meta *ReqMeta, instances ...*Provider) (*ListOptimizationsResp, error)
RefreshOptimizations(meta *ReqMeta, instances ...*Provider) (*RefreshOptimizationsResp, error)
}
Cost forecaster#
Responsible for forecasting cloud cost.
Function | Description |
---|---|
ForecastSummary() | Get cost forecast summary |
GetForecast() | Get cost forecast metrics |
GetForecastDimensions() | Get forecast dimensions |
type Forecaster interface {
ForecastSummary(meta *ReqMeta, instances ...*Provider) (*ForecastSummaryResp, error)
GetForecast(meta *ReqMeta, instance *Provider) (*GetForecastResp, error)
GetForecastDimensions(meta *ReqMeta, instance *Provider) (*GetForecastDimensionsResp, error)
}
RI manager#
Responsible for managing reserved instances.
Function | Description |
---|---|
ListRiRecommendation() | List RI recommendations |
ListRi() | List RI |
ListRiUtil() | List RI utilization metrics |
ListRiCoverage() | List RI coverage metrics |
ListRiServices() | List RI resources |
type RiManager interface {
ListRiRecommendation(meta *ReqMeta, instance *Provider) (*ListRiRecommendationResp, error)
ListRi(meta *ReqMeta, instance *Provider) (*ListRiResp, error)
ListRiUtil(meta *ReqMeta, instance *Provider) (*ListRiUtilResp, error)
ListRiCoverage(meta *ReqMeta, instance *Provider) (*ListRiCoverageResp, error)
ListRiServices(meta *ReqMeta) *ListRiServicesResp
}
Jarvis interface#
Please refer to Jarvis