2013-11-27 11:19:24 +00:00
# -*- coding: utf-8 -*-
2012-06-30 16:43:44 +00:00
'''
tests for user state
user absent
user present
user present with custom homedir
'''
2013-06-27 12:56:39 +00:00
# Import python libs
2014-11-21 19:05:13 +00:00
from __future__ import absolute_import
2012-06-30 23:51:11 +00:00
import os
2016-05-05 14:06:07 +00:00
import sys
2016-04-29 16:40:54 +00:00
from random import randint
2012-07-30 19:15:35 +00:00
import grp
2013-06-24 22:53:59 +00:00
# Import Salt Testing libs
2013-06-24 19:06:49 +00:00
from salttesting import skipIf
2013-09-04 19:05:41 +00:00
from salttesting . helpers import (
destructiveTest ,
ensure_in_syspath ,
requires_system_grains
)
2013-06-27 12:56:39 +00:00
ensure_in_syspath ( ' ../../ ' )
# Import salt libs
2016-03-03 02:56:09 +00:00
import salt . utils
2013-06-27 12:56:39 +00:00
import integration
2012-06-30 16:43:44 +00:00
2016-04-29 16:40:54 +00:00
if salt . utils . is_darwin ( ) :
USER = ' macuser '
GROUP = ' macuser '
GID = randint ( 400 , 500 )
NOGROUPGID = randint ( 400 , 500 )
else :
USER = ' nobody '
GROUP = ' nobody '
GID = ' nobody '
NOGROUPGID = ' nogroup '
2012-06-30 16:43:44 +00:00
2012-11-21 12:19:18 +00:00
class UserTest ( integration . ModuleCase ,
integration . SaltReturnAssertsMixIn ) :
2012-06-30 16:43:44 +00:00
'''
test for user absent
'''
2016-04-29 16:40:54 +00:00
@destructiveTest
@skipIf ( os . geteuid ( ) != 0 , ' you must be root to run this test ' )
def setUp ( self ) :
if salt . utils . is_darwin ( ) :
#on mac we need to add user, because there is
#no creationtime for nobody user.
add_user = self . run_function ( ' user.add ' , [ USER ] , gid = GID )
@destructiveTest
@skipIf ( os . geteuid ( ) != 0 , ' you must be root to run this test ' )
2012-06-30 16:43:44 +00:00
def test_user_absent ( self ) :
ret = self . run_state ( ' user.absent ' , name = ' unpossible ' )
2012-11-21 12:34:26 +00:00
self . assertSaltTrueReturn ( ret )
2012-06-30 16:43:44 +00:00
2016-04-29 16:40:54 +00:00
@destructiveTest
@skipIf ( os . geteuid ( ) != 0 , ' you must be root to run this test ' )
2012-06-30 23:51:11 +00:00
def test_user_if_present ( self ) :
2016-04-29 16:40:54 +00:00
ret = self . run_state ( ' user.present ' , name = USER )
2012-11-21 12:34:26 +00:00
self . assertSaltTrueReturn ( ret )
2012-06-30 16:43:44 +00:00
2016-04-29 16:40:54 +00:00
@destructiveTest
@skipIf ( os . geteuid ( ) != 0 , ' you must be root to run this test ' )
2013-03-12 07:22:52 +00:00
def test_user_if_present_with_gid ( self ) :
2016-04-29 16:40:54 +00:00
if self . run_function ( ' group.info ' , [ USER ] ) :
ret = self . run_state ( ' user.present ' , name = USER , gid = GID )
2013-03-12 07:22:52 +00:00
elif self . run_function ( ' group.info ' , [ ' nogroup ' ] ) :
2016-04-29 16:40:54 +00:00
ret = self . run_state ( ' user.present ' , name = USER , gid = NOGROUPGID )
2013-03-12 07:22:52 +00:00
else :
2013-06-27 12:56:39 +00:00
self . skipTest (
' Neither \' nobody \' nor \' nogroup \' are valid groups '
)
2013-03-12 07:22:52 +00:00
self . assertSaltTrueReturn ( ret )
2012-09-29 22:16:08 +00:00
@destructiveTest
2013-04-30 17:32:21 +00:00
@skipIf ( os . geteuid ( ) != 0 , ' you must be root to run this test ' )
2012-06-30 23:51:11 +00:00
def test_user_not_present ( self ) :
2013-03-12 06:00:30 +00:00
'''
2012-06-30 23:51:11 +00:00
This is a DESTRUCTIVE TEST it creates a new user on the minion .
2012-07-01 00:28:48 +00:00
And then destroys that user .
2012-06-30 23:51:11 +00:00
Assume that it will break any system you run it on .
2013-03-12 06:00:30 +00:00
'''
2012-07-20 06:21:01 +00:00
ret = self . run_state ( ' user.present ' , name = ' salt_test ' )
2012-11-21 12:34:26 +00:00
self . assertSaltTrueReturn ( ret )
2012-07-01 00:28:48 +00:00
ret = self . run_state ( ' user.absent ' , name = ' salt_test ' )
2012-11-21 12:34:26 +00:00
self . assertSaltTrueReturn ( ret )
2012-06-30 16:43:44 +00:00
2015-04-22 08:23:29 +00:00
@destructiveTest
@skipIf ( os . geteuid ( ) != 0 , ' you must be root to run this test ' )
def test_user_present_when_home_dir_does_not_18843 ( self ) :
'''
This is a DESTRUCTIVE TEST it creates a new user on the minion .
And then destroys that user .
Assume that it will break any system you run it on .
'''
2016-04-26 21:32:11 +00:00
if salt . utils . is_darwin ( ) :
HOMEDIR = ' /Users/home_of_salt_test '
else :
HOMEDIR = ' /home/home_of_salt_test '
2015-04-22 08:23:29 +00:00
ret = self . run_state ( ' user.present ' , name = ' salt_test ' ,
home = HOMEDIR )
self . assertSaltTrueReturn ( ret )
self . run_function ( ' file.absent ' , name = HOMEDIR )
ret = self . run_state ( ' user.present ' , name = ' salt_test ' ,
home = HOMEDIR )
self . assertSaltTrueReturn ( ret )
ret = self . run_state ( ' user.absent ' , name = ' salt_test ' )
self . assertSaltTrueReturn ( ret )
2012-09-29 22:16:08 +00:00
@destructiveTest
2013-04-30 17:32:21 +00:00
@skipIf ( os . geteuid ( ) != 0 , ' you must be root to run this test ' )
2012-06-30 23:51:11 +00:00
def test_user_present_nondefault ( self ) :
2013-03-12 06:00:30 +00:00
'''
2012-06-30 23:51:11 +00:00
This is a DESTRUCTIVE TEST it creates a new user on the on the minion .
2013-03-12 06:00:30 +00:00
'''
2012-06-30 23:51:11 +00:00
ret = self . run_state ( ' user.present ' , name = ' salt_test ' ,
2012-07-20 06:21:01 +00:00
home = ' /var/lib/salt_test ' )
2012-11-21 12:34:26 +00:00
self . assertSaltTrueReturn ( ret )
self . assertTrue ( os . path . isdir ( ' /var/lib/salt_test ' ) )
2012-07-01 00:28:48 +00:00
ret = self . run_state ( ' user.absent ' , name = ' salt_test ' )
2012-11-21 12:34:26 +00:00
self . assertSaltTrueReturn ( ret )
2012-07-01 00:28:48 +00:00
2012-09-29 22:16:08 +00:00
@destructiveTest
2013-04-30 17:32:21 +00:00
@skipIf ( os . geteuid ( ) != 0 , ' you must be root to run this test ' )
2013-09-04 19:05:41 +00:00
@requires_system_grains
def test_user_present_gid_from_name_default ( self , grains = None ) :
2013-03-12 06:00:30 +00:00
'''
2012-11-25 19:20:57 +00:00
This is a DESTRUCTIVE TEST . It creates a new user on the on the minion .
2012-07-30 19:15:35 +00:00
This is an integration test . Not all systems will automatically create
a group of the same name as the user , but I don ' t have access to any.
If you run the test and it fails , please fix the code it ' s testing to
work on your operating system .
2013-03-12 06:00:30 +00:00
'''
2016-03-03 06:10:34 +00:00
# MacOS users' primary group defaults to staff (20), not the name of
# user
gid_from_name = False if grains [ ' os_family ' ] == ' MacOS ' else True
2012-07-30 19:15:35 +00:00
ret = self . run_state ( ' user.present ' , name = ' salt_test ' ,
2016-03-03 06:10:34 +00:00
gid_from_name = gid_from_name , home = ' /var/lib/salt_test ' )
2012-11-21 12:34:26 +00:00
self . assertSaltTrueReturn ( ret )
2012-11-25 19:20:57 +00:00
ret = self . run_function ( ' user.info ' , [ ' salt_test ' ] )
2012-11-25 22:29:08 +00:00
self . assertReturnNonEmptySaltType ( ret )
2012-11-25 19:20:57 +00:00
group_name = grp . getgrgid ( ret [ ' gid ' ] ) . gr_name
2012-11-21 12:34:26 +00:00
self . assertTrue ( os . path . isdir ( ' /var/lib/salt_test ' ) )
2016-09-01 22:28:13 +00:00
if grains [ ' os_family ' ] in ( ' Suse ' , ) :
2013-09-04 18:41:20 +00:00
self . assertEqual ( group_name , ' users ' )
2016-03-03 06:10:34 +00:00
elif grains [ ' os_family ' ] == ' MacOS ' :
self . assertEqual ( group_name , ' staff ' )
2013-09-04 18:41:20 +00:00
else :
self . assertEqual ( group_name , ' salt_test ' )
2012-11-25 19:20:57 +00:00
2012-07-30 19:15:35 +00:00
ret = self . run_state ( ' user.absent ' , name = ' salt_test ' )
2012-11-21 12:34:26 +00:00
self . assertSaltTrueReturn ( ret )
2012-07-30 19:15:35 +00:00
2012-09-29 22:16:08 +00:00
@destructiveTest
2013-04-30 17:32:21 +00:00
@skipIf ( os . geteuid ( ) != 0 , ' you must be root to run this test ' )
2012-07-30 19:15:35 +00:00
def test_user_present_gid_from_name ( self ) :
2013-03-12 06:00:30 +00:00
'''
2012-07-30 19:15:35 +00:00
This is a DESTRUCTIVE TEST it creates a new user on the on the minion .
This is a unit test , NOT an integration test . We create a group of the
same name as the user beforehand , so it should all run smoothly .
2013-03-12 06:00:30 +00:00
'''
2012-07-30 19:15:35 +00:00
ret = self . run_state ( ' group.present ' , name = ' salt_test ' )
2012-11-21 12:34:26 +00:00
self . assertSaltTrueReturn ( ret )
2012-07-30 19:15:35 +00:00
ret = self . run_state ( ' user.present ' , name = ' salt_test ' ,
gid_from_name = True , home = ' /var/lib/salt_test ' )
2012-11-21 12:34:26 +00:00
self . assertSaltTrueReturn ( ret )
2012-11-25 19:20:57 +00:00
ret = self . run_function ( ' user.info ' , [ ' salt_test ' ] )
2012-11-25 22:29:08 +00:00
self . assertReturnNonEmptySaltType ( ret )
2012-11-25 19:20:57 +00:00
group_name = grp . getgrgid ( ret [ ' gid ' ] ) . gr_name
2012-11-21 12:34:26 +00:00
self . assertTrue ( os . path . isdir ( ' /var/lib/salt_test ' ) )
self . assertEqual ( group_name , ' salt_test ' )
2012-07-30 19:15:35 +00:00
ret = self . run_state ( ' user.absent ' , name = ' salt_test ' )
2012-11-21 12:34:26 +00:00
self . assertSaltTrueReturn ( ret )
2012-07-30 19:15:35 +00:00
ret = self . run_state ( ' group.absent ' , name = ' salt_test ' )
2012-11-21 12:34:26 +00:00
self . assertSaltTrueReturn ( ret )
2016-04-18 14:56:40 +00:00
@destructiveTest
@skipIf ( os . geteuid ( ) != 0 , ' you must be root to run this test ' )
2016-05-05 14:06:07 +00:00
@skipIf ( sys . getfilesystemencoding ( ) . startswith ( ' ANSI ' ) , ' A system encoding which supports Unicode characters must be set. Current setting is: {0} . Try setting $LANG= \' en_US.UTF-8 \' ' . format ( sys . getfilesystemencoding ( ) ) )
2016-04-18 14:56:40 +00:00
def test_user_present_unicode ( self ) :
'''
This is a DESTRUCTIVE TEST it creates a new user on the on the minion .
It ensures that unicode GECOS data will be properly handled , without
any encoding - related failures .
'''
ret = self . run_state (
' user.present ' , name = ' salt_test ' , fullname = u ' Sålt Test ' , roomnumber = u ' ①②③ ' ,
workphone = u ' ١٢٣٤ ' , homephone = u ' ६७८ '
)
self . assertSaltTrueReturn ( ret )
# Ensure updating a user also works
ret = self . run_state (
' user.present ' , name = ' salt_test ' , fullname = u ' Sølt Test ' , roomnumber = u ' ①③② ' ,
workphone = u ' ٣٤١٢ ' , homephone = u ' ६८७ '
)
self . assertSaltTrueReturn ( ret )
2016-05-05 14:06:07 +00:00
# ret = self.run_state('user.absent', name='salt_test')
# self.assertSaltTrueReturn(ret)
2012-07-30 19:15:35 +00:00
2013-12-06 22:16:38 +00:00
@destructiveTest
@skipIf ( os . geteuid ( ) != 0 , ' you must be root to run this test ' )
def test_user_present_gecos ( self ) :
'''
This is a DESTRUCTIVE TEST it creates a new user on the on the minion .
It ensures that numeric GECOS data will be properly coerced to strings ,
otherwise the state will fail because the GECOS fields are written as
strings ( and show up in the user . info output as such ) . Thus the
comparison will fail , since ' 12345 ' != 12345.
'''
ret = self . run_state (
' user.present ' , name = ' salt_test ' , fullname = 12345 , roomnumber = 123 ,
workphone = 1234567890 , homephone = 1234567890
)
self . assertSaltTrueReturn ( ret )
ret = self . run_state ( ' user.absent ' , name = ' salt_test ' )
self . assertSaltTrueReturn ( ret )
2015-08-07 07:25:21 +00:00
@destructiveTest
@skipIf ( os . geteuid ( ) != 0 , ' you must be root to run this test ' )
def test_user_present_gecos_none_fields ( self ) :
'''
This is a DESTRUCTIVE TEST it creates a new user on the on the minion .
It ensures that if no GECOS data is supplied , the fields will be coerced
into empty strings as opposed to the string " None " .
'''
ret = self . run_state (
' user.present ' , name = ' salt_test ' , fullname = None , roomnumber = None ,
workphone = None , homephone = None
)
self . assertSaltTrueReturn ( ret )
ret = self . run_function ( ' user.info ' , [ ' salt_test ' ] )
self . assertReturnNonEmptySaltType ( ret )
self . assertEqual ( ' ' , ret [ ' fullname ' ] )
2016-03-03 02:56:09 +00:00
# MacOS does not supply the following GECOS fields
if not salt . utils . is_darwin ( ) :
self . assertEqual ( ' ' , ret [ ' roomnumber ' ] )
self . assertEqual ( ' ' , ret [ ' workphone ' ] )
self . assertEqual ( ' ' , ret [ ' homephone ' ] )
2015-08-07 07:25:21 +00:00
ret = self . run_state ( ' user.absent ' , name = ' salt_test ' )
self . assertSaltTrueReturn ( ret )
2016-04-29 16:40:54 +00:00
@destructiveTest
@skipIf ( os . geteuid ( ) != 0 , ' you must be root to run this test ' )
def tearDown ( self ) :
if salt . utils . is_darwin ( ) :
check_user = self . run_function ( ' user.list_users ' )
if USER in check_user :
del_user = self . run_function ( ' user.delete ' , [ USER ] , remove = True )
2013-06-24 22:53:59 +00:00
2012-07-20 06:21:01 +00:00
if __name__ == ' __main__ ' :
from integration import run_tests
run_tests ( UserTest )