如何实现新的 Provider Plugin

截止到目前,OpenPitrix 支持以下几种 Provider Plugin:

  • QingCloud
  • AWS
  • Kubernetes

如果您希望实现一个新的 Provider Plugin,可按照以下几步进行:

实现 ProviderInterface 中所有函数

  • pkg/plugins/ 目录下创建一个以该 Provider Plugin 名称命名的文件夹。
  • 创建 provider.go 实现 “pkg/plugins/plugin.go” 中 ProviderInterface 的所有函数。如果实现 VM-Based 类型的 Provider Plugin,provider.go 的实现可参考 “pkg/plugins/aws/provider.go” 或者 “pkg/plugins/qingcloud/provider.go”。
  1. type ProviderInterface interface {
  2. // 通过 versionId 获取应用配置包,根据用户输入 conf 配置,将真实应用实例信息写入 clusterWrapper,后续会写入 db
  3. ParseClusterConf(ctx context.Context, versionId, runtimeId, conf string, clusterWrapper *models.ClusterWrapper) error
  4. // 将 job 拆分成多层的 task,以便后续逐层执行
  5. SplitJobIntoTasks(ctx context.Context, job *models.Job) (*models.TaskLayer, error)
  6. // 处理 task
  7. HandleSubtask(ctx context.Context, task *models.Task) error
  8. // 等待 task 执行完成
  9. WaitSubtask(ctx context.Context, task *models.Task) error
  10. // 获取当前 runtime 所有可部署应用实例的 subnet
  11. DescribeSubnets(ctx context.Context, req *pb.DescribeSubnetsRequest) (*pb.DescribeSubnetsResponse, error)
  12. // 获取当前 runtime 所有可部署应用实例的 vpc
  13. DescribeVpc(ctx context.Context, runtimeId, vpcId string) (*models.Vpc, error)
  14. // 校验当前 runtime 资源情况,比如 quota 信息等
  15. CheckResource(ctx context.Context, clusterWrapper *models.ClusterWrapper) error
  16. // 校验当前 runtime 下 api server 的 url,credential 信息,可用区(zone)
  17. ValidateCredential(ctx context.Context, url, credential, zone string) error
  18. // 获取用户在当前 runtime 下所有可用区(zone)
  19. DescribeRuntimeProviderZones(ctx context.Context, url, credential string) ([]string, error)
  20. // 更新应用实例状态,根据 runtime 中资源情况,更新应用实例或应用实例节点的状态
  21. UpdateClusterStatus(ctx context.Context, job *models.Job) error
  22. // 获取应用实例更多详情信息,可在 DescribeClusters 时调用展示更多信息
  23. DescribeClusterDetails(ctx context.Context, cluster *models.ClusterWrapper) error
  24. }

实现 ProviderHandlerInterface 中所有函数 [可选]

如果实现 VM-Based 类型的 Provider Plugin,需要完成此步,应用实例的所有生命周期会自动按照 FrameInterface 中定义的方式操作。

  • 创建 provider_handler.go 实现 “pkg/plugins/vmbased/handler_interface.go” 中 ProviderHandlerInterface 的所有函数。
  1. type ProviderHandlerInterface interface {
  2. // 创建主机
  3. RunInstances(task *models.Task) error
  4. // 等待创建主机完成
  5. WaitRunInstances(task *models.Task) error
  6. // 关闭主机
  7. StopInstances(task *models.Task) error
  8. // 等待关闭主机完成
  9. WaitStopInstances(task *models.Task) error
  10. // 启动主机
  11. StartInstances(task *models.Task) error
  12. // 等待启动主机完成
  13. WaitStartInstances(task *models.Task) error
  14. // 删除主机
  15. DeleteInstances(task *models.Task) error
  16. // 等待删除主机完成
  17. WaitDeleteInstances(task *models.Task) error
  18. // 扩容主机
  19. ResizeInstances(task *models.Task) error
  20. // 等待扩容主机完成
  21. WaitResizeInstances(task *models.Task) error
  22. // 创建硬盘
  23. CreateVolumes(task *models.Task) error
  24. // 等待创建硬盘完成
  25. WaitCreateVolumes(task *models.Task) error
  26. // 卸载硬盘
  27. DetachVolumes(task *models.Task) error
  28. // 等待卸载硬盘完成
  29. WaitDetachVolumes(task *models.Task) error
  30. // 挂载硬盘
  31. AttachVolumes(task *models.Task) error
  32. // 等待挂载硬盘完成
  33. WaitAttachVolumes(task *models.Task) error
  34. // 删除硬盘
  35. DeleteVolumes(task *models.Task) error
  36. // 等待删除硬盘完成
  37. WaitDeleteVolumes(task *models.Task) error
  38. // 扩容硬盘
  39. ResizeVolumes(task *models.Task) error
  40. // 等待扩容硬盘完成
  41. WaitResizeVolumes(task *models.Task) error
  42. // 等待 frontgate 可用,该方法已在 FrameHandler 中实现
  43. WaitFrontgateAvailable(task *models.Task) error
  44. }

配置中增加该 Provider Plugin 支持

  • “pkg/plugins/plugin.go” 中 init 函数部分注册该 Provider Plugin。
  1. func init() {
  2. RegisterProvider(constants.ProviderKubernetes, helm.NewProvider())
  3. RegisterProvider(constants.ProviderQingCloud, qingcloud.NewProvider())
  4. RegisterProvider(constants.ProviderAWS, aws.NewProvider())
  5. }