def test_remove(self):
        """
        Verify that the remove method can remove items from the store.
        """
        temp_dir = os.path.join(self._mktmp(), 'syspurpose_file.json')
        test_data = {"already_present_key": ["preexisting_value"]}
        with io.open(temp_dir, 'w', encoding='utf-8') as f:
            utils.write_to_file_utf8(f, test_data)

        syspurpose_store = self.assertRaisesNothing(files.SyspurposeStore,
                                                    temp_dir)
        syspurpose_store.contents = dict(**test_data)

        # Remove an item from the store which we have previously seen
        res = self.assertRaisesNothing(syspurpose_store.remove,
                                       "already_present_key",
                                       "preexisting_value")
        self.assertIn("already_present_key", syspurpose_store.contents)
        self.assertEqual(syspurpose_store.contents["already_present_key"], [])
        self.assertTrue(
            res,
            "The remove method should return true when the store has changed")

        # Try to remove an item that we've previously not seen
        res = self.assertRaisesNothing(syspurpose_store.remove, "new_key",
                                       "any_value")
        self.assertFalse(
            res,
            "The remove method should return false when the store has not changed"
        )
    def test_add(self):
        """
        Verify that the add method of SyspurposeStore is able to add items to lists of items
        in the store, whether they existed prior or not.
        """
        temp_dir = os.path.join(self._mktmp(), 'syspurpose_file.json')
        test_data = {"already_present_key": ["preexisting_value"]}
        with io.open(temp_dir, 'w', encoding='utf-8') as f:
            utils.write_to_file_utf8(f, test_data)

        syspurpose_store = self.assertRaisesNothing(files.SyspurposeStore,
                                                    temp_dir)
        syspurpose_store.contents = dict(**test_data)

        # Brand new unseen key is added
        res = self.assertRaisesNothing(syspurpose_store.add, "new_key",
                                       "new_value")
        self.assertIn("new_key", syspurpose_store.contents)
        self.assertEqual(syspurpose_store.contents["new_key"], ["new_value"])
        self.assertTrue(
            res,
            "The add method should return true when the store has changed")

        # Add to an already seen existing key
        res = self.assertRaisesNothing(syspurpose_store.add,
                                       "already_present_key", "new_value_2")
        self.assertIn("already_present_key", syspurpose_store.contents)
        self.assertEqual(syspurpose_store.contents["already_present_key"],
                         ["preexisting_value", "new_value_2"])
        self.assertTrue(
            res,
            "The add method should return true when the store has changed")
    def test_unset_with_unicode_strings(self):
        """
        Verify that the unset method of SyspurposeStore is able to unset unicode strings from items
        in the store.
        """
        temp_dir = os.path.join(self._mktmp(), 'syspurpose_file.json')
        test_data = {u'ονόματα': [u'Νίκος']}
        with io.open(temp_dir, 'w', encoding='utf-8') as f:
            utils.write_to_file_utf8(f, test_data)

        syspurpose_store = self.assertRaisesNothing(files.SyspurposeStore,
                                                    temp_dir)
        syspurpose_store.contents = dict(**test_data)

        res = self.assertRaisesNothing(syspurpose_store.unset, "ονόματα")
        # We expect a value of true from this method when the store was changed
        self.assertTrue(
            res,
            "The unset method should return true when the store has changed")
        self.assertNotIn(u'ονόματα',
                         syspurpose_store.contents,
                         msg="Expected the key to no longer be present")

        res = self.assertRaisesNothing(syspurpose_store.unset, 'άκυρο_κλειδί')
        # We expect falsey values when the store was not modified
        self.assertFalse(
            res,
            "The unset method should return false when the store has not changed"
        )
        self.assertNotIn(
            u'άκυρο_κλειδί',
            syspurpose_store.contents,
            msg="The key passed to unset, has been added to the store")
예제 #4
0
    def _update_file(cls, path, data):
        """
        Write the contents of data to file in the first mode we can (effectively to create or update
        the file)
        :param path: The string path to the file location we should update
        :param data: The data to write to the file
        :return: None
        """

        # Check if /etc/rhsm/syspurpose directory exists
        cls._create_missing_dir(USER_SYSPURPOSE_DIR)
        # Check if /var/lib/rhsm/cache/ directory exists
        cls._create_missing_dir(CACHE_DIR)

        # Then we can try to create syspurpose.json file
        try:
            f = io.open(path, 'w+', encoding='utf-8')
        except OSError as e:
            if e.errno != 17:
                raise
        else:
            write_to_file_utf8(f, data)
            f.flush()
            f.close()
            log.debug('Successfully updated syspurpose values at \'%s\'.' %
                      path)
        log.debug('Failed to update syspurpose values at \'%s\'.' % path)
예제 #5
0
 def write(self, fp=None):
     """
     Write the current contents to the file at self.path
     """
     if not fp:
         with io.open(self.path, 'w', encoding='utf-8') as f:
             write_to_file_utf8(f, self.contents)
             f.flush()
     else:
         write_to_file_utf8(fp, self.contents)
예제 #6
0
 def write(self, fp=None):
     """
     Write the current contents to the file at self.path
     """
     if not fp:
         with io.open(self.path, 'w', encoding='utf-8') as f:
             write_to_file_utf8(f, self.contents)
             f.flush()
     else:
         write_to_file_utf8(fp, self.contents)
예제 #7
0
    def test_read(self):
        """
        Does read properly initialize a new SyspurposeStore?
        """
        temp_dir = os.path.join(self._mktmp(), 'syspurpose_file.json')
        test_data = {"arbitrary_key": "arbitrary_value"}

        with io.open(temp_dir, 'w', encoding='utf-8') as f:
            utils.write_to_file_utf8(f, test_data)

        syspurpose_store = self.assertRaisesNothing(files.SyspurposeStore.read, temp_dir)
        self.assertDictEqual(syspurpose_store.contents, test_data)
    def test_read(self):
        """
        Does read properly initialize a new SyspurposeStore?
        """
        temp_dir = os.path.join(self._mktmp(), 'syspurpose_file.json')
        test_data = {"arbitrary_key": "arbitrary_value"}

        with io.open(temp_dir, 'w', encoding='utf-8') as f:
            utils.write_to_file_utf8(f, test_data)

        syspurpose_store = self.assertRaisesNothing(files.SyspurposeStore.read, temp_dir)
        self.assertDictEqual(syspurpose_store.contents, test_data)
    def test_read_file_with_unicode_content(self):
        """
        The SyspurposeStore.read_file method should return True if the file with unicode content was successfully read.
        """
        temp_dir = os.path.join(self._mktmp(), 'syspurpose_file.json')
        test_data = {'key1': u'Νίκος', 'key2': [u'value_with_ř']}
        with io.open(temp_dir, 'w', encoding='utf-8') as f:
            utils.write_to_file_utf8(f, test_data)

        self.assertTrue(os.path.exists(temp_dir))

        syspurpose_store = self.assertRaisesNothing(files.SyspurposeStore, temp_dir)
        res = self.assertRaisesNothing(syspurpose_store.read_file)
        self.assertTrue(bool(res))
예제 #10
0
    def test_read_file_with_unicode_content(self):
        """
        The SyspurposeStore.read_file method should return True if the file with unicode content was successfully read.
        """
        temp_dir = os.path.join(self._mktmp(), 'syspurpose_file.json')
        test_data = {'key1': u'Νίκος', 'key2': [u'value_with_ř']}
        with io.open(temp_dir, 'w', encoding='utf-8') as f:
            utils.write_to_file_utf8(f, test_data)

        self.assertTrue(os.path.exists(temp_dir))

        syspurpose_store = self.assertRaisesNothing(files.SyspurposeStore, temp_dir)
        res = self.assertRaisesNothing(syspurpose_store.read_file)
        self.assertTrue(bool(res))
예제 #11
0
    def test_sync_object_update_consumer_set_data(self, mock_rhsm,
                                                  mock_exists):
        # Mocking of rhsm.config
        mock_rhsm.config = Mock()
        mock_rhsm.config.DEFAULT_PROXY_PORT = "3128"
        mock_rhsm.config.initConfig = Mock()
        instance_config = mock_rhsm.config.initConfig.return_value
        instance_config.get = Mock(return_value="/path/to/cert")
        # Mocking of rhsm.connection
        mock_rhsm.connection = Mock()
        mock_rhsm.connection.UEPConnection = Mock()
        instance_uep_connection = mock_rhsm.connection.UEPConnection.return_value
        instance_uep_connection.updateConsumer = Mock()
        # Mocking of rhsm.certificate
        mock_rhsm.certificate = Mock()
        mock_rhsm.certificate.create_from_file = Mock()
        instance_certificate = mock_rhsm.certificate.create_from_file.return_value
        instance_certificate.subject = Mock()
        instance_certificate.subject.get = Mock(
            return_value="9d4778ae-80fe-4eed-a631-6be35fded7fe")
        mock_exists.return_value = True

        syspurpose_sync = sync.SyspurposeSync("proxy.example.com", "1234",
                                              "user", "secret")

        temp_file = os.path.join(self._mktmp(), 'syspurpose_file.json')
        test_data = {
            "role": "foo-role",
            "service_level_agreement": "foo-sla",
            "addons": ["foo-addon", "bar-addon"],
            "usage": "foo-usage"
        }
        with io.open(temp_file, 'w', encoding='utf-8') as f:
            utils.write_to_file_utf8(f, test_data)

        syspurpose_store = files.SyspurposeStore(temp_file)
        syspurpose_store.contents = dict(**test_data)

        syspurpose_sync.send_syspurpose_to_candlepin(syspurpose_store)

        instance_uep_connection.updateConsumer.assert_called_once_with(
            uuid="9d4778ae-80fe-4eed-a631-6be35fded7fe",
            role="foo-role",
            service_level="foo-sla",
            addons=["foo-addon", "bar-addon"],
            usage="foo-usage")
예제 #12
0
    def update_file(path, data):
        """
        Write the contents of data to file in the first mode we can (effectively to create or update
        the file)
        :param path: The string path to the file location we should update
        :param data: The data to write to the file
        :return: None
        """

        # Check if /etc/rhsm/syspurpose directory exists
        if not os.path.isdir(USER_SYSPURPOSE_DIR):
            # If not create the file
            log.debug('Trying to create directory: %s' % USER_SYSPURPOSE_DIR)
            try:
                os.makedirs(USER_SYSPURPOSE_DIR, mode=0o755, exist_ok=True)
            except Exception as err:
                log.warning('Unable to create directory: %s, error: %s' %
                            (USER_SYSPURPOSE_DIR, err))

        # Check if /var/lib/rhsm/cache/ directory exists
        if not os.path.isdir(CACHE_DIR):
            log.debug('Creating directory: %s' % CACHE_DIR)
            try:
                os.makedirs(CACHE_DIR, mode=0o755, exist_ok=True)
            except Exception as err:
                log.warning('Unable to create directory: %s, error: %s' %
                            (CACHE_DIR, err))

        # Then we can try to create syspurpose.json file
        modes = ['w+']
        for mode in modes:
            try:
                f = io.open(path, mode, encoding='utf-8')
            except OSError as e:
                if e.errno != 17:
                    raise
            else:
                write_to_file_utf8(f, data)
                f.flush()
                f.close()
                log.debug('Successfully updated syspurpose values at \'%s\'.' %
                          path)
                return True
        log.debug('Failed to update syspurpose values at \'%s\'.' % path)
        return False
예제 #13
0
    def test_remove_with_unicode_strings(self):
        """
        Verify that the remove method of SyspurposeStore is able to remove unicode strings from lists of items
        in the store.
        """
        temp_dir = os.path.join(self._mktmp(), 'syspurpose_file.json')
        test_data = {u'ονόματα': [u'Νίκος', u'Κώστας']}
        with io.open(temp_dir, 'w', encoding='utf-8') as f:
            utils.write_to_file_utf8(f, test_data)

        syspurpose_store = self.assertRaisesNothing(files.SyspurposeStore, temp_dir)
        syspurpose_store.contents = dict(**test_data)

        # Remove from an already seen existing key
        res = self.assertRaisesNothing(syspurpose_store.remove, 'ονόματα', 'Κώστας')
        self.assertIn(u'ονόματα', syspurpose_store.contents)
        self.assertEqual(syspurpose_store.contents[u'ονόματα'], [u'Νίκος'])
        self.assertTrue(res, "The add method should return true when the store has changed")
예제 #14
0
    def test_add_new_value_to_key_with_null_value(self):
        """
        Verify that the add method of SyspurposeStore is able to add item to key with
        null value
        """
        temp_dir = os.path.join(self._mktmp(), 'syspurpose_file.json')
        test_data = {"already_present_key": None}
        with io.open(temp_dir, 'w', encoding='utf-8') as f:
            utils.write_to_file_utf8(f, test_data)

        syspurpose_store = self.assertRaisesNothing(files.SyspurposeStore, temp_dir)
        syspurpose_store.contents = dict(**test_data)

        # Brand new unseen key is added
        res = self.assertRaisesNothing(syspurpose_store.add, "already_present_key", "new_value")
        self.assertIn("already_present_key", syspurpose_store.contents)
        self.assertEqual(syspurpose_store.contents["already_present_key"], ["new_value"])
        self.assertTrue(res, "The add method should return true when the store has changed")
    def test_add_new_value_to_key_with_null_value(self):
        """
        Verify that the add method of SyspurposeStore is able to add item to key with
        null value
        """
        temp_dir = os.path.join(self._mktmp(), 'syspurpose_file.json')
        test_data = {"already_present_key": None}
        with io.open(temp_dir, 'w', encoding='utf-8') as f:
            utils.write_to_file_utf8(f, test_data)

        syspurpose_store = self.assertRaisesNothing(files.SyspurposeStore, temp_dir)
        syspurpose_store.contents = dict(**test_data)

        # Brand new unseen key is added
        res = self.assertRaisesNothing(syspurpose_store.add, "already_present_key", "new_value")
        self.assertIn("already_present_key", syspurpose_store.contents)
        self.assertEqual(syspurpose_store.contents["already_present_key"], ["new_value"])
        self.assertTrue(res, "The add method should return true when the store has changed")
    def test_remove_with_unicode_strings(self):
        """
        Verify that the remove method of SyspurposeStore is able to remove unicode strings from lists of items
        in the store.
        """
        temp_dir = os.path.join(self._mktmp(), 'syspurpose_file.json')
        test_data = {u'ονόματα': [u'Νίκος', u'Κώστας']}
        with io.open(temp_dir, 'w', encoding='utf-8') as f:
            utils.write_to_file_utf8(f, test_data)

        syspurpose_store = self.assertRaisesNothing(files.SyspurposeStore, temp_dir)
        syspurpose_store.contents = dict(**test_data)

        # Remove from an already seen existing key
        res = self.assertRaisesNothing(syspurpose_store.remove, 'ονόματα', 'Κώστας')
        self.assertIn(u'ονόματα', syspurpose_store.contents)
        self.assertEqual(syspurpose_store.contents[u'ονόματα'], [u'Νίκος'])
        self.assertTrue(res, "The add method should return true when the store has changed")
    def test_sync_object_update_consumer_set_data(self, mock_rhsm):
        # Mocking of rhsm.config
        mock_rhsm.config = Mock()
        mock_rhsm.config.DEFAULT_PROXY_PORT = "3128"
        mock_rhsm.config.initConfig = Mock()
        instance_config = mock_rhsm.config.initConfig.return_value
        instance_config.get = Mock(return_value="/path/to/cert")
        # Mocking of rhsm.connection
        mock_rhsm.connection = Mock()
        mock_rhsm.connection.UEPConnection = Mock()
        instance_uep_connection = mock_rhsm.connection.UEPConnection.return_value
        instance_uep_connection.updateConsumer = Mock()
        # Mocking of rhsm.certificate
        mock_rhsm.certificate = Mock()
        mock_rhsm.certificate.create_from_file = Mock()
        instance_certificate = mock_rhsm.certificate.create_from_file.return_value
        instance_certificate.subject = Mock()
        instance_certificate.subject.get = Mock(return_value="9d4778ae-80fe-4eed-a631-6be35fded7fe")

        syspurpose_sync = sync.SyspurposeSync("proxy.example.com", "1234", "user", "secret")

        temp_file = os.path.join(self._mktmp(), 'syspurpose_file.json')
        test_data = {
            "role": "foo-role",
            "service_level_agreement": "foo-sla",
            "addons": ["foo-addon", "bar-addon"],
            "usage": "foo-usage"
        }
        with io.open(temp_file, 'w', encoding='utf-8') as f:
            utils.write_to_file_utf8(f, test_data)

        syspurpose_store = files.SyspurposeStore(temp_file)
        syspurpose_store.contents = dict(**test_data)

        syspurpose_sync.send_syspurpose_to_candlepin(syspurpose_store)

        instance_uep_connection.updateConsumer.assert_called_once_with(
            uuid="9d4778ae-80fe-4eed-a631-6be35fded7fe",
            role="foo-role",
            service_level="foo-sla",
            addons=["foo-addon", "bar-addon"],
            usage="foo-usage"
        )
    def _read_file(self, file_contents=None, expected_contents=None):
        """
        Utility method for logic common to the *read_file* tests.
        :param file_contents:
        :param expected_contents:
        :return: None
        """
        temp_dir = os.path.join(self._mktmp(), 'syspurpose_file.json')
        with io.open(temp_dir, 'w', encoding='utf-8') as f:
            if file_contents and not isinstance(file_contents, str):
                utils.write_to_file_utf8(f, file_contents)
            else:
                f.write(utils.make_utf8(file_contents or ''))
            f.flush()
        self.assertTrue(os.path.exists(temp_dir), "Unable to create test file in temp dir")

        # Actually do the test
        syspurpose_store = self.assertRaisesNothing(files.SyspurposeStore, temp_dir)
        self.assertRaisesNothing(syspurpose_store.read_file)
        self.assertEqual(syspurpose_store.contents, expected_contents)
예제 #19
0
    def _read_file(self, file_contents=None, expected_contents=None):
        """
        Utility method for logic common to the *read_file* tests.
        :param file_contents:
        :param expected_contents:
        :return: None
        """
        temp_dir = os.path.join(self._mktmp(), 'syspurpose_file.json')
        with io.open(temp_dir, 'w', encoding='utf-8') as f:
            if file_contents and not isinstance(file_contents, str):
                utils.write_to_file_utf8(f, file_contents)
            else:
                f.write(utils.make_utf8(file_contents or ''))
            f.flush()
        self.assertTrue(os.path.exists(temp_dir), "Unable to create test file in temp dir")

        # Actually do the test
        syspurpose_store = self.assertRaisesNothing(files.SyspurposeStore, temp_dir)
        self.assertRaisesNothing(syspurpose_store.read_file)
        self.assertEqual(syspurpose_store.contents, expected_contents)
    def test_remove(self):
        """
        Verify that the remove method can remove items from the store.
        """
        temp_dir = os.path.join(self._mktmp(), 'syspurpose_file.json')
        test_data = {"already_present_key": ["preexisting_value"]}
        with io.open(temp_dir, 'w', encoding='utf-8') as f:
            utils.write_to_file_utf8(f, test_data)

        syspurpose_store = self.assertRaisesNothing(files.SyspurposeStore, temp_dir)
        syspurpose_store.contents = dict(**test_data)

        # Remove an item from the store which we have previously seen
        res = self.assertRaisesNothing(syspurpose_store.remove, "already_present_key", "preexisting_value")
        self.assertIn("already_present_key", syspurpose_store.contents)
        self.assertEqual(syspurpose_store.contents["already_present_key"], [])
        self.assertTrue(res, "The remove method should return true when the store has changed")

        # Try to remove an item that we've previously not seen
        res = self.assertRaisesNothing(syspurpose_store.remove, "new_key", "any_value")
        self.assertFalse(res, "The remove method should return false when the store has not changed")
예제 #21
0
 def update_file(path, data):
     """
     Write the contents of data to file in the first mode we can (effectively to create or update
     the file)
     :param path: The string path to the file location we should update
     :param data: The data to write to the file
     :return: None
     """
     modes = ['w+']
     for mode in modes:
         try:
             f = io.open(path, mode, encoding='utf-8')
         except OSError as e:
             if e.errno != 17:
                 raise
         else:
             write_to_file_utf8(f, data)
             f.flush()
             f.close()
             log.debug('Successfully updated syspurpose values at \'%s\'.' % path)
             return True
     log.debug('Failed to update syspurpose values at \'%s\'.' % path)
     return False
예제 #22
0
 def update_file(path, data):
     """
     Write the contents of data to file in the first mode we can (effectively to create or update
     the file)
     :param path: The string path to the file location we should update
     :param data: The data to write to the file
     :return: None
     """
     modes = ['w+']
     for mode in modes:
         try:
             f = io.open(path, mode, encoding='utf-8')
         except OSError as e:
             if e.errno != 17:
                 raise
         else:
             write_to_file_utf8(f, data)
             f.flush()
             f.close()
             log.debug('Successfully updated syspurpose values at \'%s\'.' % path)
             return True
     log.debug('Failed to update syspurpose values at \'%s\'.' % path)
     return False
    def test_add(self):
        """
        Verify that the add method of SyspurposeStore is able to add items to lists of items
        in the store, whether they existed prior or not.
        """
        temp_dir = os.path.join(self._mktmp(), 'syspurpose_file.json')
        test_data = {"already_present_key": ["preexisting_value"]}
        with io.open(temp_dir, 'w', encoding='utf-8') as f:
            utils.write_to_file_utf8(f, test_data)

        syspurpose_store = self.assertRaisesNothing(files.SyspurposeStore, temp_dir)
        syspurpose_store.contents = dict(**test_data)

        # Brand new unseen key is added
        res = self.assertRaisesNothing(syspurpose_store.add, "new_key", "new_value")
        self.assertIn("new_key", syspurpose_store.contents)
        self.assertEqual(syspurpose_store.contents["new_key"], ["new_value"])
        self.assertTrue(res, "The add method should return true when the store has changed")

        # Add to an already seen existing key
        res = self.assertRaisesNothing(syspurpose_store.add, "already_present_key", "new_value_2")
        self.assertIn("already_present_key", syspurpose_store.contents)
        self.assertEqual(syspurpose_store.contents["already_present_key"], ["preexisting_value", "new_value_2"])
        self.assertTrue(res, "The add method should return true when the store has changed")
    def test_unset_with_unicode_strings(self):
        """
        Verify that the unset method of SyspurposeStore is able to unset unicode strings from items
        in the store.
        """
        temp_dir = os.path.join(self._mktmp(), 'syspurpose_file.json')
        test_data = {u'ονόματα': [u'Νίκος']}
        with io.open(temp_dir, 'w', encoding='utf-8') as f:
            utils.write_to_file_utf8(f, test_data)

        syspurpose_store = self.assertRaisesNothing(files.SyspurposeStore, temp_dir)
        syspurpose_store.contents = dict(**test_data)

        res = self.assertRaisesNothing(syspurpose_store.unset, "ονόματα")
        # We expect a value of true from this method when the store was changed
        self.assertTrue(res, "The unset method should return true when the store has changed")
        self.assertIn(u'ονόματα', syspurpose_store.contents, msg="Expected the key to still be in the contents, but reset to None")
        # We expect the item to have been unset to None
        self.assertEqual(syspurpose_store.contents[u'ονόματα'], None)

        res = self.assertRaisesNothing(syspurpose_store.unset, 'άκυρο_κλειδί')
        # We expect falsey values when the store was not modified
        self.assertFalse(res, "The unset method should return false when the store has not changed")
        self.assertNotIn(u'άκυρο_κλειδί', syspurpose_store.contents, msg="The key passed to unset, has been added to the store")