{ "info": { "author": "Antonio Di Mariano", "author_email": "antonio.dimariano@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3.6" ], "description": "# Initial configuration layer for Microservices \n\n![](http://www.italiamappe.it/mappa/ImmaginiVetrine/0000106274/Immagine1lrg.jpg)\n\n#DISCLAMER\n\nThis service is in his early age. **DO NOT USE in production** or if you want to, please be aware you are going to use a piece of code which probably will be\nchanged or improved ( and not necessarily in this order) soon and very often. You have been warned!\nThis service requires at least another service listening to a few KAFKA topics.\n\n# Service description\n\nThis service has been developed to be used as part of a multilayer microservice based infrastructure.\nIt provides services with a layer of functionalities to be used in order to request the needed configuration settings to start a service.\nIt uses KAFKA as messaging platform in order to exchange messages among services. \nIn order to be used it needs a service which acts as a **service-registry** that receive a request and send back a response.\nAn addition function can be executed when the configuration is received in the not breakable mode. This is comes handy when we want to add a reactive behaviour as a result of a given services' configuration update\n\n# How to add it to your microservice\n\n```python\n\nfrom configuration_layer.service_setup.configuration_request import ConfigurationSeeker\nfrom configuration_layer.utils.configuration_validation import validate_service_configuration\nimport configuration_layer.helpers.producer_messages as message\nimport sys, os\nimport datetime\nfrom messaging_middleware.utils.logger import Logger\n\n\n\ndef check_configuration_directory():\n service_configuration_directory = os.environ.get('service_configuration_directory', 'configuration')\n if os.path.isdir(service_configuration_directory):\n return os.getcwd() + service_configuration_directory\n else:\n return False\n\n\ndef seeker_request(**kwargs):\n seeker = ConfigurationSeeker(consumer_topic='tcsetconf',\n producer_topic='tcgetconf',\n bootstrap_servers=\"your broker here\",\n schema_registry='your schema registry here',\n message={\"cmd\": \"get_conf\", \"auth\": \"ASC\", \"service_name\": \"myservicename\"},\n key_schema={\"service_name\": \"myservicename\"},\n service_name='myservicename',\n service_configuration_directory= os.environ.get('service_configuration_directory', 'configuration'),\n breakable=kwargs.get('breakable', 1),\n set=kwargs.get('set', 0),\n function_to_run=kwargs.get('function_to_run',None)\n\n\n )\n seeker.start()\n seeker.join()\n\n\nif __name__ == \"__main__\":\n if not check_configuration_directory():\n sys.exit()\n\n logger = Logger()\n seeker_request()\n if validate_service_configuration():\n logger.logmsg('info', \"==Configuration Completed==\")\n else:\n message_to_produce = message.operation_result(service_name=\"myservicename\",\n last_operation='setconf',\n timestamp=datetime.datetime.now(\n datetime.timezone.utc).strftime(\n '%Y-%m-%dT%H:%M:%S%z'),\n operation_result=message.const_values()[\n 'CONFIGURATION_FILE_VALIDATION_ERROR'],\n error_description='')\n\n logger.produce_msg(message_to_produce)\n logger.logmsg('error', \"==CONFIGURATION_FILE_VALIDATION_ERROR==\")\n sys.exit()\n\n```\n\n## SSL Configuration \n\nIf you want to use a security protocol such as SSL, these are the changes you have to apply \n\n```python\nfrom configuration_layer.service_setup.configuration_request import ConfigurationSeeker\nfrom configuration_layer.utils.configuration_validation import validate_service_configuration\nimport configuration_layer.helpers.producer_messages as message\nimport sys, os\nimport datetime\nfrom messaging_middleware.utils.logger import Logger\n\n\n\ndef check_configuration_directory():\n service_configuration_directory = os.environ.get('service_configuration_directory', 'configuration')\n if os.path.isdir(service_configuration_directory):\n return os.getcwd() + service_configuration_directory\n else:\n return False\n\n\ndef seeker_request(**kwargs):\n seeker = ConfigurationSeeker(consumer_topic='tcsetconf',\n producer_topic='tcgetconf',\n bootstrap_servers=\"your broker here\",\n schema_registry='your schema registry here',\n message={\"cmd\": \"get_conf\", \"auth\": \"ASC\", \"service_name\": \"myservicename\"},\n key_schema={\"service_name\": \"myservicename\"},\n service_name='myservicename',\n service_configuration_directory= os.environ.get('service_configuration_directory', 'configuration'),\n breakable=kwargs.get('breakable', 1),\n set=kwargs.get('set', 0),\n security_protocol='ssl',\n function_to_run=kwargs.get('function_to_run',None)\n\n )\n seeker.start()\n seeker.join()\n\n\nif __name__ == \"__main__\":\n if not check_configuration_directory():\n sys.exit()\n\n logger = Logger()\n seeker_request()\n if validate_service_configuration(ssl=1):\n logger.logmsg('info', \"==Configuration Completed==\")\n else:\n message_to_produce = message.operation_result(service_name=\"myservicename\",\n last_operation='setconf',\n timestamp=datetime.datetime.now(\n datetime.timezone.utc).strftime(\n '%Y-%m-%dT%H:%M:%S%z'),\n operation_result=message.const_values()[\n 'CONFIGURATION_FILE_VALIDATION_ERROR'],\n error_description='')\n\n logger.produce_msg(message_to_produce)\n logger.logmsg('error', \"==CONFIGURATION_FILE_VALIDATION_ERROR==\")\n sys.exit()\n\n```\n\n# CONFLUENT KAFKA TOPIC: \n\nThe service send message to a predefined (hardcoded atm) topic, which has the following schema registry \n\n**tcservicesmonitor-value** schema message\n\n```json\n\n{\n \"schema\": \"{\\\"type\\\":\\\"record\\\",\\\"name\\\":\\\"key\\\",\\\"namespace\\\":\\\"example.avro\\\",\\\"fields\\\":[{\\\"name\\\": \\\"service_name\\\", \\\"type\\\": \\\"string\\\",\\\"default\\\": \\\"empty\\\"},{\\\"name\\\": \\\"last_operation\\\", \\\"type\\\": \\\"string\\\",\\\"default\\\": \\\"empty\\\"},{\\\"name\\\": \\\"timestamp\\\", \\\"type\\\": \\\"string\\\",\\\"default\\\": \\\"empty\\\"},{\\\"name\\\": \\\"operation_result\\\", \\\"type\\\":\\\"string\\\" },{\\\"name\\\": \\\"operation_description\\\", \\\"type\\\":\\\"string\\\" ,\\\"default\\\": \\\"empty\\\"},{\\\"name\\\": \\\"error_description\\\", \\\"type\\\":\\\"string\\\" ,\\\"default\\\": \\\"empty\\\"}]}\"\n}\n\n```\n\n\n```json\n{\n \"type\": \"record\",\n \"name\": \"key\",\n \"namespace\": \"example.avro\",\n \"fields\": [\n {\n \"name\": \"service_name\",\n \"type\": \"string\",\n \"default\": \"empty\"\n },\n {\n \"name\": \"last_operation\",\n \"type\": \"string\",\n \"default\": \"empty\"\n },\n {\n \"name\": \"timestamp\",\n \"type\": \"string\",\n \"default\": \"empty\"\n },\n {\n \"name\": \"operation_result\",\n \"type\": \"string\"\n },\n {\n \"name\": \"operation_description\",\n \"type\": \"string\"\n }\n ]\n}\n```\n**tcservicesmonitor-key** schema message\n\n```json\n\n{\n \"type\": \"record\",\n \"name\": \"key\",\n \"namespace\": \"example.avro\",\n \"fields\": [\n {\n \"name\": \"service_name\",\n \"type\": \"string\",\n \"default\": \"empty\"\n }\n ]\n}\n```\n\n# Example of how the messages payload configuration look like\n\n### request\n```json\n\n{\n \"topic\": \"tcgetconf\", \n \"value\": {\n \"cmd\": \"get_conf\", \n \"auth\": \"ASC\", \n \"service_name\": \"myservicename\"\n }\n}\n```\n### reply\n\n```json\n{ \n \"service_name\": \"myservicename\", \n \"start_environment\": \"staging\",\n \"datacentre\": \"\", \n \"external_rest_services\": {}, \n \"persistence_conf\": {}, \n \"credentials\": {}\n }\n\n```\n\n#Change Log \n\n* 1.0.14\nImproved the incoming/outcoming messages processing. Added events handler \n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/antoniodimariano/client-side-service-discovery-confifguration-lab.git", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "configuration-layer", "package_url": "https://pypi.org/project/configuration-layer/", "platform": "", "project_url": "https://pypi.org/project/configuration-layer/", "project_urls": { "Homepage": "https://github.com/antoniodimariano/client-side-service-discovery-confifguration-lab.git" }, "release_url": "https://pypi.org/project/configuration-layer/1.0.16/", "requires_dist": [ "avro-python3", "confluent-kafka", "kafka", "requests", "microservices-messaging-layer", "fastavro" ], "requires_python": "~=3.6", "summary": "client-side service discovery component for microservices.", "version": "1.0.16" }, "last_serial": 5298115, "releases": { "1.0.10": [ { "comment_text": "", "digests": { "md5": "88c236eaf4d17008e900520cee7ed3cf", "sha256": "cca5b7e02a1d8633f3a286e1b82e176973941aed4b468fd3ceb728faa4ef2074" }, "downloads": -1, "filename": "configuration_layer-1.0.10-py2-none-any.whl", "has_sig": false, "md5_digest": "88c236eaf4d17008e900520cee7ed3cf", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": "~=3.6", "size": 8096, "upload_time": "2019-02-06T15:41:20", "url": "https://files.pythonhosted.org/packages/55/b4/25905306e24937f9203f25ad9aabdae716ac8fd7cbea7e5ec9e6971ea105/configuration_layer-1.0.10-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9a1dcf75c8e21f185090630b2fa22001", "sha256": "b3d179092554474c8907f712c194f601426b63362b90fd86df3aa0b22be44393" }, "downloads": -1, "filename": "configuration_layer-1.0.10.tar.gz", "has_sig": false, "md5_digest": "9a1dcf75c8e21f185090630b2fa22001", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.6", "size": 6032, "upload_time": "2019-02-06T15:41:21", "url": "https://files.pythonhosted.org/packages/83/af/ba7bde886c1725dd67f475280b4f2023ed62a8c1a17c11a20237a6032e42/configuration_layer-1.0.10.tar.gz" } ], "1.0.11": [ { "comment_text": "", "digests": { "md5": "33823bff2c9d58e653a37d1eb7dabbf8", "sha256": "c776a2d5fa277290240312969caf378a8081b8304fe480f45e09aa08eae680c9" }, "downloads": -1, "filename": "configuration_layer-1.0.11-py2-none-any.whl", "has_sig": false, "md5_digest": "33823bff2c9d58e653a37d1eb7dabbf8", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": "~=3.6", "size": 8099, "upload_time": "2019-02-07T13:26:36", "url": "https://files.pythonhosted.org/packages/70/bb/da8d6710d965731b7f7646c02ee136ea71f7dfa299da3b4591353f78e1c5/configuration_layer-1.0.11-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "14268d3ca4288fa00a063f3d34cae3a7", "sha256": "0a1487c41246f07ee1b69882dcac89380f86708032c50226bbeb381b6bf8caac" }, "downloads": -1, "filename": "configuration_layer-1.0.11.tar.gz", "has_sig": false, "md5_digest": "14268d3ca4288fa00a063f3d34cae3a7", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.6", "size": 6032, "upload_time": "2019-02-07T13:26:38", "url": "https://files.pythonhosted.org/packages/03/ab/5d818519c6787ae134422464bdf1839d1b460a43752ffd07916462b1a31e/configuration_layer-1.0.11.tar.gz" } ], "1.0.12": [ { "comment_text": "", "digests": { "md5": "3a1883c310d8dd8bf91b068c0fd4e033", "sha256": "07d1331030282cf6e5fbd85c4b6245957b127adf5f5ab41788e3b4f1c4300573" }, "downloads": -1, "filename": "configuration_layer-1.0.12-py2-none-any.whl", "has_sig": false, "md5_digest": "3a1883c310d8dd8bf91b068c0fd4e033", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": "~=3.6", "size": 8298, "upload_time": "2019-02-08T11:56:12", "url": "https://files.pythonhosted.org/packages/41/84/0d102b8870a599f322ae73d12c97e11f67bf7008d14eca2db6132739a524/configuration_layer-1.0.12-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "971f2239c815111db566b88ff37be553", "sha256": "1648da527fa52a3105189ca93491bd6db9126680a903723dcdb051303849d9cf" }, "downloads": -1, "filename": "configuration_layer-1.0.12.tar.gz", "has_sig": false, "md5_digest": "971f2239c815111db566b88ff37be553", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.6", "size": 6677, "upload_time": "2019-02-08T11:56:14", "url": "https://files.pythonhosted.org/packages/d2/1a/0e9ee8361a5cb6130281644bf981e1f00373aceb47ec2827d41a40e76e48/configuration_layer-1.0.12.tar.gz" } ], "1.0.13": [ { "comment_text": "", "digests": { "md5": "729aea5b12f0e48694c37556b3ad3097", "sha256": "13f0f82bc6c36c74d016263944193f74b19e8d4eab66fa0bacc399f43aa38ec2" }, "downloads": -1, "filename": "configuration_layer-1.0.13-py3-none-any.whl", "has_sig": false, "md5_digest": "729aea5b12f0e48694c37556b3ad3097", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.6", "size": 8463, "upload_time": "2019-03-29T11:48:20", "url": "https://files.pythonhosted.org/packages/11/b7/c2d66bead18be6c2d46b0899f890b747705365ff0ab26b06208828f0f2af/configuration_layer-1.0.13-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8b0538d4e0aa42752bc7b183b9f7650c", "sha256": "0e7c92d2fdae1a5060e6892948a53854278cf8d4acf3c95a22b768ff0cad3b5e" }, "downloads": -1, "filename": "configuration_layer-1.0.13.tar.gz", "has_sig": false, "md5_digest": "8b0538d4e0aa42752bc7b183b9f7650c", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.6", "size": 6940, "upload_time": "2019-03-29T11:48:21", "url": "https://files.pythonhosted.org/packages/f3/dc/450546ba2da6d5b847448f6257b730a8f616b4403039695a7ed3a7c45713/configuration_layer-1.0.13.tar.gz" } ], "1.0.14": [ { "comment_text": "", "digests": { "md5": "d830ab2cbb67f2450b9977b8b92689ce", "sha256": "ee0474bafb42403f4f742cb9900f981e45812d3cc7118fcdebb0d54662c5bd92" }, "downloads": -1, "filename": "configuration_layer-1.0.14-py3-none-any.whl", "has_sig": false, "md5_digest": "d830ab2cbb67f2450b9977b8b92689ce", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.6", "size": 10929, "upload_time": "2019-05-20T11:07:50", "url": "https://files.pythonhosted.org/packages/d4/6c/336282d90b14796bc60dc89617081655f11e0aa53bac0872fd4a46e6e224/configuration_layer-1.0.14-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a1cce4500c973686f28975c3415939f7", "sha256": "9a897f03800aa4c4f68d93ac28b458daa32383bc5da1aa9f338b6a50b1f8b004" }, "downloads": -1, "filename": "configuration_layer-1.0.14.tar.gz", "has_sig": false, "md5_digest": "a1cce4500c973686f28975c3415939f7", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.6", "size": 8951, "upload_time": "2019-05-20T11:07:52", "url": "https://files.pythonhosted.org/packages/df/04/8db70e5cf78b08a1ae4b4e0bfb48abb396a17858f99fc7023d7d31abe8bc/configuration_layer-1.0.14.tar.gz" } ], "1.0.15": [ { "comment_text": "", "digests": { "md5": "a20977bbd45ed6e1692021f2af6a3df3", "sha256": "5ce3e20d95d068f9aa594eca3f2a81a628e3d78890f97f2da28222fe0ac14ad1" }, "downloads": -1, "filename": "configuration_layer-1.0.15-py3-none-any.whl", "has_sig": false, "md5_digest": "a20977bbd45ed6e1692021f2af6a3df3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.6", "size": 10808, "upload_time": "2019-05-21T13:03:36", "url": "https://files.pythonhosted.org/packages/1e/b3/32efe57efd1bd939eac935ab6e24076578545ae3b55ed51d54def8560dbb/configuration_layer-1.0.15-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5d73b2dce17ee6242216230eda4eca52", "sha256": "4625a0136cfc1312f18af3edc38cd715ce48369d034faa42e3f5b2486c0617fd" }, "downloads": -1, "filename": "configuration_layer-1.0.15.tar.gz", "has_sig": false, "md5_digest": "5d73b2dce17ee6242216230eda4eca52", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.6", "size": 8791, "upload_time": "2019-05-21T13:03:37", "url": "https://files.pythonhosted.org/packages/e6/21/9641c8f43bcd88ef21585400b23a0cd591ad1d42837cc8ef514d573ef048/configuration_layer-1.0.15.tar.gz" } ], "1.0.16": [ { "comment_text": "", "digests": { "md5": "fb641331877aa456d724fb8ca60dbbbb", "sha256": "1b523fa27c5414c7a7edf433db6d715cc21ffa18c6207212204d8cea31d7ae2f" }, "downloads": -1, "filename": "configuration_layer-1.0.16-py3-none-any.whl", "has_sig": false, "md5_digest": "fb641331877aa456d724fb8ca60dbbbb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.6", "size": 10812, "upload_time": "2019-05-21T14:24:40", "url": "https://files.pythonhosted.org/packages/18/04/01b86300429d0d41c1469b47ab0ac4d4edb83d6b5be304affe58a2859620/configuration_layer-1.0.16-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "49995ba87d4b5ee4152b781c6df2ead9", "sha256": "1ff5238afe07fe164ad57ec896a6bad8e5c4e513713482ca1ed1ecfa60ce8b2b" }, "downloads": -1, "filename": "configuration_layer-1.0.16.tar.gz", "has_sig": false, "md5_digest": "49995ba87d4b5ee4152b781c6df2ead9", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.6", "size": 8797, "upload_time": "2019-05-21T14:24:42", "url": "https://files.pythonhosted.org/packages/f3/af/177ef158a92185a8312221c0ebbc236d55fa25c9a64987cc200539e05222/configuration_layer-1.0.16.tar.gz" } ], "1.0.8": [ { "comment_text": "", "digests": { "md5": "84fe52463e86933f0e17d28b0fb483ee", "sha256": "d84743abd67b1ff8cd49653b87387b4b155aa3358acee45e56b125684fdbcad9" }, "downloads": -1, "filename": "configuration_layer-1.0.8-py3-none-any.whl", "has_sig": false, "md5_digest": "84fe52463e86933f0e17d28b0fb483ee", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.6", "size": 7602, "upload_time": "2018-06-21T13:09:53", "url": "https://files.pythonhosted.org/packages/57/95/8ed9338cbf1bdda3a82c9d43f4612d5cbc0fc10c1dbf92296a3a9fc05233/configuration_layer-1.0.8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "30869177af20452b3745a991d8ed8732", "sha256": "78b4b9011d38ecc0ce5ae18b1adfc57cac4750bf9a0745285abe0df468ff090f" }, "downloads": -1, "filename": "configuration_layer-1.0.8.tar.gz", "has_sig": false, "md5_digest": "30869177af20452b3745a991d8ed8732", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.6", "size": 6498, "upload_time": "2018-06-21T13:09:54", "url": "https://files.pythonhosted.org/packages/8b/3a/79ddda0b09d48ca76a90460eda1960e527d9c3e709019aa3eb9129b68867/configuration_layer-1.0.8.tar.gz" } ], "1.0.9": [ { "comment_text": "", "digests": { "md5": "59c65353895cc21b87e1ee6feacd1649", "sha256": "8f0b062993c493cd561ebbfaa2725da1fc4c90cc14c66e4cc42af23fc0d9b676" }, "downloads": -1, "filename": "configuration_layer-1.0.9-py3-none-any.whl", "has_sig": false, "md5_digest": "59c65353895cc21b87e1ee6feacd1649", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.6", "size": 7614, "upload_time": "2018-06-25T19:06:38", "url": "https://files.pythonhosted.org/packages/9e/ff/adc0de5f4eeb3497d66c6e5d679cfaeffa0d9be412a1178f9cf399a03b4e/configuration_layer-1.0.9-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5c09c59fbb800cda37f52a26b336fbcd", "sha256": "8207a4f79f46c41cd121ea8d8a4c47406b71d05096a7745bebd3fb3d8299f42f" }, "downloads": -1, "filename": "configuration_layer-1.0.9.tar.gz", "has_sig": false, "md5_digest": "5c09c59fbb800cda37f52a26b336fbcd", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.6", "size": 6970, "upload_time": "2018-06-25T19:06:40", "url": "https://files.pythonhosted.org/packages/7a/18/0579f17d22c439fc3114383241500412d2665ca3759729807268b1018c6f/configuration_layer-1.0.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "fb641331877aa456d724fb8ca60dbbbb", "sha256": "1b523fa27c5414c7a7edf433db6d715cc21ffa18c6207212204d8cea31d7ae2f" }, "downloads": -1, "filename": "configuration_layer-1.0.16-py3-none-any.whl", "has_sig": false, "md5_digest": "fb641331877aa456d724fb8ca60dbbbb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.6", "size": 10812, "upload_time": "2019-05-21T14:24:40", "url": "https://files.pythonhosted.org/packages/18/04/01b86300429d0d41c1469b47ab0ac4d4edb83d6b5be304affe58a2859620/configuration_layer-1.0.16-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "49995ba87d4b5ee4152b781c6df2ead9", "sha256": "1ff5238afe07fe164ad57ec896a6bad8e5c4e513713482ca1ed1ecfa60ce8b2b" }, "downloads": -1, "filename": "configuration_layer-1.0.16.tar.gz", "has_sig": false, "md5_digest": "49995ba87d4b5ee4152b781c6df2ead9", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.6", "size": 8797, "upload_time": "2019-05-21T14:24:42", "url": "https://files.pythonhosted.org/packages/f3/af/177ef158a92185a8312221c0ebbc236d55fa25c9a64987cc200539e05222/configuration_layer-1.0.16.tar.gz" } ] }