2121from glanceclient .v2 import schemas
2222from openstackclient .image .v2 import image
2323from openstackclient .tests import fakes
24+ from openstackclient .tests .identity .v3 import fakes as identity_fakes
2425from openstackclient .tests .image .v2 import fakes as image_fakes
2526
2627
@@ -32,6 +33,96 @@ def setUp(self):
3233 # Get a shortcut to the ServerManager Mock
3334 self .images_mock = self .app .client_manager .image .images
3435 self .images_mock .reset_mock ()
36+ self .image_members_mock = self .app .client_manager .image .image_members
37+ self .image_members_mock .reset_mock ()
38+ self .project_mock = self .app .client_manager .identity .projects
39+ self .project_mock .reset_mock ()
40+ self .domain_mock = self .app .client_manager .identity .domains
41+ self .domain_mock .reset_mock ()
42+
43+
44+ class TestAddProjectToImage (TestImage ):
45+
46+ def setUp (self ):
47+ super (TestAddProjectToImage , self ).setUp ()
48+
49+ # This is the return value for utils.find_resource()
50+ self .images_mock .get .return_value = fakes .FakeResource (
51+ None ,
52+ copy .deepcopy (image_fakes .IMAGE ),
53+ loaded = True ,
54+ )
55+ self .image_members_mock .create .return_value = fakes .FakeResource (
56+ None ,
57+ copy .deepcopy (image_fakes .MEMBER ),
58+ loaded = True ,
59+ )
60+ self .project_mock .get .return_value = fakes .FakeResource (
61+ None ,
62+ copy .deepcopy (identity_fakes .PROJECT ),
63+ loaded = True ,
64+ )
65+ self .domain_mock .get .return_value = fakes .FakeResource (
66+ None ,
67+ copy .deepcopy (identity_fakes .DOMAIN ),
68+ loaded = True ,
69+ )
70+ # Get the command object to test
71+ self .cmd = image .AddProjectToImage (self .app , None )
72+
73+ def test_add_project_to_image_no_option (self ):
74+ arglist = [
75+ image_fakes .image_id ,
76+ identity_fakes .project_id ,
77+ ]
78+ verifylist = [
79+ ('image' , image_fakes .image_id ),
80+ ('project' , identity_fakes .project_id ),
81+ ]
82+ parsed_args = self .check_parser (self .cmd , arglist , verifylist )
83+
84+ # DisplayCommandBase.take_action() returns two tuples
85+ columns , data = self .cmd .take_action (parsed_args )
86+ self .image_members_mock .create .assert_called_with (
87+ image_fakes .image_id ,
88+ identity_fakes .project_id
89+ )
90+ collist = ('image_id' , 'member_id' , 'status' )
91+ self .assertEqual (collist , columns )
92+ datalist = (
93+ image_fakes .image_id ,
94+ identity_fakes .project_id ,
95+ image_fakes .member_status
96+ )
97+ self .assertEqual (datalist , data )
98+
99+ def test_add_project_to_image_with_option (self ):
100+ arglist = [
101+ image_fakes .image_id ,
102+ identity_fakes .project_id ,
103+ '--project-domain' , identity_fakes .domain_id ,
104+ ]
105+ verifylist = [
106+ ('image' , image_fakes .image_id ),
107+ ('project' , identity_fakes .project_id ),
108+ ('project_domain' , identity_fakes .domain_id ),
109+ ]
110+ parsed_args = self .check_parser (self .cmd , arglist , verifylist )
111+
112+ # DisplayCommandBase.take_action() returns two tuples
113+ columns , data = self .cmd .take_action (parsed_args )
114+ self .image_members_mock .create .assert_called_with (
115+ image_fakes .image_id ,
116+ identity_fakes .project_id
117+ )
118+ collist = ('image_id' , 'member_id' , 'status' )
119+ self .assertEqual (collist , columns )
120+ datalist = (
121+ image_fakes .image_id ,
122+ identity_fakes .project_id ,
123+ image_fakes .member_status
124+ )
125+ self .assertEqual (datalist , data )
35126
36127
37128class TestImageDelete (TestImage ):
@@ -298,6 +389,70 @@ def test_image_list_sort_option(self, si_mock):
298389 self .assertEqual (datalist , tuple (data ))
299390
300391
392+ class TestRemoveProjectImage (TestImage ):
393+
394+ def setUp (self ):
395+ super (TestRemoveProjectImage , self ).setUp ()
396+
397+ # This is the return value for utils.find_resource()
398+ self .images_mock .get .return_value = fakes .FakeResource (
399+ None ,
400+ copy .deepcopy (image_fakes .IMAGE ),
401+ loaded = True ,
402+ )
403+ self .project_mock .get .return_value = fakes .FakeResource (
404+ None ,
405+ copy .deepcopy (identity_fakes .PROJECT ),
406+ loaded = True ,
407+ )
408+ self .domain_mock .get .return_value = fakes .FakeResource (
409+ None ,
410+ copy .deepcopy (identity_fakes .DOMAIN ),
411+ loaded = True ,
412+ )
413+ self .image_members_mock .delete .return_value = None
414+ # Get the command object to test
415+ self .cmd = image .RemoveProjectImage (self .app , None )
416+
417+ def test_remove_project_image_no_options (self ):
418+ arglist = [
419+ image_fakes .image_id ,
420+ identity_fakes .project_id ,
421+ ]
422+ verifylist = [
423+ ('image' , image_fakes .image_id ),
424+ ('project' , identity_fakes .project_id ),
425+ ]
426+ parsed_args = self .check_parser (self .cmd , arglist , verifylist )
427+
428+ # DisplayCommandBase.take_action() returns two tuples
429+ self .cmd .take_action (parsed_args )
430+ self .image_members_mock .delete .assert_called_with (
431+ image_fakes .image_id ,
432+ identity_fakes .project_id ,
433+ )
434+
435+ def test_remove_project_image_with_options (self ):
436+ arglist = [
437+ image_fakes .image_id ,
438+ identity_fakes .project_id ,
439+ '--project-domain' , identity_fakes .domain_id ,
440+ ]
441+ verifylist = [
442+ ('image' , image_fakes .image_id ),
443+ ('project' , identity_fakes .project_id ),
444+ ('project_domain' , identity_fakes .domain_id ),
445+ ]
446+ parsed_args = self .check_parser (self .cmd , arglist , verifylist )
447+
448+ # DisplayCommandBase.take_action() returns two tuples
449+ self .cmd .take_action (parsed_args )
450+ self .image_members_mock .delete .assert_called_with (
451+ image_fakes .image_id ,
452+ identity_fakes .project_id ,
453+ )
454+
455+
301456class TestImageShow (TestImage ):
302457
303458 def setUp (self ):
0 commit comments