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  }