"""
Copyright (c) 2015 SONATA-NFV and Paderborn University
ALL RIGHTS RESERVED.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

Neither the name of the SONATA-NFV, Paderborn University
nor the names of its contributors may be used to endorse or promote
products derived from this software without specific prior written
permission.

This work has been performed in the framework of the SONATA project,
funded by the European Commission under Grant number 671517 through
the Horizon 2020 and 5G-PPP programmes. The authors would like to
acknowledge the contributions of their colleagues of the SONATA
partner consortium (www.sonata-nfv.eu).
"""
from setuptools import setup, find_packages

setup(name='emuvim',
      version='1.0',
      license='Apache 2.0',
      description='vim-emu: A NFV multi-PoP emulation platform',
      url='https://osm.etsi.org/gitweb/?p=osm/vim-emu.git',
      author_email='manuel@peuster.de',
      package_dir={'': 'src'},
      # packages=find_packages('emuvim', exclude=['*.test', '*.test.*', 'test.*', 'test']),
      packages=find_packages('src'),
      include_package_data=True,
      package_data={
              'emuvim.api.sonata': ['*.yml'],
              'emuvim.dashboard': ['*.html', 'css/*.css', 'img/*', 'js/*.js']
      },
      install_requires=[
          'pyaml',
          'tabulate',
          'argparse',
          'networkx==1.11',
          'six>=1.9',
          'ryu',
          'oslo.config',
          'pytest',
          'Flask',
          'flask_restful',
          'docker==2.0.2',
          'urllib3==1.21.1',
          'requests',
          'prometheus_client',
          'ipaddress',
          'simplejson'
      ],
      zip_safe=False,
      entry_points={
          'console_scripts': [
              'vim-emu=emuvim.cli.son_emu_cli:main',
          ],
      },
      setup_requires=['pytest-runner'],
      tests_require=['pytest'],
      )
