Add util methods for checking json and yaml formatted file

As part of oslo_policy policy_file JSON to YAML migration BP,
we need to check if oslo policy_file is JSON or YAML formatted
(almost on all projects with policy in code, example Needed-By).
- https://specs.openstack.org/openstack/oslo-specs/specs/victoria/policy-json-to-yaml.html

These util methods try quick checks of file type by loading the file using
json or yaml.

Needed-By: https://review.opendev.org/#/c/748059/

Related Blueprint: policy-json-to-yaml

Change-Id: I0edf030dc5cd6b77e0101089746589332860fa16
This commit is contained in:
Ghanshyam Mann
2020-08-25 19:13:34 -05:00
parent 2aaaf38611
commit 7c4a94c0c3
3 changed files with 84 additions and 1 deletions

View File

@@ -22,10 +22,12 @@ File utilities.
import contextlib import contextlib
import errno import errno
import hashlib import hashlib
import json
import os import os
import stat import stat
import tempfile import tempfile
import time import time
import yaml
from oslo_utils import excutils from oslo_utils import excutils
@@ -158,3 +160,50 @@ def last_bytes(path, num):
raise raise
unread_bytes = fp.tell() unread_bytes = fp.tell()
return (fp.read(), unread_bytes) return (fp.read(), unread_bytes)
def is_json(file_path):
"""Check if file is of json type or not.
This function try to load the input file using json.loads()
and return False if ValueError otherwise True.
:param file_path: The file path to check
:returns: bool
"""
with open(file_path, 'r') as fh:
data = fh.read()
try:
json.loads(data)
return True
except ValueError:
return False
def is_yaml(file_path):
"""Check if file is of yaml type or not.
This function try to load the input file using yaml.safe_load()
and return True if loadable. Because every json file can be loadable
in yaml, so this function return False if file is loadable using
json.loads() means it is json file.
:param file_path: The file path to check
:returns: bool
"""
with open(file_path, 'r') as fh:
data = fh.read()
is_yaml = False
try:
json.loads(data)
except ValueError:
try:
yaml.safe_load(data)
is_yaml = True
except yaml.scanner.ScannerError:
pass
return is_yaml

View File

@@ -15,6 +15,7 @@
import errno import errno
import hashlib import hashlib
import json
import os import os
import shutil import shutil
import stat import stat
@@ -22,13 +23,13 @@ import tempfile
import time import time
from unittest import mock from unittest import mock
import uuid import uuid
import yaml
from oslotest import base as test_base from oslotest import base as test_base
import six import six
from oslo_utils import fileutils from oslo_utils import fileutils
TEST_PERMISSIONS = stat.S_IRWXU TEST_PERMISSIONS = stat.S_IRWXU
@@ -289,3 +290,30 @@ class LastBytesTestCase(test_base.BaseTestCase):
def test_non_exist_file(self): def test_non_exist_file(self):
self.assertRaises(IOError, fileutils.last_bytes, self.assertRaises(IOError, fileutils.last_bytes,
'non_exist_file', 1000) 'non_exist_file', 1000)
class FileTypeTestCase(test_base.BaseTestCase):
"""Test the is_yaml() and is_json() utility methods."""
def setUp(self):
super(FileTypeTestCase, self).setUp()
data = {
'name': 'test',
'website': 'example.com'
}
temp_dir = tempfile.mkdtemp()
self.json_file = tempfile.mktemp(dir=temp_dir)
self.yaml_file = tempfile.mktemp(dir=temp_dir)
with open(self.json_file, 'w') as fh:
json.dump(data, fh)
with open(self.yaml_file, 'w') as fh:
yaml.dump(data, fh)
def test_is_json(self):
self.assertTrue(fileutils.is_json(self.json_file))
self.assertFalse(fileutils.is_json(self.yaml_file))
def test_is_yaml(self):
self.assertTrue(fileutils.is_yaml(self.yaml_file))
self.assertFalse(fileutils.is_yaml(self.json_file))

View File

@@ -0,0 +1,6 @@
---
features:
- |
New method ``is_json`` ``is_yaml`` added in fileutils.
These can be used to check if file is JSON or YAML
formatted.