github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/state/migrations/remoteapplications_test.go (about) 1 // Copyright 2019 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package migrations 5 6 import ( 7 "github.com/juju/description/v5" 8 "github.com/juju/errors" 9 "github.com/juju/names/v5" 10 jc "github.com/juju/testing/checkers" 11 "go.uber.org/mock/gomock" 12 gc "gopkg.in/check.v1" 13 ) 14 15 type RemoteApplicationsExportSuite struct{} 16 17 var _ = gc.Suite(&RemoteApplicationsExportSuite{}) 18 19 func (s *RemoteApplicationsExportSuite) TestExportRemoteApplication(c *gc.C) { 20 ctrl := gomock.NewController(c) 21 defer ctrl.Finish() 22 23 entities := []MigrationRemoteApplication{ 24 s.migrationRemoteApplication(ctrl, func(expect *MockMigrationRemoteApplicationMockRecorder) { 25 expect.Tag().Return(names.NewApplicationTag("uuid-1")) 26 expect.OfferUUID().Return("offer-uuid") 27 expect.URL().Return("me/model.foo", true) 28 expect.SourceModel().Return(names.NewModelTag("uuid-2")) 29 expect.IsConsumerProxy().Return(false) 30 expect.Macaroon().Return("mac") 31 expect.ConsumeVersion().Return(1) 32 expect.Bindings().Return(map[string]string{ 33 "binding-key": "binding-value", 34 }) 35 // Return the endpoint mocks 36 expect.Endpoints().Return([]MigrationRemoteEndpoint{ 37 { 38 Name: "app-uuid-1-endpoint-1", 39 Role: "role", 40 Interface: "db", 41 }, 42 }, nil) 43 // Return the spaces mocks 44 expect.Spaces().Return([]MigrationRemoteSpace{ 45 { 46 Name: "app-uuid-1-spaces-1", 47 CloudType: "aws", 48 ProviderId: "provider-id-1", 49 ProviderAttributes: map[string]interface{}{ 50 "attr-1": "value-1", 51 }, 52 Subnets: []MigrationRemoteSubnet{ 53 { 54 CIDR: "10.0.0.1/24", 55 ProviderId: "provider-id-2", 56 VLANTag: 1, 57 AvailabilityZones: []string{"eu-west-1"}, 58 ProviderSpaceId: "provider-space-id", 59 ProviderNetworkId: "provider-network-id", 60 }, 61 }, 62 }, 63 }) 64 65 expect.GlobalKey().Return("c#app-uuid-1") 66 }), 67 } 68 69 remoteSpace := NewMockRemoteSpace(ctrl) 70 remoteSpace.EXPECT().AddSubnet(description.SubnetArgs{ 71 CIDR: "10.0.0.1/24", 72 ProviderId: "provider-id-2", 73 VLANTag: 1, 74 AvailabilityZones: []string{"eu-west-1"}, 75 ProviderSpaceId: "provider-space-id", 76 ProviderNetworkId: "provider-network-id", 77 }) 78 79 remoteApplication := NewMockRemoteApplication(ctrl) 80 remoteApplication.EXPECT().SetStatus(description.StatusArgs{ 81 Value: "status-value", 82 }) 83 remoteApplication.EXPECT().AddEndpoint(description.RemoteEndpointArgs{ 84 Name: "app-uuid-1-endpoint-1", 85 Role: "role", 86 Interface: "db", 87 }) 88 remoteApplication.EXPECT().AddSpace(description.RemoteSpaceArgs{ 89 Name: "app-uuid-1-spaces-1", 90 CloudType: "aws", 91 ProviderId: "provider-id-1", 92 ProviderAttributes: map[string]interface{}{ 93 "attr-1": "value-1", 94 }, 95 }).Return(remoteSpace) 96 97 source := NewMockRemoteApplicationSource(ctrl) 98 source.EXPECT().AllRemoteApplications().Return(entities, nil) 99 source.EXPECT().StatusArgs("c#app-uuid-1").Return(description.StatusArgs{ 100 Value: "status-value", 101 }, nil) 102 103 model := NewMockRemoteApplicationModel(ctrl) 104 model.EXPECT().AddRemoteApplication(description.RemoteApplicationArgs{ 105 Tag: names.NewApplicationTag("uuid-1"), 106 OfferUUID: "offer-uuid", 107 URL: "me/model.foo", 108 SourceModel: names.NewModelTag("uuid-2"), 109 IsConsumerProxy: false, 110 Macaroon: "mac", 111 ConsumeVersion: 1, 112 Bindings: map[string]string{ 113 "binding-key": "binding-value", 114 }, 115 }).Return(remoteApplication) 116 117 migration := ExportRemoteApplications{} 118 err := migration.Execute(source, model) 119 c.Assert(err, jc.ErrorIsNil) 120 } 121 122 func (s *RemoteApplicationsExportSuite) TestExportRemoteApplicationWithSourceFailure(c *gc.C) { 123 ctrl := gomock.NewController(c) 124 defer ctrl.Finish() 125 126 source := NewMockRemoteApplicationSource(ctrl) 127 source.EXPECT().AllRemoteApplications().Return(nil, errors.New("fail")) 128 129 model := NewMockRemoteApplicationModel(ctrl) 130 131 migration := ExportRemoteApplications{} 132 err := migration.Execute(source, model) 133 c.Assert(err, gc.ErrorMatches, "fail") 134 } 135 136 func (s *RemoteApplicationsExportSuite) TestExportRemoteApplicationWithEndpointsFailure(c *gc.C) { 137 ctrl := gomock.NewController(c) 138 defer ctrl.Finish() 139 140 entities := []MigrationRemoteApplication{ 141 s.migrationRemoteApplication(ctrl, func(expect *MockMigrationRemoteApplicationMockRecorder) { 142 expect.Tag().Return(names.NewApplicationTag("uuid-1")) 143 expect.OfferUUID().Return("offer-uuid") 144 expect.URL().Return("me/model.foo", true) 145 expect.SourceModel().Return(names.NewModelTag("uuid-2")) 146 expect.IsConsumerProxy().Return(false) 147 expect.Macaroon().Return("mac") 148 expect.ConsumeVersion().Return(1) 149 expect.Bindings().Return(map[string]string{ 150 "binding-key": "binding-value", 151 }) 152 // Return the endpoint mocks 153 expect.Endpoints().Return(nil, errors.New("fail")) 154 expect.GlobalKey().Return("c#app-uuid-1") 155 }), 156 } 157 158 remoteApplication := NewMockRemoteApplication(ctrl) 159 remoteApplication.EXPECT().SetStatus(description.StatusArgs{ 160 Value: "status-value", 161 }) 162 163 source := NewMockRemoteApplicationSource(ctrl) 164 source.EXPECT().AllRemoteApplications().Return(entities, nil) 165 source.EXPECT().StatusArgs("c#app-uuid-1").Return(description.StatusArgs{ 166 Value: "status-value", 167 }, nil) 168 169 model := NewMockRemoteApplicationModel(ctrl) 170 model.EXPECT().AddRemoteApplication(description.RemoteApplicationArgs{ 171 Tag: names.NewApplicationTag("uuid-1"), 172 OfferUUID: "offer-uuid", 173 URL: "me/model.foo", 174 SourceModel: names.NewModelTag("uuid-2"), 175 IsConsumerProxy: false, 176 Macaroon: "mac", 177 ConsumeVersion: 1, 178 Bindings: map[string]string{ 179 "binding-key": "binding-value", 180 }, 181 }).Return(remoteApplication) 182 183 migration := ExportRemoteApplications{} 184 err := migration.Execute(source, model) 185 c.Assert(err, gc.ErrorMatches, "fail") 186 } 187 188 func (s *RemoteApplicationsExportSuite) TestExportRemoteApplicationWithStatusArgsFailure(c *gc.C) { 189 ctrl := gomock.NewController(c) 190 defer ctrl.Finish() 191 192 entities := []MigrationRemoteApplication{ 193 s.migrationRemoteApplication(ctrl, func(expect *MockMigrationRemoteApplicationMockRecorder) { 194 expect.Tag().Return(names.NewApplicationTag("uuid-1")) 195 expect.OfferUUID().Return("offer-uuid") 196 expect.URL().Return("me/model.foo", true) 197 expect.SourceModel().Return(names.NewModelTag("uuid-2")) 198 expect.IsConsumerProxy().Return(false) 199 expect.Macaroon().Return("mac") 200 expect.ConsumeVersion().Return(1) 201 expect.Bindings().Return(map[string]string{ 202 "binding-key": "binding-value", 203 }) 204 205 expect.GlobalKey().Return("c#app-uuid-1") 206 }), 207 } 208 209 remoteApplication := NewMockRemoteApplication(ctrl) 210 211 source := NewMockRemoteApplicationSource(ctrl) 212 source.EXPECT().AllRemoteApplications().Return(entities, nil) 213 source.EXPECT().StatusArgs("c#app-uuid-1").Return(description.StatusArgs{ 214 Value: "status-value", 215 }, errors.New("fail")) 216 217 model := NewMockRemoteApplicationModel(ctrl) 218 model.EXPECT().AddRemoteApplication(description.RemoteApplicationArgs{ 219 Tag: names.NewApplicationTag("uuid-1"), 220 OfferUUID: "offer-uuid", 221 URL: "me/model.foo", 222 SourceModel: names.NewModelTag("uuid-2"), 223 IsConsumerProxy: false, 224 Macaroon: "mac", 225 ConsumeVersion: 1, 226 Bindings: map[string]string{ 227 "binding-key": "binding-value", 228 }, 229 }).Return(remoteApplication) 230 231 migration := ExportRemoteApplications{} 232 err := migration.Execute(source, model) 233 c.Assert(err, gc.ErrorMatches, "fail") 234 } 235 236 func (s *RemoteApplicationsExportSuite) migrationRemoteApplication( 237 ctrl *gomock.Controller, fn func(expect *MockMigrationRemoteApplicationMockRecorder), 238 ) *MockMigrationRemoteApplication { 239 entity := NewMockMigrationRemoteApplication(ctrl) 240 fn(entity.EXPECT()) 241 return entity 242 }