sharedvpc.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package google
  2. import (
  3. "fmt"
  4. "strings"
  5. "time"
  6. api "yunion.io/x/cloudmux/pkg/apis/compute"
  7. "yunion.io/x/cloudmux/pkg/cloudprovider"
  8. "yunion.io/x/pkg/errors"
  9. )
  10. type SSharedGlobalNetwork struct {
  11. GoogleTags
  12. client *SGoogleClient
  13. Network string
  14. Subnetworks []SXpnNetwork
  15. }
  16. func (network *SSharedGlobalNetwork) GetId() string {
  17. return getGlobalId(network.Network)
  18. }
  19. func (network *SSharedGlobalNetwork) GetGlobalId() string {
  20. return network.GetId()
  21. }
  22. func (network *SSharedGlobalNetwork) GetName() string {
  23. info := strings.Split(network.GetId(), "/")
  24. if len(info) == 6 {
  25. return fmt.Sprintf("%s(%s)", info[5], info[1])
  26. }
  27. return network.GetId()
  28. }
  29. func (network *SSharedGlobalNetwork) GetStatus() string {
  30. return api.GLOBAL_VPC_STATUS_AVAILABLE
  31. }
  32. func (network *SSharedGlobalNetwork) IsEmulated() bool {
  33. return true
  34. }
  35. func (network *SSharedGlobalNetwork) Refresh() error {
  36. return nil
  37. }
  38. func (network *SSharedGlobalNetwork) GetCreatedAt() time.Time {
  39. return time.Time{}
  40. }
  41. func (network *SSharedGlobalNetwork) GetDescription() string {
  42. return ""
  43. }
  44. func (network *SSharedGlobalNetwork) GetISecurityGroups() ([]cloudprovider.ICloudSecurityGroup, error) {
  45. return []cloudprovider.ICloudSecurityGroup{}, nil
  46. }
  47. func (network *SSharedGlobalNetwork) CreateISecurityGroup(opts *cloudprovider.SecurityGroupCreateInput) (cloudprovider.ICloudSecurityGroup, error) {
  48. return nil, cloudprovider.ErrNotSupported
  49. }
  50. func (network *SSharedGlobalNetwork) Delete() error {
  51. return cloudprovider.ErrNotSupported
  52. }
  53. func (client *SGoogleClient) GetSharedGlobalNetworks() ([]SSharedGlobalNetwork, error) {
  54. xhosts, err := client.GetXpnHosts()
  55. if err != nil {
  56. if e, ok := err.(*gError); ok && e.ErrorInfo.Code == 400 {
  57. return []SSharedGlobalNetwork{}, nil
  58. }
  59. return nil, errors.Wrapf(err, "GetXpnHosts")
  60. }
  61. ret := []SSharedGlobalNetwork{}
  62. networkMap := map[string][]SXpnNetwork{}
  63. for _, xhost := range xhosts {
  64. resources, err := client.GetXpnResources(xhost.Name)
  65. if err != nil {
  66. return nil, errors.Wrapf(err, "GetXpnResources(%s)", xhost.Name)
  67. }
  68. for _, resource := range resources {
  69. if strings.EqualFold(resource.Type, "project") && resource.Id == client.projectId {
  70. networks, err := client.GetXpnNetworks(xhost.Name)
  71. if err != nil {
  72. return nil, errors.Wrapf(err, "GetXpnNetworks(%s)", xhost.Name)
  73. }
  74. for i := range networks {
  75. _, ok := networkMap[networks[i].Network]
  76. if !ok {
  77. networkMap[networks[i].Network] = []SXpnNetwork{}
  78. }
  79. networkMap[networks[i].Network] = append(networkMap[networks[i].Network], networks[i])
  80. }
  81. }
  82. }
  83. }
  84. for network, subnetworks := range networkMap {
  85. ret = append(ret, SSharedGlobalNetwork{
  86. client: client,
  87. Network: network,
  88. Subnetworks: subnetworks,
  89. })
  90. }
  91. return ret, nil
  92. }