summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore8
-rw-r--r--INFO1
-rw-r--r--INFO.yaml59
-rw-r--r--apex/build.py18
-rw-r--r--apex/build_utils.py50
-rw-r--r--apex/builders/common_builder.py260
-rw-r--r--apex/builders/exceptions.py12
-rw-r--r--apex/builders/overcloud_builder.py141
-rw-r--r--apex/builders/undercloud_builder.py71
-rw-r--r--apex/clean.py8
-rw-r--r--apex/common/constants.py43
-rw-r--r--apex/common/exceptions.py16
-rw-r--r--apex/common/utils.py180
-rw-r--r--apex/deploy.py527
-rw-r--r--apex/deployment/__init__.py0
-rw-r--r--apex/deployment/snapshot.py241
-rw-r--r--apex/deployment/tripleo.py60
-rw-r--r--apex/inventory/inventory.py7
-rw-r--r--apex/network/jumphost.py8
-rw-r--r--apex/network/network_data.py2
-rw-r--r--apex/network/network_environment.py11
-rw-r--r--apex/overcloud/config.py6
-rw-r--r--apex/overcloud/deploy.py493
-rw-r--r--apex/overcloud/node.py147
-rw-r--r--apex/settings/deploy_settings.py20
-rw-r--r--apex/settings/network_settings.py7
-rw-r--r--apex/tests/config/98faaca.diff331
-rw-r--r--apex/tests/config/admin.xml7
-rw-r--r--apex/tests/config/baremetal0.xml73
-rw-r--r--apex/tests/config/common-patches.yaml6
-rw-r--r--apex/tests/config/dummy-deploy-settings.yaml19
-rw-r--r--apex/tests/config/inventory-virt-1-compute-node.yaml14
-rw-r--r--apex/tests/config/node.yaml12
-rw-r--r--apex/tests/config/snapshot.properties2
-rw-r--r--apex/tests/test_apex_build_utils.py27
-rw-r--r--apex/tests/test_apex_common_builder.py227
-rw-r--r--apex/tests/test_apex_common_utils.py62
-rw-r--r--apex/tests/test_apex_deploy.py183
-rw-r--r--apex/tests/test_apex_deployment_snapshot.py374
-rw-r--r--apex/tests/test_apex_deployment_tripleo.py49
-rw-r--r--apex/tests/test_apex_inventory.py7
-rw-r--r--apex/tests/test_apex_network_environment.py7
-rw-r--r--apex/tests/test_apex_network_settings.py3
-rw-r--r--apex/tests/test_apex_overcloud_builder.py67
-rw-r--r--apex/tests/test_apex_overcloud_deploy.py672
-rw-r--r--apex/tests/test_apex_overcloud_node.py191
-rw-r--r--apex/tests/test_apex_undercloud.py178
-rw-r--r--apex/tests/test_apex_virtual_utils.py20
-rw-r--r--apex/undercloud/undercloud.py131
-rw-r--r--apex/utils.py107
-rwxr-xr-xapex/virtual/configure_vm.py9
-rw-r--r--apex/virtual/exceptions.py12
-rw-r--r--apex/virtual/utils.py36
-rw-r--r--build/CentOS-Updates.repo5
-rw-r--r--build/Makefile308
-rw-r--r--build/ansible.cfg11
-rwxr-xr-xbuild/barometer-install.sh152
-rw-r--r--build/build_ovs_nsh.sh20
-rwxr-xr-xbuild/build_quagga.sh251
-rw-r--r--build/c7-opnfv-x86_64-comps.xml7995
-rw-r--r--build/cache.sh77
-rw-r--r--build/containers-prepare-parameter.yaml26
-rw-r--r--build/csit-environment.yaml78
-rw-r--r--build/csit-queens-environment.yaml115
-rw-r--r--build/csit-rocky-environment.yaml116
-rw-r--r--build/isolinux.cfg119
-rw-r--r--build/kubernetes-environment.yaml26
-rw-r--r--build/kvm4nfv-1st-boot.yaml61
-rw-r--r--build/network-environment.yaml22
-rw-r--r--build/nics-template.yaml.jinja2484
-rw-r--r--build/opnfv-environment.yaml5
-rwxr-xr-xbuild/overcloud-full.sh155
-rwxr-xr-xbuild/overcloud-onos.sh46
-rwxr-xr-xbuild/overcloud-opendaylight.sh100
-rw-r--r--build/patches/neutron-patch-NSDriver.patch38
-rw-r--r--build/patches/puppet-ceph.patch76
-rw-r--r--build/patches/puppet-neutron-vpp-ml2-type_drivers-setting.patch80
-rw-r--r--build/patches/tacker-client-fix-symmetrical.patch31
-rw-r--r--build/rpm_specs/c_capnproto.spec45
-rw-r--r--build/rpm_specs/networking-vpp.spec14
-rw-r--r--build/rpm_specs/opnfv-apex-common.spec195
-rw-r--r--build/rpm_specs/opnfv-apex-onos.spec44
-rw-r--r--build/rpm_specs/opnfv-apex-release.spec36
-rw-r--r--build/rpm_specs/opnfv-apex-undercloud.spec53
-rw-r--r--build/rpm_specs/opnfv-apex.spec254
-rw-r--r--build/rpm_specs/quagga.spec744
-rw-r--r--build/rpm_specs/zrpc.spec46
-rwxr-xr-xbuild/undercloud.sh69
-rw-r--r--build/upstream-environment.yaml9
-rw-r--r--build/variables.sh59
-rw-r--r--ci/PR_revision.log6
-rwxr-xr-xci/util.sh2
-rw-r--r--config/deploy/common-patches.yaml45
-rw-r--r--config/deploy/deploy_settings.yaml19
-rw-r--r--config/deploy/k8s-nosdn-nofeature-noha.yaml (renamed from config/deploy/os-nosdn-pike-noha.yaml)6
-rw-r--r--config/deploy/os-nosdn-calipso-noha.yaml1
-rw-r--r--config/deploy/os-nosdn-calipso_rocky-noha.yaml11
-rw-r--r--config/deploy/os-nosdn-nofeature-ha.yaml6
-rw-r--r--config/deploy/os-nosdn-nofeature-noha.yaml6
-rw-r--r--config/deploy/os-nosdn-rocky-ha.yaml11
-rw-r--r--config/deploy/os-nosdn-rocky-noha.yaml (renamed from config/deploy/os-ovn-nofeature-noha.yaml)7
-rw-r--r--config/deploy/os-odl-bgpvpn-ha.yaml6
-rw-r--r--config/deploy/os-odl-bgpvpn-noha.yaml6
-rw-r--r--config/deploy/os-odl-bgpvpn_rocky-ha.yaml13
-rw-r--r--config/deploy/os-odl-bgpvpn_rocky-noha.yaml13
-rw-r--r--config/deploy/os-odl-l2gw-ha.yaml12
-rw-r--r--config/deploy/os-odl-l2gw-noha.yaml (renamed from config/deploy/os-odl-csit-noha.yaml)4
-rw-r--r--config/deploy/os-odl-nofeature-ha.yaml8
-rw-r--r--config/deploy/os-odl-nofeature-noha.yaml8
-rw-r--r--config/deploy/os-odl-pike-noha.yaml15
-rw-r--r--config/deploy/os-odl-queens-ha.yaml13
-rw-r--r--config/deploy/os-odl-queens-noha.yaml13
-rw-r--r--config/deploy/os-odl-rocky-ha.yaml13
-rw-r--r--config/deploy/os-odl-rocky-noha.yaml13
-rw-r--r--config/deploy/os-odl-sfc-ha.yaml8
-rw-r--r--config/deploy/os-odl-sfc-noha.yaml8
-rw-r--r--config/deploy/os-odl-sfc_rocky-ha.yaml13
-rw-r--r--config/deploy/os-odl-sfc_rocky-noha.yaml13
-rw-r--r--config/deploy/os-odl-sriov-ha.yaml21
-rw-r--r--config/deploy/os-odl-sriov-noha.yaml21
-rw-r--r--config/deploy/os-ovn-nofeature-ha.yaml15
-rw-r--r--config/deploy/os-ovn-rocky-ha.yaml17
-rw-r--r--config/network/network_settings.yaml22
-rw-r--r--config/network/network_settings_csit.yaml (renamed from config/network/network_settings_vpp.yaml)19
-rw-r--r--config/network/network_settings_tenant_vlan.yaml333
-rw-r--r--config/network/network_settings_v6.yaml14
-rw-r--r--config/network/network_settings_vlans.yaml4
-rw-r--r--contrib/aarch64/overcloud-full-rootfs.yaml54
-rw-r--r--contrib/aarch64/undercloud-full.yaml87
-rw-r--r--docs/conf.py1
-rw-r--r--docs/conf.yaml3
-rw-r--r--docs/contributor/APEX-on-aarch64.rst146
-rw-r--r--docs/contributor/upstream-overcloud-container-design.rst126
-rw-r--r--docs/index.rst23
-rw-r--r--docs/release/installation/abstract.rst8
-rw-r--r--docs/release/installation/architecture.rst35
-rw-r--r--docs/release/installation/baremetal.rst54
-rw-r--r--docs/release/installation/index.rst3
-rw-r--r--docs/release/installation/introduction.rst29
-rw-r--r--docs/release/installation/references.rst4
-rw-r--r--docs/release/installation/requirements.rst4
-rw-r--r--docs/release/installation/troubleshooting.rst10
-rw-r--r--docs/release/installation/upstream.rst101
-rw-r--r--docs/release/installation/virtual.rst97
-rw-r--r--docs/release/release-notes/release-notes.rst191
-rw-r--r--docs/release/scenarios/k8s-nosdn-nofeature-noha/index.rst (renamed from docs/release/scenarios/os-odl-csit-noha/index.rst)10
-rw-r--r--docs/release/scenarios/k8s-nosdn-nofeature-noha/k8s-nosdn-nofeature-noha.rst46
-rw-r--r--docs/release/scenarios/os-nosdn-nofeature-ha/os-nosdn-nofeature-ha.rst8
-rw-r--r--docs/release/scenarios/os-nosdn-nofeature-noha/os-nosdn-nofeature-noha.rst8
-rw-r--r--docs/release/scenarios/os-nosdn-ovs_dpdk-ha/index.rst16
-rw-r--r--docs/release/scenarios/os-nosdn-ovs_dpdk-ha/os-nosdn-ovs_dpdk-ha.rst87
-rw-r--r--docs/release/scenarios/os-nosdn-ovs_dpdk-noha/index.rst16
-rw-r--r--docs/release/scenarios/os-nosdn-ovs_dpdk-noha/os-nosdn-ovs_dpdk-noha.rst87
-rw-r--r--docs/release/scenarios/os-nosdn-performance-ha/index.rst15
-rw-r--r--docs/release/scenarios/os-nosdn-performance-ha/os-nosdn-performance-ha.rst54
-rw-r--r--docs/release/scenarios/os-odl-csit-noha/os-odl-csit-noha.rst54
-rw-r--r--docs/release/scenarios/os-odl-nofeature-ha/os-odl-nofeature-ha.rst16
-rw-r--r--docs/release/scenarios/os-odl-nofeature-noha/os-odl-nofeature-noha.rst16
-rw-r--r--docs/release/scenarios/os-ovn-nofeature-ha/index.rst (renamed from docs/release/scenarios/os-ovn-nofeature-noha/index.rst)4
-rw-r--r--docs/release/scenarios/os-ovn-nofeature-ha/os-ovn-nofeature-ha.rst (renamed from docs/release/scenarios/os-ovn-nofeature-noha/os-ovn-nofeature-noha.rst)13
-rw-r--r--docs/requirements.txt2
-rw-r--r--lib/ansible/playbooks/configure_undercloud.yml136
-rw-r--r--lib/ansible/playbooks/deploy_dependencies.yml40
-rw-r--r--lib/ansible/playbooks/deploy_overcloud.yml93
-rw-r--r--lib/ansible/playbooks/fetch_overcloud_logs.yml25
-rw-r--r--lib/ansible/playbooks/fetch_overcloud_nodes.yml13
-rw-r--r--lib/ansible/playbooks/k8s_remove_pkgs.yml5
-rw-r--r--lib/ansible/playbooks/patch_containers.yml13
-rw-r--r--lib/ansible/playbooks/post_deploy_overcloud.yml60
-rw-r--r--lib/ansible/playbooks/post_deploy_undercloud.yml94
-rw-r--r--lib/ansible/playbooks/prepare_overcloud_containers.yml50
-rw-r--r--lib/ansible/playbooks/undercloud_aarch64.yml36
-rw-r--r--requirements.txt3
-rw-r--r--setup.cfg6
-rw-r--r--tox.ini14
175 files changed, 7810 insertions, 12158 deletions
diff --git a/.gitignore b/.gitignore
index f42d4c6..6bc2461 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,11 +1,13 @@
*~
*.pyc
-/docs_build/
/docs_output/
/releng/
+venv/
apex.egg-info/
-/apex/tests/playbooks/*.retry
coverage.xml
nosetests.xml
-ci/*.log
.*
+*.log
+*.retry
+.tox
+docs/_build/*
diff --git a/INFO b/INFO
index 57aa632..c2d56ae 100644
--- a/INFO
+++ b/INFO
@@ -24,5 +24,6 @@ Dan Radez (dradez@redhat.com)
Tim Rozet (trozet@redhat.com)
Michael Chapman (michapma@redhat.com)
Feng Pan (fpan@redhat.com)
+Ricardo Noriega (rnoriega@redhat.com)
Link to TSC approval of the project: http://ircbot.wl.linuxfoundation.org/meetings/opnfv-meeting/2015/opnfv-meeting.2015-07-14-14.00.html
diff --git a/INFO.yaml b/INFO.yaml
new file mode 100644
index 0000000..eaa700c
--- /dev/null
+++ b/INFO.yaml
@@ -0,0 +1,59 @@
+---
+project: 'Apex'
+project_creation_date: 'July 14, 2015'
+project_category: 'Integration & Testing'
+lifecycle_state: 'Incubation'
+project_lead: &opnfv_apex_ptl
+ name: 'Tim Rozet'
+ email: 'trozet@redhat.com'
+ id: 'trozet'
+ company: 'redhat.com'
+ timezone: 'USA/East Coast'
+primary_contact: *opnfv_apex_ptl
+issue_tracking:
+ type: 'jira'
+ url: 'https://jira.opnfv.org/projects/APEX'
+ key: 'APEX'
+mailing_list:
+ type: 'mailman2'
+ url: 'opnfv-tech-discuss@lists.opnfv.org'
+ tag: '[apex]'
+realtime_discussion:
+ type: irc
+ server: 'freenode.net'
+ channel: '#opnfv-apex'
+meetings:
+ - type: 'gotomeeting+irc'
+ agenda: 'https://wiki.opnfv.org/display/apex'
+ url: 'http://bluejeans.com/trozet'
+ server: 'freenode.net'
+ channel: '#opnfv-apex'
+ repeats: 'weekly'
+ time: '15:00 UTC'
+repositories:
+ - 'apex'
+ - 'apex-os-net-config'
+ - 'apex-puppet-tripleo'
+ - 'apex-tripleo-heat-templates'
+committers:
+ - <<: *opnfv_apex_ptl
+ - name: 'Dan Radez'
+ email: 'dradez@redhat.com'
+ company: 'redhat.com'
+ id: 'radez'
+ - name: 'Michael Chapman'
+ email: 'michapma@redhat.com'
+ company: 'redhat.com'
+ id: 'michapma'
+ - name: 'Feng Pan'
+ email: 'fpan@redhat.com'
+ company: 'redhat.com'
+ id: 'fpan'
+ - name: 'Ricardo Noriega'
+ email: 'rnoriega@redhat.com'
+ company: 'redhat.com'
+ id: 'rnoriega'
+tsc:
+ # yamllint disable rule:line-length
+ approval: 'http//ircbot.wl.linuxfoundation.org/meetings/opnfv-meeting/2015/opnfv-meeting.2015-07-14-14.00.html'
+ # yamllint enable rule:line-length
diff --git a/apex/build.py b/apex/build.py
index 08f91ab..6e90381 100644
--- a/apex/build.py
+++ b/apex/build.py
@@ -109,11 +109,15 @@ def unpack_cache(cache_dest, cache_dir=None):
def build(build_root, version, iso=False, rpms=False):
if iso:
- make_targets = ['iso']
+ logging.warning("iso is deprecated. Will not build iso and build rpm "
+ "instead.")
+ make_targets = ['rpm']
elif rpms:
- make_targets = ['rpms']
+ make_targets = ['rpm']
else:
- make_targets = ['images', 'rpms-check']
+ logging.warning("Nothing specified to build, and images are no "
+ "longer supported in Apex. Will only run rpm check")
+ make_targets = ['rpm-check']
if version is not None:
make_args = ['RELEASE={}'.format(version)]
else:
@@ -225,6 +229,7 @@ def main():
console.setLevel(log_level)
console.setFormatter(logging.Formatter(formatter))
logging.getLogger('').addHandler(console)
+ utils.install_ansible()
# Since we only support building inside of git repo this should be fine
try:
apex_root = subprocess.check_output(
@@ -233,9 +238,7 @@ def main():
logging.error("Must be in an Apex git repo to execute build")
raise
apex_build_root = os.path.join(apex_root, BUILD_ROOT)
- if os.path.isdir(apex_build_root):
- cache_tmp_dir = os.path.join(apex_root, TMP_CACHE)
- else:
+ if not os.path.isdir(apex_build_root):
logging.error("You must execute this script inside of the Apex "
"local code repository")
raise ApexBuildException("Invalid path for apex root: {}. Must be "
@@ -244,10 +247,7 @@ def main():
dep_playbook = os.path.join(apex_root,
'lib/ansible/playbooks/build_dependencies.yml')
utils.run_ansible(None, dep_playbook)
- unpack_cache(cache_tmp_dir, args.cache_dir)
build(apex_build_root, args.build_version, args.iso, args.rpms)
- build_cache(cache_tmp_dir, args.cache_dir)
- prune_cache(args.cache_dir)
if __name__ == '__main__':
diff --git a/apex/build_utils.py b/apex/build_utils.py
index c9d8472..7457e56 100644
--- a/apex/build_utils.py
+++ b/apex/build_utils.py
@@ -27,7 +27,7 @@ def get_change(url, repo, branch, change_id):
:param repo: name of repo
:param branch: branch of repo
:param change_id: SHA change id
- :return: change if found and not abandoned, closed, or merged
+ :return: change if found and not abandoned, closed
"""
rest = GerritRestAPI(url=url)
change_path = "{}~{}~{}".format(quote_plus(repo), quote_plus(branch),
@@ -37,12 +37,8 @@ def get_change(url, repo, branch, change_id):
try:
assert change['status'] not in 'ABANDONED' 'CLOSED', \
'Change {} is in {} state'.format(change_id, change['status'])
- if change['status'] == 'MERGED':
- logging.info('Change {} is merged, ignoring...'
- .format(change_id))
- return None
- else:
- return change
+ logging.debug('Change found: {}'.format(change))
+ return change
except KeyError:
logging.error('Failed to get valid change data structure from url '
@@ -90,6 +86,44 @@ def clone_fork(args):
logging.info('Checked out commit:\n{}'.format(ws.head.commit.message))
+def strip_patch_sections(patch, sections=['releasenotes', 'tests']):
+ """
+ Removes patch sections from a diff which contain a file path
+ :param patch: patch to strip
+ :param sections: list of keywords to use to strip out of the patch file
+ :return: stripped patch
+ """
+
+ append_line = True
+ tmp_patch = []
+ for line in patch.split("\n"):
+ if re.match('diff\s', line):
+ for section in sections:
+ if re.search(section, line):
+ logging.debug("Stripping {} from patch: {}".format(
+ section, line))
+ append_line = False
+ break
+ else:
+ append_line = True
+ if append_line:
+ tmp_patch.append(line)
+ return '\n'.join(tmp_patch)
+
+
+def is_path_in_patch(patch, path):
+ """
+ Checks if a particular path is modified in a patch diff
+ :param patch: patch diff
+ :param path: path to check for in diff
+ :return: Boolean
+ """
+ for line in patch.split("\n"):
+ if re.match('^diff.*{}'.format(path), line):
+ return True
+ return False
+
+
def get_patch(change_id, repo, branch, url=con.OPENSTACK_GERRIT):
logging.info("Fetching patch for change id {}".format(change_id))
change = get_change(url, repo, branch, change_id)
@@ -100,7 +134,7 @@ def get_patch(change_id, repo, branch, url=con.OPENSTACK_GERRIT):
change_id)
patch_url = "changes/{}/revisions/{}/patch".format(change_path,
current_revision)
- return rest.get(patch_url)
+ return strip_patch_sections(rest.get(patch_url))
def get_parser():
diff --git a/apex/builders/common_builder.py b/apex/builders/common_builder.py
index fd3bcc3..59af94c 100644
--- a/apex/builders/common_builder.py
+++ b/apex/builders/common_builder.py
@@ -9,19 +9,30 @@
# Common building utilities for undercloud and overcloud
+import datetime
import git
+import json
import logging
import os
+import platform
+import pprint
+import re
+import urllib.parse
+import yaml
+import apex.builders.overcloud_builder as oc_builder
from apex import build_utils
+from apex.builders import exceptions as exc
from apex.common import constants as con
+from apex.common import utils
from apex.virtual import utils as virt_utils
-def project_to_path(project):
+def project_to_path(project, patch=None):
"""
- Translates project to absolute file path
+ Translates project to absolute file path to use in patching
:param project: name of project
+ :param patch: the patch to applied to the project
:return: File path
"""
if project.startswith('openstack/'):
@@ -30,14 +41,116 @@ def project_to_path(project):
return "/etc/puppet/modules/{}".format(project.replace('puppet-', ''))
elif 'tripleo-heat-templates' in project:
return "/usr/share/openstack-tripleo-heat-templates"
+ elif ('tripleo-common' in project and
+ build_utils.is_path_in_patch(patch, 'container-images/')):
+ # tripleo-common has python and another component to it
+ # here we detect if there is a change to the yaml component and if so
+ # treat it like it is not python. This has the caveat of if there
+ # is a patch to both python and yaml this will not work
+ # FIXME(trozet): add ability to split tripleo-common patches that
+ # modify both python and yaml
+ return "/usr/share/openstack-tripleo-common-containers/"
else:
- # assume python
- return "/usr/lib/python2.7/site-packages/{}".format(project)
+ # assume python. python patches will apply to a project name subdir.
+ # For example, python-tripleoclient patch will apply to the
+ # tripleoclient directory, which is the directory extracted during
+ # python install into the PYTHONPATH. Therefore we need to just be
+ # in the PYTHONPATH directory to apply a patch
+ return "/usr/lib/python2.7/site-packages/"
+
+
+def project_to_docker_image(project, docker_url):
+ """
+ Translates OpenStack project to OOO services that are containerized
+ :param project: short name of OpenStack project
+ :return: List of OOO docker service names
+ """
+ # Fetch all docker containers in docker hub with tripleo and filter
+ # based on project
+ logging.info("Checking for docker images matching project: {}".format(
+ project))
+ hub_output = utils.open_webpage(
+ urllib.parse.urljoin(docker_url,
+ '?page_size=1024'), timeout=10)
+ try:
+ results = json.loads(hub_output.decode())['results']
+ except Exception as e:
+ logging.error("Unable to parse docker hub output for"
+ "tripleoupstream repository")
+ logging.debug("HTTP response from dockerhub:\n{}".format(hub_output))
+ raise exc.ApexCommonBuilderException(
+ "Failed to parse docker image info from Docker Hub: {}".format(e))
+ logging.debug("Docker Hub tripleoupstream entities found: {}".format(
+ results))
+ docker_images = list()
+ for result in results:
+ if result['name'].startswith("centos-binary-{}".format(project)):
+ # add as docker image shortname (just service name)
+ logging.debug("Adding docker image {} for project {} for "
+ "patching".format(result['name'], project))
+ docker_images.append(result['name'].replace('centos-binary-', ''))
+
+ return docker_images
+
+
+def is_patch_promoted(change, branch, docker_url, docker_image=None):
+ """
+ Checks to see if a patch that is in merged exists in either the docker
+ container or the promoted tripleo images
+ :param change: gerrit change json output
+ :param branch: branch to use when polling artifacts (does not include
+ stable prefix)
+ :param docker_image: container this applies to if (defaults to None)
+ :return: True if the patch exists in a promoted artifact upstream
+ """
+ assert isinstance(change, dict)
+ assert 'status' in change
+
+ # if not merged we already know this is not closed/abandoned, so we know
+ # this is not promoted
+ if change['status'] != 'MERGED':
+ return False
+ assert 'submitted' in change
+ # drop microseconds cause who cares
+ stime = re.sub('\..*$', '', change['submitted'])
+ submitted_date = datetime.datetime.strptime(stime, "%Y-%m-%d %H:%M:%S")
+ # Patch applies to overcloud/undercloud
+ if docker_image is None:
+ oc_url = urllib.parse.urljoin(
+ con.UPSTREAM_RDO.replace('master', branch), 'overcloud-full.tar')
+ oc_mtime = utils.get_url_modified_date(oc_url)
+ if oc_mtime > submitted_date:
+ logging.debug("oc image was last modified at {}, which is"
+ "newer than merge date: {}".format(oc_mtime,
+ submitted_date))
+ return True
+ else:
+ # must be a docker patch, check docker tag modified time
+ docker_url = docker_url.replace('tripleomaster',
+ "tripleo{}".format(branch))
+ url_path = "{}/tags/{}".format(docker_image, con.DOCKER_TAG)
+ docker_url = urllib.parse.urljoin(docker_url, url_path)
+ logging.debug("docker url is: {}".format(docker_url))
+ docker_output = utils.open_webpage(docker_url, 10)
+ logging.debug('Docker web output: {}'.format(docker_output))
+ hub_mtime = json.loads(docker_output.decode())['last_updated']
+ hub_mtime = re.sub('\..*$', '', hub_mtime)
+ # docker modified time is in this format '2018-06-11T15:23:55.135744Z'
+ # and we drop microseconds
+ hub_dtime = datetime.datetime.strptime(hub_mtime, "%Y-%m-%dT%H:%M:%S")
+ if hub_dtime > submitted_date:
+ logging.debug("docker image: {} was last modified at {}, which is"
+ "newer than merge date: {}".format(docker_image,
+ hub_dtime,
+ submitted_date))
+ return True
+ return False
def add_upstream_patches(patches, image, tmp_dir,
default_branch=os.path.join('stable',
- con.DEFAULT_OS_VERSION)):
+ con.DEFAULT_OS_VERSION),
+ uc_ip=None, docker_tag=None):
"""
Adds patches from upstream OpenStack gerrit to Undercloud for deployment
:param patches: list of patches
@@ -45,10 +158,13 @@ def add_upstream_patches(patches, image, tmp_dir,
:param tmp_dir: to store temporary patch files
:param default_branch: default branch to fetch commit (if not specified
in patch)
- :return: None
+ :param uc_ip: undercloud IP (required only for docker patches)
+ :param docker_tag: Docker Tag (required only for docker patches)
+ :return: Set of docker services patched (if applicable)
"""
virt_ops = [{con.VIRT_INSTALL: 'patch'}]
logging.debug("Evaluating upstream patches:\n{}".format(patches))
+ docker_services = set()
for patch in patches:
assert isinstance(patch, dict)
assert all(i in patch.keys() for i in ['project', 'change-id'])
@@ -58,23 +174,93 @@ def add_upstream_patches(patches, image, tmp_dir,
branch = default_branch
patch_diff = build_utils.get_patch(patch['change-id'],
patch['project'], branch)
- if patch_diff:
+ project_path = project_to_path(patch['project'], patch_diff)
+ # If docker tag and python we know this patch belongs on docker
+ # container for a docker service. Therefore we build the dockerfile
+ # and move the patch into the containers directory. We also assume
+ # this builder call is for overcloud, because we do not support
+ # undercloud containers
+ if platform.machine() == 'aarch64':
+ docker_url = con.DOCKERHUB_AARCH64
+ else:
+ docker_url = con.DOCKERHUB_OOO
+ if docker_tag and 'python' in project_path:
+ # Projects map to multiple THT services, need to check which
+ # are supported
+ project_short_name = os.path.basename(patch['project'])
+ ooo_docker_services = project_to_docker_image(project_short_name,
+ docker_url)
+ if not ooo_docker_services:
+ logging.error("Did not find any matching docker containers "
+ "for project: {}".format(project_short_name))
+ raise exc.ApexCommonBuilderException(
+ 'Unable to find docker services for python project in '
+ 'patch')
+ # Just use the first image to see if patch was promoted into it
+ docker_img = ooo_docker_services[0]
+ else:
+ ooo_docker_services = []
+ docker_img = None
+ change = build_utils.get_change(con.OPENSTACK_GERRIT,
+ patch['project'], branch,
+ patch['change-id'])
+ patch_promoted = is_patch_promoted(change,
+ branch.replace('stable/', ''),
+ docker_url,
+ docker_img)
+
+ if patch_diff and not patch_promoted:
patch_file = "{}.patch".format(patch['change-id'])
- patch_file_path = os.path.join(tmp_dir, patch_file)
- with open(patch_file_path, 'w') as fh:
- fh.write(patch_diff)
- project_path = project_to_path(patch['project'])
- virt_ops.extend([
- {con.VIRT_UPLOAD: "{}:{}".format(patch_file_path,
- project_path)},
- {con.VIRT_RUN_CMD: "cd {} && patch -p1 < {}".format(
- project_path, patch_file)}])
- logging.info("Adding patch {} to {}".format(patch_file,
- image))
+ patch_file_paths = []
+ # If we found services, then we treat the patch like it applies to
+ # docker only
+ if ooo_docker_services:
+ os_version = default_branch.replace('stable/', '')
+ for service in ooo_docker_services:
+ docker_services = docker_services.union({service})
+ # We need to go root to be able to install patch and then
+ # switch back to previous user. Some containers that
+ # have the same name as the project do not necessarily
+ # contain the project code. For example
+ # novajoin-notifier does not contain nova package code.
+ # Therefore we must try to patch and unfortunately
+ # ignore failures until we have a better way of checking
+ # this
+ docker_cmds = [
+ "WORKDIR {}".format(project_path),
+ "USER root",
+ "ARG REAL_USER",
+ "RUN yum -y install patch",
+ "ADD {} {}".format(patch_file, project_path),
+ "RUN patch -p1 < {} || echo "
+ "'Patching failed'".format(patch_file),
+ "USER $REAL_USER"
+ ]
+ src_img_uri = "{}:8787/tripleo{}/centos-binary-{}:" \
+ "{}".format(uc_ip, os_version, service,
+ docker_tag)
+ oc_builder.build_dockerfile(service, tmp_dir, docker_cmds,
+ src_img_uri)
+ patch_file_paths.append(os.path.join(
+ tmp_dir, "containers/{}".format(service), patch_file))
+ else:
+ patch_file_path = os.path.join(tmp_dir, patch_file)
+ virt_ops.extend([
+ {con.VIRT_UPLOAD: "{}:{}".format(patch_file_path,
+ project_path)},
+ {con.VIRT_RUN_CMD: "cd {} && patch -p1 < {}".format(
+ project_path, patch_file)}])
+ logging.info("Adding patch {} to {}".format(patch_file,
+ image))
+ patch_file_paths.append(patch_file_path)
+ for patch_fp in patch_file_paths:
+ with open(patch_fp, 'w') as fh:
+ fh.write(patch_diff)
else:
logging.info("Ignoring patch:\n{}".format(patch))
if len(virt_ops) > 1:
virt_utils.virt_customize(virt_ops, image)
+ return docker_services
def add_repo(repo_url, repo_name, image, tmp_dir):
@@ -109,3 +295,41 @@ def create_git_archive(repo_url, repo_name, tmp_dir,
repo.archive(fh, prefix=prefix)
logging.debug("Wrote archive file: {}".format(archive_path))
return archive_path
+
+
+def get_neutron_driver(ds_opts):
+ sdn = ds_opts.get('sdn_controller', None)
+
+ if sdn == 'opendaylight':
+ return 'odl'
+ elif sdn == 'ovn':
+ return sdn
+ elif ds_opts.get('vpp', False):
+ return 'vpp'
+ else:
+ return None
+
+
+def prepare_container_images(prep_file, branch='master', neutron_driver=None):
+ if not os.path.isfile(prep_file):
+ raise exc.ApexCommonBuilderException("Prep file does not exist: "
+ "{}".format(prep_file))
+ with open(prep_file) as fh:
+ data = yaml.safe_load(fh)
+ try:
+ p_set = data['parameter_defaults']['ContainerImagePrepare'][0]['set']
+ if neutron_driver:
+ p_set['neutron_driver'] = neutron_driver
+ p_set['namespace'] = "docker.io/tripleo{}".format(branch)
+ if platform.machine() == 'aarch64':
+ p_set['namespace'] = "docker.io/armbandapex"
+ p_set['ceph_tag'] = 'v3.1.0-stable-3.1-luminous-centos-7-aarch64'
+
+ except KeyError:
+ logging.error("Invalid prep file format: {}".format(prep_file))
+ raise exc.ApexCommonBuilderException("Invalid format for prep file")
+
+ logging.debug("Writing new container prep file:\n{}".format(
+ pprint.pformat(data)))
+ with open(prep_file, 'w') as fh:
+ yaml.safe_dump(data, fh, default_flow_style=False)
diff --git a/apex/builders/exceptions.py b/apex/builders/exceptions.py
new file mode 100644
index 0000000..b88f02b
--- /dev/null
+++ b/apex/builders/exceptions.py
@@ -0,0 +1,12 @@
+##############################################################################
+# Copyright (c) 2018 Tim Rozet (trozet@redhat.com) and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+
+class ApexCommonBuilderException(Exception):
+ pass
diff --git a/apex/builders/overcloud_builder.py b/apex/builders/overcloud_builder.py
index e7b0796..eab8fb6 100644
--- a/apex/builders/overcloud_builder.py
+++ b/apex/builders/overcloud_builder.py
@@ -10,17 +10,27 @@
# Used to modify overcloud qcow2 image
import logging
+import os
+import tarfile
-from apex.builders import common_builder as c_builder
+import apex.builders.common_builder
from apex.common import constants as con
+from apex.common import utils as utils
+from apex.common.exceptions import ApexBuildException
from apex.virtual import utils as virt_utils
-def inject_opendaylight(odl_version, image, tmp_dir):
+def inject_opendaylight(odl_version, image, tmp_dir, uc_ip,
+ os_version, docker_tag=None):
assert odl_version in con.VALID_ODL_VERSIONS
# add repo
if odl_version == 'master':
+ # last version in the constants is "master" so select 2nd to last
+ # odl package version has no "master" version
odl_pkg_version = con.VALID_ODL_VERSIONS[-2]
+ # branch will be used to pull puppet-opendaylight. Since puppet-odl
+ # does not pull branch until later, we need to use master version of
+ # that if master ODL version is specified
branch = odl_version
else:
odl_pkg_version = odl_version
@@ -28,18 +38,137 @@ def inject_opendaylight(odl_version, image, tmp_dir):
odl_url = "https://nexus.opendaylight.org/content/repositories" \
"/opendaylight-{}-epel-7-x86_64-devel/".format(odl_pkg_version)
repo_name = "opendaylight-{}".format(odl_pkg_version)
- c_builder.add_repo(odl_url, repo_name, image, tmp_dir)
+ apex.builders.common_builder.add_repo(odl_url, repo_name, image, tmp_dir)
# download puppet-opendaylight
- archive = c_builder.create_git_archive(
+ archive = apex.builders.common_builder.create_git_archive(
repo_url=con.PUPPET_ODL_URL, repo_name='puppet-opendaylight',
tmp_dir=tmp_dir, branch=branch, prefix='opendaylight/')
# install ODL, puppet-odl
virt_ops = [
- {con.VIRT_INSTALL: 'opendaylight'},
{con.VIRT_UPLOAD: "{}:/etc/puppet/modules/".format(archive)},
{con.VIRT_RUN_CMD: 'rm -rf /etc/puppet/modules/opendaylight'},
{con.VIRT_RUN_CMD: "cd /etc/puppet/modules/ && tar xvf "
- "puppet-opendaylight.tar"}
+ "puppet-opendaylight.tar"},
+ {con.VIRT_INSTALL: "java-1.8.0-openjdk"}
]
+ if docker_tag:
+ docker_cmds = [
+ "RUN yum remove opendaylight -y",
+ "RUN echo $'[opendaylight]\\n\\",
+ "baseurl={}\\n\\".format(odl_url),
+ "gpgcheck=0\\n\\",
+ "enabled=1' > /etc/yum.repos.d/opendaylight.repo",
+ "RUN yum -y install opendaylight"
+ ]
+ src_img_uri = "{}:8787/tripleo{}/centos-binary-{}:" \
+ "{}".format(uc_ip, os_version, 'opendaylight',
+ docker_tag)
+ build_dockerfile('opendaylight', tmp_dir, docker_cmds, src_img_uri)
+ else:
+ virt_ops.append({con.VIRT_INSTALL: 'opendaylight'})
virt_utils.virt_customize(virt_ops, image)
logging.info("OpenDaylight injected into {}".format(image))
+
+
+def inject_quagga(image, tmp_dir):
+ """
+ Downloads quagga tarball from artifacts.opnfv.org
+ and install it on the overcloud image on the fly.
+ :param image:
+ :param tmp_dir:
+ :return:
+ """
+ utils.fetch_upstream_and_unpack(tmp_dir,
+ os.path.split(con.QUAGGA_URL)[0] + "/",
+ [os.path.basename(con.QUAGGA_URL)])
+
+ virt_ops = [
+ {con.VIRT_UPLOAD: "{}/quagga-4.tar.gz:/root/".format(tmp_dir)},
+ {con.VIRT_RUN_CMD: "cd /root/ && tar xzf quagga-4.tar.gz"},
+ {con.VIRT_RUN_CMD: "cd /root/quagga;packages=$(ls |grep -vE 'debug"
+ "info|devel|contrib');yum -y install $packages"}
+ ]
+ virt_utils.virt_customize(virt_ops, image)
+ logging.info("Quagga injected into {}".format(image))
+
+
+def inject_ovs_nsh(image, tmp_dir):
+ """
+ Downloads OpenVswitch, compiles it and installs it on the
+ overcloud image on the fly.
+ :param image:
+ :param tmp_dir:
+ :return:
+ """
+ ovs_filename = os.path.basename(con.OVS_URL)
+ ovs_folder = ovs_filename.replace(".tar.gz", "")
+ utils.fetch_upstream_and_unpack(tmp_dir,
+ os.path.split(con.OVS_URL)[0] + "/",
+ [ovs_filename])
+ (ovs_dist_name, ovs_version) = ovs_folder.split("-")
+
+ virt_ops = [
+ {con.VIRT_UPLOAD: "{}:/root/".format(tmp_dir + "/" + ovs_filename)},
+ {con.VIRT_INSTALL: "rpm-build,autoconf,automake,libtool,openssl,"
+ "openssl-devel,python,python-twisted-core,python-six,groff,graphviz,"
+ "python-zope-interface,desktop-file-utils,procps-ng,PyQt4,"
+ "libcap-ng,libcap-ng-devel,selinux-policy-devel,kernel-devel,"
+ "kernel-headers,kernel-tools,rpmdevtools,systemd-units,python-devel,"
+ "python-sphinx"},
+ {con.VIRT_RUN_CMD: "cd /root/ && tar xzf {}".format(ovs_filename)},
+ {con.VIRT_UPLOAD:
+ "{}/build_ovs_nsh.sh:/root/{}".format(tmp_dir, ovs_folder)},
+ {con.VIRT_RUN_CMD:
+ "cd /root/{0} && chmod -R 777 * && chown -R root:root * && "
+ "./build_ovs_nsh.sh && rpm -Uhv --force rpm/rpmbuild/RPMS/x86_64/{0}"
+ "-1.el7.x86_64.rpm && rpm -Uhv --force rpm/rpmbuild/RPMS/x86_64"
+ "/openvswitch-kmod-{1}-1.el7.x86_64.rpm".format(ovs_folder,
+ ovs_version)}
+ ]
+ virt_utils.virt_customize(virt_ops, image)
+ logging.info("OVS injected into {}".format(image))
+
+
+def build_dockerfile(service, tmp_dir, docker_cmds, src_image_uri):
+ """
+ Builds docker file per service and stores it in a
+ tmp_dir/containers/<service> directory. If the Dockerfile already exists,
+ simply append the docker cmds to it.
+ :param service: name of sub-directory to store Dockerfile in
+ :param tmp_dir: Temporary directory to store the container's dockerfile in
+ :param docker_cmds: List of commands to insert into the dockerfile
+ :param src_image_uri: Docker URI format for where the source image exists
+ :return: None
+ """
+ logging.debug("Building Dockerfile for {} with docker_cmds: {}".format(
+ service, docker_cmds))
+ c_dir = os.path.join(tmp_dir, 'containers')
+ service_dir = os.path.join(c_dir, service)
+ if not os.path.isdir(service_dir):
+ os.makedirs(service_dir, exist_ok=True)
+ from_cmd = "FROM {}\n".format(src_image_uri)
+ service_file = os.path.join(service_dir, 'Dockerfile')
+ assert isinstance(docker_cmds, list)
+ if os.path.isfile(service_file):
+ append_cmds = True
+ else:
+ append_cmds = False
+ with open(service_file, "a+") as fh:
+ if not append_cmds:
+ fh.write(from_cmd)
+ fh.write('\n'.join(docker_cmds))
+
+
+def archive_docker_patches(tmp_dir):
+ """
+ Archives Overcloud docker patches into a tar file for upload to Undercloud
+ :param tmp_dir: temporary directory where containers folder is stored
+ :return: None
+ """
+ container_path = os.path.join(tmp_dir, 'containers')
+ if not os.path.isdir(container_path):
+ raise ApexBuildException("Docker directory for patches not found: "
+ "{}".format(container_path))
+ archive_file = os.path.join(tmp_dir, 'docker_patches.tar.gz')
+ with tarfile.open(archive_file, "w:gz") as tar:
+ tar.add(container_path, arcname=os.path.basename(container_path))
diff --git a/apex/builders/undercloud_builder.py b/apex/builders/undercloud_builder.py
index baba8a5..47d2568 100644
--- a/apex/builders/undercloud_builder.py
+++ b/apex/builders/undercloud_builder.py
@@ -8,8 +8,13 @@
##############################################################################
# Used to modify undercloud qcow2 image
+import logging
+import json
+import os
+import subprocess
from apex.common import constants as con
+from apex.common import utils
from apex.virtual import utils as virt_utils
@@ -21,18 +26,82 @@ def add_upstream_packages(image):
"""
virt_ops = list()
pkgs = [
+ 'epel-release',
'openstack-utils',
- 'ceph-common',
'python2-networking-sfc',
'openstack-ironic-inspector',
'subunit-filters',
'docker-distribution',
'openstack-tripleo-validations',
'libguestfs-tools',
+ 'python-tripleoclient',
+ 'openstack-tripleo-heat-templates'
]
+ # Remove incompatible python-docker version
+ virt_ops.append({con.VIRT_RUN_CMD: "yum remove -y python-docker-py"})
for pkg in pkgs:
virt_ops.append({con.VIRT_INSTALL: pkg})
virt_utils.virt_customize(virt_ops, image)
+
+def inject_calipso_installer(tmp_dir, image):
+ """
+ Downloads calipso installer script from artifacts.opnfv.org
+ and puts it under /root/ for further installation process.
+ :return:
+ """
+ calipso_file = os.path.basename(con.CALIPSO_INSTALLER_URL)
+ calipso_url = con.CALIPSO_INSTALLER_URL.replace(calipso_file, '')
+ utils.fetch_upstream_and_unpack(tmp_dir, calipso_url, [calipso_file])
+
+ virt_ops = [
+ {con.VIRT_UPLOAD: "{}/{}:/root/".format(tmp_dir, calipso_file)}]
+ virt_utils.virt_customize(virt_ops, image)
+ logging.info("Calipso injected into {}".format(image))
+
+# TODO(trozet): add unit testing for calipso injector
# TODO(trozet): add rest of build for undercloud here as well
+
+
+def update_repos(image, branch):
+ virt_ops = [
+ {con.VIRT_RUN_CMD: "rm -f /etc/yum.repos.d/delorean*"},
+ {con.VIRT_RUN_CMD: "yum-config-manager --add-repo "
+ "https://trunk.rdoproject.org/centos7/{}"
+ "/delorean.repo".format(con.RDO_TAG)},
+ {con.VIRT_RUN_CMD: "yum clean all"},
+ {con.VIRT_INSTALL: "python2-tripleo-repos"},
+ {con.VIRT_RUN_CMD: "tripleo-repos -b {} {} ceph".format(branch,
+ con.RDO_TAG)}
+ ]
+ virt_utils.virt_customize(virt_ops, image)
+
+
+def expand_disk(image, desired_size=50):
+ """
+ Expands a disk image to desired_size in GigaBytes
+ :param image: image to resize
+ :param desired_size: desired size in GB
+ :return: None
+ """
+ # there is a lib called vminspect which has some dependencies and is
+ # not yet available in pip. Consider switching to this lib later.
+ try:
+ img_out = json.loads(subprocess.check_output(
+ ['qemu-img', 'info', '--output=json', image],
+ stderr=subprocess.STDOUT).decode())
+ disk_gb_size = int(img_out['virtual-size'] / 1000000000)
+ if disk_gb_size < desired_size:
+ logging.info("Expanding disk image: {}. Current size: {} is less"
+ "than require size: {}".format(image, disk_gb_size,
+ desired_size))
+ diff_size = desired_size - disk_gb_size
+ subprocess.check_call(['qemu-img', 'resize', image,
+ "+{}G".format(diff_size)],
+ stderr=subprocess.STDOUT)
+
+ except (subprocess.CalledProcessError, json.JSONDecodeError, KeyError) \
+ as e:
+ logging.warning("Unable to resize disk, disk may not be large "
+ "enough: {}".format(e))
diff --git a/apex/clean.py b/apex/clean.py
index f56287e..3e33c8e 100644
--- a/apex/clean.py
+++ b/apex/clean.py
@@ -114,7 +114,13 @@ def clean_networks():
logging.debug("Destroying virsh network: {}".format(network))
if virsh_net.isActive():
virsh_net.destroy()
- virsh_net.undefine()
+ try:
+ virsh_net.undefine()
+ except libvirt.libvirtError as e:
+ if 'Network not found' in e.get_error_message():
+ logging.debug('Network already undefined')
+ else:
+ raise
def main():
diff --git a/apex/common/constants.py b/apex/common/constants.py
index a2b9a63..59988f7 100644
--- a/apex/common/constants.py
+++ b/apex/common/constants.py
@@ -16,7 +16,7 @@ STORAGE_NETWORK = 'storage'
API_NETWORK = 'api'
CONTROLLER = 'controller'
COMPUTE = 'compute'
-
+ANSIBLE_PATH = 'ansible/playbooks'
OPNFV_NETWORK_TYPES = [ADMIN_NETWORK, TENANT_NETWORK, EXTERNAL_NETWORK,
STORAGE_NETWORK, API_NETWORK]
DNS_SERVERS = ["8.8.8.8", "8.8.4.4"]
@@ -39,14 +39,43 @@ VIRT_PW = '--root-password'
THT_DIR = '/usr/share/openstack-tripleo-heat-templates'
THT_ENV_DIR = os.path.join(THT_DIR, 'environments')
+THT_DOCKER_ENV_DIR = os.path.join(THT_ENV_DIR, 'services')
-DEFAULT_OS_VERSION = 'pike'
-DEFAULT_ODL_VERSION = 'nitrogen'
-VALID_ODL_VERSIONS = ['carbon', 'nitrogen', 'oxygen', 'master']
+DEFAULT_OS_VERSION = 'master'
+DEFAULT_ODL_VERSION = 'oxygen'
+VALID_ODL_VERSIONS = ['carbon', 'nitrogen', 'oxygen', 'fluorine',
+ 'neon', 'master']
PUPPET_ODL_URL = 'https://git.opendaylight.org/gerrit/integration/packaging' \
'/puppet-opendaylight'
DEBUG_OVERCLOUD_PW = 'opnfvapex'
NET_ENV_FILE = 'network-environment.yaml'
-DEPLOY_TIMEOUT = 90
-UPSTREAM_RDO = 'https://images.rdoproject.org/pike/delorean/current-tripleo/'
-OPENSTACK_GERRIT = 'https://review.openstack.org'
+DEPLOY_TIMEOUT = 120
+RDO_TAG = 'current-tripleo'
+UPSTREAM_RDO = "https://images.rdoproject.org/master/rdo_trunk/{}/".format(
+ RDO_TAG)
+OPENSTACK_GERRIT = 'https://review.opendev.org'
+
+DOCKER_TAG = RDO_TAG
+# Maps regular service files to docker versions
+# None value means mapping is same as key
+VALID_DOCKER_SERVICES = {
+ 'neutron-opendaylight.yaml': None,
+ 'neutron-opendaylight-dpdk.yaml': None,
+ 'neutron-opendaylight-sriov.yaml': None,
+ 'neutron-bgpvpn-opendaylight.yaml': None,
+ 'neutron-sfc-opendaylight.yaml': None,
+ 'neutron-ml2-ovn.yaml': 'neutron-ovn-ha.yaml'
+}
+DOCKERHUB_OOO = 'https://registry.hub.docker.com/v2/repositories' \
+ '/tripleomaster/'
+DOCKERHUB_AARCH64 = 'https://registry.hub.docker.com/v2/repositories' \
+ '/armbandapex/'
+KUBESPRAY_URL = 'https://github.com/kubernetes-incubator/kubespray.git'
+OPNFV_ARTIFACTS = 'http://storage.googleapis.com/artifacts.opnfv.org'
+CUSTOM_OVS = '{}/apex/random/openvswitch-2.9.0-9.el7fdn.x86_64.' \
+ 'rpm'.format(OPNFV_ARTIFACTS)
+
+OVS_URL = "http://openvswitch.org/releases/openvswitch-2.9.2.tar.gz"
+QUAGGA_URL = "{}/sdnvpn/quagga/quagga-4.tar.gz".format(OPNFV_ARTIFACTS)
+CALIPSO_INSTALLER_URL = "https://raw.githubusercontent.com/opnfv/calipso" \
+ "/master/app/install/calipso-installer.py"
diff --git a/apex/common/exceptions.py b/apex/common/exceptions.py
index 54d9983..6d8383b 100644
--- a/apex/common/exceptions.py
+++ b/apex/common/exceptions.py
@@ -18,3 +18,19 @@ class JumpHostNetworkException(Exception):
class ApexCleanException(Exception):
pass
+
+
+class ApexBuildException(Exception):
+ pass
+
+
+class SnapshotDeployException(Exception):
+ pass
+
+
+class OvercloudNodeException(Exception):
+ pass
+
+
+class FetchException(Exception):
+ pass
diff --git a/apex/common/utils.py b/apex/common/utils.py
index 13250a4..72a66d1 100644
--- a/apex/common/utils.py
+++ b/apex/common/utils.py
@@ -8,10 +8,12 @@
##############################################################################
import datetime
+import distro
import json
import logging
import os
import pprint
+import socket
import subprocess
import tarfile
import time
@@ -20,6 +22,8 @@ import urllib.request
import urllib.parse
import yaml
+from apex.common import exceptions as exc
+
def str2bool(var):
if isinstance(var, bool):
@@ -71,12 +75,17 @@ def run_ansible(ansible_vars, playbook, host='localhost', user='root',
Executes ansible playbook and checks for errors
:param ansible_vars: dictionary of variables to inject into ansible run
:param playbook: playbook to execute
+ :param host: inventory file or string of target hosts
+ :param user: remote user to run ansible tasks
:param tmp_dir: temp directory to store ansible command
:param dry_run: Do not actually apply changes
:return: None
"""
logging.info("Executing ansible playbook: {}".format(playbook))
- inv_host = "{},".format(host)
+ if not os.path.isfile(host):
+ inv_host = "{},".format(host)
+ else:
+ inv_host = host
if host == 'localhost':
conn_type = 'local'
else:
@@ -137,45 +146,66 @@ def run_ansible(ansible_vars, playbook, host='localhost', user='root',
raise Exception(e)
-def fetch_upstream_and_unpack(dest, url, targets):
+def get_url_modified_date(url):
+ """
+ Returns the last modified date for an Tripleo image artifact
+ :param url: URL to examine
+ :return: datetime object of when artifact was last modified
+ """
+ try:
+ u = urllib.request.urlopen(url)
+ except urllib.error.URLError as e:
+ logging.error("Failed to fetch target url. Error: {}".format(
+ e.reason))
+ raise
+
+ metadata = u.info()
+ headers = metadata.items()
+ for header in headers:
+ if isinstance(header, tuple) and len(header) == 2:
+ if header[0] == 'Last-Modified':
+ return datetime.datetime.strptime(header[1],
+ "%a, %d %b %Y %X GMT")
+
+
+def fetch_upstream_and_unpack(dest, url, targets, fetch=True):
"""
Fetches targets from a url destination and downloads them if they are
newer. Also unpacks tar files in dest dir.
:param dest: Directory to download and unpack files to
:param url: URL where target files are located
:param targets: List of target files to download
+ :param fetch: Whether or not to fetch latest from internet (boolean)
:return: None
"""
os.makedirs(dest, exist_ok=True)
assert isinstance(targets, list)
for target in targets:
- download_target = True
target_url = urllib.parse.urljoin(url, target)
target_dest = os.path.join(dest, target)
- logging.debug("Fetching and comparing upstream target: \n{}".format(
- target_url))
- try:
- u = urllib.request.urlopen(target_url)
- except urllib.error.URLError as e:
- logging.error("Failed to fetch target url. Error: {}".format(
- e.reason))
- raise
- if os.path.isfile(target_dest):
+ target_exists = os.path.isfile(target_dest)
+ if fetch:
+ download_target = True
+ elif not target_exists:
+ logging.warning("no-fetch requested but target: {} is not "
+ "cached, will download".format(target_dest))
+ download_target = True
+ else:
+ logging.info("no-fetch requested and previous cache exists for "
+ "target: {}. Will skip download".format(target_dest))
+ download_target = False
+
+ if download_target:
+ logging.debug("Fetching and comparing upstream"
+ " target: \n{}".format(target_url))
+ # Check if previous file and fetch we need to compare files to
+ # determine if download is necessary
+ if target_exists and download_target:
logging.debug("Previous file found: {}".format(target_dest))
- metadata = u.info()
- headers = metadata.items()
- target_url_date = None
- for header in headers:
- if isinstance(header, tuple) and len(header) == 2:
- if header[0] == 'Last-Modified':
- target_url_date = header[1]
- break
+ target_url_date = get_url_modified_date(target_url)
if target_url_date is not None:
target_dest_mtime = os.path.getmtime(target_dest)
- target_url_mtime = time.mktime(
- datetime.datetime.strptime(target_url_date,
- "%a, %d %b %Y %X "
- "GMT").timetuple())
+ target_url_mtime = time.mktime(target_url_date.timetuple())
if target_url_mtime > target_dest_mtime:
logging.debug('URL target is newer than disk...will '
'download')
@@ -184,11 +214,111 @@ def fetch_upstream_and_unpack(dest, url, targets):
download_target = False
else:
logging.debug('Unable to find last modified url date')
+
if download_target:
urllib.request.urlretrieve(target_url, filename=target_dest)
logging.info("Target downloaded: {}".format(target))
- if target.endswith('.tar'):
+ if target.endswith(('.tar', 'tar.gz', 'tgz')):
logging.info('Unpacking tar file')
tar = tarfile.open(target_dest)
tar.extractall(path=dest)
tar.close()
+
+
+def install_ansible():
+ # we only install for CentOS/Fedora for now
+ dist = distro.id()
+ if 'centos' in dist:
+ pkg_mgr = 'yum'
+ elif 'fedora' in dist:
+ pkg_mgr = 'dnf'
+ else:
+ return
+
+ # yum python module only exists for 2.x, so use subprocess
+ try:
+ subprocess.check_call([pkg_mgr, '-y', 'install', 'ansible'])
+ except subprocess.CalledProcessError:
+ logging.warning('Unable to install Ansible')
+
+
+def internet_connectivity():
+ try:
+ urllib.request.urlopen('http://opnfv.org', timeout=3)
+ return True
+ except (urllib.request.URLError, socket.timeout):
+ logging.debug('No internet connectivity detected')
+ return False
+
+
+def open_webpage(url, timeout=5):
+ try:
+ response = urllib.request.urlopen(url, timeout=timeout)
+ return response.read()
+ except (urllib.request.URLError, socket.timeout) as e:
+ logging.error("Unable to open URL: {}".format(url))
+ raise exc.FetchException('Unable to open URL') from e
+
+
+def edit_tht_env(env_file, section, settings):
+ assert isinstance(settings, dict)
+ with open(env_file) as fh:
+ data = yaml.safe_load(fh)
+
+ if section not in data.keys():
+ data[section] = {}
+ for setting, value in settings.items():
+ data[section][setting] = value
+ with open(env_file, 'w') as fh:
+ yaml.safe_dump(data, fh, default_flow_style=False)
+ logging.debug("Data written to env file {}:\n{}".format(env_file, data))
+
+
+def unique(tmp_list):
+ assert isinstance(tmp_list, list)
+ uniq_list = []
+ for x in tmp_list:
+ if x not in uniq_list:
+ uniq_list.append(x)
+ return uniq_list
+
+
+def bash_settings_to_dict(data):
+ """
+ Parses bash settings x=y and returns dict of key, values
+ :param data: bash settings data in x=y format
+ :return: dict of keys and values
+ """
+ return dict(item.split('=') for item in data.splitlines())
+
+
+def fetch_properties(url):
+ """
+ Downloads OPNFV properties and returns a dictionary of the key, values
+ :param url: URL of properties file
+ :return: dict of k,v for each properties
+ """
+ if bool(urllib.parse.urlparse(url).scheme):
+ logging.debug('Fetching properties from internet: {}'.format(url))
+ return bash_settings_to_dict(open_webpage(url).decode('utf-8'))
+ elif os.path.isfile(url):
+ logging.debug('Fetching properties from file: {}'.format(url))
+ with open(url, 'r') as fh:
+ data = fh.read()
+ return bash_settings_to_dict(data)
+ else:
+ logging.warning('Unable to fetch properties for: {}'.format(url))
+ raise exc.FetchException('Unable determine properties location: '
+ '{}'.format(url))
+
+
+def find_container_client(os_version):
+ """
+ Determines whether to use docker or podman client
+ :param os_version: openstack version
+ :return: client name as string
+ """
+ if os_version == 'rocky' or os_version == 'queens':
+ return 'docker'
+ else:
+ return 'podman'
diff --git a/apex/deploy.py b/apex/deploy.py
index 5485d15..d0c2b20 100644
--- a/apex/deploy.py
+++ b/apex/deploy.py
@@ -10,6 +10,7 @@
##############################################################################
import argparse
+import git
import json
import logging
import os
@@ -18,20 +19,23 @@ import pprint
import shutil
import sys
import tempfile
+import yaml
import apex.virtual.configure_vm as vm_lib
import apex.virtual.utils as virt_utils
+import apex.builders.common_builder as c_builder
+import apex.builders.overcloud_builder as oc_builder
+import apex.builders.undercloud_builder as uc_builder
from apex import DeploySettings
from apex import Inventory
from apex import NetworkEnvironment
from apex import NetworkSettings
-from apex.builders import common_builder as c_builder
-from apex.builders import overcloud_builder as oc_builder
-from apex.builders import undercloud_builder as uc_builder
+from apex.deployment.snapshot import SnapshotDeployment
from apex.common import utils
from apex.common import constants
from apex.common import parsers
from apex.common.exceptions import ApexDeployException
+from apex.deployment.tripleo import ApexDeployment
from apex.network import jumphost
from apex.network import network_data
from apex.undercloud import undercloud as uc_lib
@@ -39,13 +43,13 @@ from apex.overcloud import config as oc_cfg
from apex.overcloud import deploy as oc_deploy
APEX_TEMP_DIR = tempfile.mkdtemp(prefix='apex_tmp')
-ANSIBLE_PATH = 'ansible/playbooks'
SDN_IMAGE = 'overcloud-full-opendaylight.qcow2'
-
-
-def deploy_quickstart(args, deploy_settings_file, network_settings_file,
- inventory_file=None):
- pass
+UC_DISK_FILES = [
+ 'overcloud-full.vmlinuz',
+ 'overcloud-full.initrd',
+ 'ironic-python-agent.initramfs',
+ 'ironic-python-agent.kernel'
+]
def validate_cross_settings(deploy_settings, net_settings, inventory):
@@ -113,7 +117,7 @@ def create_deploy_parser():
help='File which contains Apex deploy settings')
deploy_parser.add_argument('-n', '--network-settings',
dest='network_settings_file',
- required=True,
+ required=False,
help='File which contains Apex network '
'settings')
deploy_parser.add_argument('-i', '--inventory-file',
@@ -174,13 +178,29 @@ def create_deploy_parser():
default='/usr/share/opnfv-apex',
help='Directory path for apex ansible '
'and third party libs')
- deploy_parser.add_argument('--quickstart', action='store_true',
+ deploy_parser.add_argument('-s', '--snapshot', action='store_true',
default=False,
- help='Use tripleo-quickstart to deploy')
+ help='Use snapshots for deployment')
+ deploy_parser.add_argument('--snap-cache', dest='snap_cache',
+ default="{}/snap_cache".format(
+ os.path.expanduser('~')),
+ help='Local directory to cache snapshot '
+ 'artifacts. Defaults to $HOME/snap_cache')
deploy_parser.add_argument('--upstream', action='store_true',
- default=False,
+ default=True,
help='Force deployment to use upstream '
- 'artifacts')
+ 'artifacts. This option is now '
+ 'deprecated and only upstream '
+ 'deployments are supported.')
+ deploy_parser.add_argument('--no-fetch', action='store_true',
+ default=False,
+ help='Ignore fetching latest upstream and '
+ 'use what is in cache')
+ deploy_parser.add_argument('-p', '--patches',
+ default='/etc/opnfv-apex/common-patches.yaml',
+ dest='patches_file',
+ help='File to include for common patches '
+ 'which apply to all deployment scenarios')
return deploy_parser
@@ -192,20 +212,25 @@ def validate_deploy_args(args):
"""
logging.debug('Validating arguments for deployment')
- if args.virtual and args.inventory_file is not None:
+ if args.snapshot:
+ logging.debug('Skipping inventory validation as it is not applicable'
+ 'to snapshot deployments')
+ elif args.virtual and args.inventory_file is not None:
logging.error("Virtual enabled but inventory file also given")
raise ApexDeployException('You should not specify an inventory file '
'with virtual deployments')
elif args.virtual:
args.inventory_file = os.path.join(APEX_TEMP_DIR,
'inventory-virt.yaml')
- elif os.path.isfile(args.inventory_file) is False:
+ elif not os.path.isfile(args.inventory_file):
logging.error("Specified inventory file does not exist: {}".format(
args.inventory_file))
raise ApexDeployException('Specified inventory file does not exist')
for settings_file in (args.deploy_settings_file,
args.network_settings_file):
+ if settings_file == args.network_settings_file and args.snapshot:
+ continue
if os.path.isfile(settings_file) is False:
logging.error("Specified settings file does not "
"exist: {}".format(settings_file))
@@ -234,74 +259,99 @@ def main():
console.setLevel(log_level)
console.setFormatter(logging.Formatter(formatter))
logging.getLogger('').addHandler(console)
+ utils.install_ansible()
validate_deploy_args(args)
# Parse all settings
deploy_settings = DeploySettings(args.deploy_settings_file)
logging.info("Deploy settings are:\n {}".format(pprint.pformat(
- deploy_settings)))
- net_settings = NetworkSettings(args.network_settings_file)
- logging.info("Network settings are:\n {}".format(pprint.pformat(
- net_settings)))
- os_version = deploy_settings['deploy_options']['os_version']
- net_env_file = os.path.join(args.deploy_dir, constants.NET_ENV_FILE)
- net_env = NetworkEnvironment(net_settings, net_env_file,
- os_version=os_version)
- net_env_target = os.path.join(APEX_TEMP_DIR, constants.NET_ENV_FILE)
- utils.dump_yaml(dict(net_env), net_env_target)
- ha_enabled = deploy_settings['global_params']['ha_enabled']
- if args.virtual:
- if args.virt_compute_ram is None:
- compute_ram = args.virt_default_ram
- else:
- compute_ram = args.virt_compute_ram
- if deploy_settings['deploy_options']['sdn_controller'] == \
- 'opendaylight' and args.virt_default_ram < 12:
- control_ram = 12
- logging.warning('RAM per controller is too low. OpenDaylight '
- 'requires at least 12GB per controller.')
- logging.info('Increasing RAM per controller to 12GB')
- elif args.virt_default_ram < 10:
- control_ram = 10
- logging.warning('RAM per controller is too low. nosdn '
- 'requires at least 10GB per controller.')
- logging.info('Increasing RAM per controller to 10GB')
- else:
- control_ram = args.virt_default_ram
- if ha_enabled and args.virt_compute_nodes < 2:
- logging.debug('HA enabled, bumping number of compute nodes to 2')
- args.virt_compute_nodes = 2
- virt_utils.generate_inventory(args.inventory_file, ha_enabled,
- num_computes=args.virt_compute_nodes,
- controller_ram=control_ram * 1024,
- compute_ram=compute_ram * 1024,
- vcpus=args.virt_cpus
- )
- inventory = Inventory(args.inventory_file, ha_enabled, args.virtual)
-
- validate_cross_settings(deploy_settings, net_settings, inventory)
+ deploy_settings)))
+
+ if not args.snapshot:
+ net_settings = NetworkSettings(args.network_settings_file)
+ logging.info("Network settings are:\n {}".format(pprint.pformat(
+ net_settings)))
+ os_version = deploy_settings['deploy_options']['os_version']
+ net_env_file = os.path.join(args.deploy_dir, constants.NET_ENV_FILE)
+ net_env = NetworkEnvironment(net_settings, net_env_file,
+ os_version=os_version)
+ net_env_target = os.path.join(APEX_TEMP_DIR, constants.NET_ENV_FILE)
+ utils.dump_yaml(dict(net_env), net_env_target)
+
+ # get global deploy params
+ ha_enabled = deploy_settings['global_params']['ha_enabled']
+ introspect = deploy_settings['global_params'].get('introspect', True)
+ net_list = net_settings.enabled_network_list
+ if args.virtual:
+ if args.virt_compute_ram is None:
+ compute_ram = args.virt_default_ram
+ else:
+ compute_ram = args.virt_compute_ram
+ if (deploy_settings['deploy_options']['sdn_controller'] ==
+ 'opendaylight' and args.virt_default_ram < 12):
+ control_ram = 12
+ logging.warning('RAM per controller is too low. OpenDaylight '
+ 'requires at least 12GB per controller.')
+ logging.info('Increasing RAM per controller to 12GB')
+ elif args.virt_default_ram < 10:
+ if platform.machine() == 'aarch64':
+ control_ram = 16
+ logging.warning('RAM per controller is too low for '
+ 'aarch64 ')
+ logging.info('Increasing RAM per controller to 16GB')
+ else:
+ control_ram = 10
+ logging.warning('RAM per controller is too low. nosdn '
+ 'requires at least 10GB per controller.')
+ logging.info('Increasing RAM per controller to 10GB')
+ else:
+ control_ram = args.virt_default_ram
+ if platform.machine() == 'aarch64' and args.virt_cpus < 16:
+ vcpus = 16
+ logging.warning('aarch64 requires at least 16 vCPUS per '
+ 'target VM. Increasing to 16.')
+ else:
+ vcpus = args.virt_cpus
+ if ha_enabled and args.virt_compute_nodes < 2:
+ logging.debug(
+ 'HA enabled, bumping number of compute nodes to 2')
+ args.virt_compute_nodes = 2
+ virt_utils.generate_inventory(args.inventory_file, ha_enabled,
+ num_computes=args.virt_compute_nodes,
+ controller_ram=control_ram * 1024,
+ compute_ram=compute_ram * 1024,
+ vcpus=vcpus
+ )
+ inventory = Inventory(args.inventory_file, ha_enabled, args.virtual)
+ logging.info("Inventory is:\n {}".format(pprint.pformat(
+ inventory)))
+
+ validate_cross_settings(deploy_settings, net_settings, inventory)
+ else:
+ # only one network with snapshots
+ net_list = [constants.ADMIN_NETWORK]
+
ds_opts = deploy_settings['deploy_options']
- if args.quickstart:
- deploy_settings_file = os.path.join(APEX_TEMP_DIR,
- 'apex_deploy_settings.yaml')
- utils.dump_yaml(utils.dict_objects_to_str(deploy_settings),
- deploy_settings_file)
- logging.info("File created: {}".format(deploy_settings_file))
- network_settings_file = os.path.join(APEX_TEMP_DIR,
- 'apex_network_settings.yaml')
- utils.dump_yaml(utils.dict_objects_to_str(net_settings),
- network_settings_file)
- logging.info("File created: {}".format(network_settings_file))
- deploy_quickstart(args, deploy_settings_file, network_settings_file,
- args.inventory_file)
+ ansible_args = {
+ 'virsh_enabled_networks': net_list,
+ 'snapshot': args.snapshot
+ }
+ utils.run_ansible(ansible_args,
+ os.path.join(args.lib_dir, constants.ANSIBLE_PATH,
+ 'deploy_dependencies.yml'))
+ all_in_one = not bool(args.virt_compute_nodes)
+ if args.snapshot:
+ # Start snapshot Deployment
+ logging.info('Executing Snapshot Deployment...')
+ SnapshotDeployment(deploy_settings=deploy_settings,
+ snap_cache_dir=args.snap_cache,
+ fetch=not args.no_fetch,
+ all_in_one=all_in_one)
else:
+ # Start Standard TripleO Deployment
+ deployment = ApexDeployment(deploy_settings, args.patches_file,
+ args.deploy_settings_file)
# TODO (trozet): add logic back from:
# Iedb75994d35b5dc1dd5d5ce1a57277c8f3729dfd (FDIO DVR)
- ansible_args = {
- 'virsh_enabled_networks': net_settings.enabled_network_list
- }
- utils.run_ansible(ansible_args,
- os.path.join(args.lib_dir, ANSIBLE_PATH,
- 'deploy_dependencies.yml'))
uc_external = False
if 'external' in net_settings.enabled_network_list:
uc_external = True
@@ -333,62 +383,93 @@ def main():
else:
root_pw = None
- upstream = (os_version != constants.DEFAULT_OS_VERSION or
- args.upstream)
+ if not args.upstream:
+ logging.warning("Using upstream is now required for Apex. "
+ "Forcing upstream to true")
if os_version == 'master':
branch = 'master'
else:
branch = "stable/{}".format(os_version)
- if upstream:
- logging.info("Deploying with upstream artifacts for OpenStack "
- "{}".format(os_version))
- args.image_dir = os.path.join(args.image_dir, os_version)
- upstream_url = constants.UPSTREAM_RDO.replace(
- constants.DEFAULT_OS_VERSION, os_version)
- upstream_targets = ['overcloud-full.tar', 'undercloud.qcow2']
- utils.fetch_upstream_and_unpack(args.image_dir, upstream_url,
- upstream_targets)
- sdn_image = os.path.join(args.image_dir, 'overcloud-full.qcow2')
- if ds_opts['sdn_controller'] == 'opendaylight':
- logging.info("Preparing upstream image with OpenDaylight")
- oc_builder.inject_opendaylight(
- odl_version=ds_opts['odl_version'],
- image=sdn_image,
- tmp_dir=APEX_TEMP_DIR
- )
- # copy undercloud so we don't taint upstream fetch
- uc_image = os.path.join(args.image_dir, 'undercloud_mod.qcow2')
- uc_fetch_img = os.path.join(args.image_dir, 'undercloud.qcow2')
- shutil.copyfile(uc_fetch_img, uc_image)
- # prep undercloud with required packages
- uc_builder.add_upstream_packages(uc_image)
- # add patches from upstream to undercloud and overcloud
- logging.info('Adding patches to undercloud')
- patches = deploy_settings['global_params']['patches']
- c_builder.add_upstream_patches(patches['undercloud'], uc_image,
- APEX_TEMP_DIR, branch)
- logging.info('Adding patches to overcloud')
- c_builder.add_upstream_patches(patches['overcloud'], sdn_image,
- APEX_TEMP_DIR, branch)
+
+ logging.info("Deploying with upstream artifacts for OpenStack "
+ "{}".format(os_version))
+ args.image_dir = os.path.join(args.image_dir, os_version)
+ upstream_url = constants.UPSTREAM_RDO.replace(
+ constants.DEFAULT_OS_VERSION, os_version)
+
+ upstream_targets = ['overcloud-full.tar', 'ironic-python-agent.tar']
+ if platform.machine() == 'aarch64':
+ upstream_targets.append('undercloud.qcow2')
+ utils.fetch_upstream_and_unpack(args.image_dir, upstream_url,
+ upstream_targets,
+ fetch=not args.no_fetch)
+ # Copy ironic files and overcloud ramdisk and kernel into temp dir
+ # to be copied by ansible into undercloud /home/stack
+ # Note the overcloud disk does not need to be copied here as it will
+ # be modified and copied later
+ for tmp_file in UC_DISK_FILES:
+ shutil.copyfile(os.path.join(args.image_dir, tmp_file),
+ os.path.join(APEX_TEMP_DIR, tmp_file))
+ if platform.machine() == 'aarch64':
+ sdn_image = os.path.join(args.image_dir, 'undercloud.qcow2')
else:
- sdn_image = os.path.join(args.image_dir, SDN_IMAGE)
- uc_image = 'undercloud.qcow2'
+ sdn_image = os.path.join(args.image_dir, 'overcloud-full.qcow2')
+ # copy undercloud so we don't taint upstream fetch
+ uc_image = os.path.join(args.image_dir, 'undercloud_mod.qcow2')
+ uc_fetch_img = sdn_image
+ shutil.copyfile(uc_fetch_img, uc_image)
+ # prep undercloud with required packages
+ if platform.machine() != 'aarch64':
+ uc_builder.update_repos(image=uc_image,
+ branch=branch.replace('stable/', ''))
+ uc_builder.add_upstream_packages(uc_image)
+ uc_builder.inject_calipso_installer(APEX_TEMP_DIR, uc_image)
+ # add patches from upstream to undercloud and overcloud
+ logging.info('Adding patches to undercloud')
+ patches = deployment.determine_patches()
+ c_builder.add_upstream_patches(patches['undercloud'], uc_image,
+ APEX_TEMP_DIR, branch)
+
+ # Create/Start Undercloud VM
undercloud = uc_lib.Undercloud(args.image_dir,
args.deploy_dir,
root_pw=root_pw,
external_network=uc_external,
- image_name=os.path.basename(uc_image))
+ image_name=os.path.basename(uc_image),
+ os_version=os_version)
undercloud.start()
+ undercloud_admin_ip = net_settings['networks'][
+ constants.ADMIN_NETWORK]['installer_vm']['ip']
+
+ if ds_opts['containers']:
+ tag = constants.DOCKER_TAG
+ else:
+ tag = None
# Generate nic templates
for role in 'compute', 'controller':
oc_cfg.create_nic_template(net_settings, deploy_settings, role,
args.deploy_dir, APEX_TEMP_DIR)
+ # Prepare/Upload docker images
+ docker_env = 'containers-prepare-parameter.yaml'
+ shutil.copyfile(os.path.join(args.deploy_dir, docker_env),
+ os.path.join(APEX_TEMP_DIR, docker_env))
+ # Upload extra ansible.cfg
+ if platform.machine() == 'aarch64':
+ ansible_env = 'ansible.cfg'
+ shutil.copyfile(os.path.join(args.deploy_dir, ansible_env),
+ os.path.join(APEX_TEMP_DIR, ansible_env))
+
+ c_builder.prepare_container_images(
+ os.path.join(APEX_TEMP_DIR, docker_env),
+ branch=branch.replace('stable/', ''),
+ neutron_driver=c_builder.get_neutron_driver(ds_opts)
+ )
# Install Undercloud
- undercloud.configure(net_settings,
- os.path.join(args.lib_dir, ANSIBLE_PATH,
+ undercloud.configure(net_settings, deploy_settings,
+ os.path.join(args.lib_dir, constants.ANSIBLE_PATH,
'configure_undercloud.yml'),
- APEX_TEMP_DIR)
+ APEX_TEMP_DIR, virtual_oc=args.virtual)
# Prepare overcloud-full.qcow2
logging.info("Preparing Overcloud for deployment...")
@@ -398,33 +479,75 @@ def main():
net_data_file)
else:
net_data = False
- if upstream and args.env_file == 'opnfv-environment.yaml':
+
+ shutil.copyfile(os.path.join(args.deploy_dir, 'build_ovs_nsh.sh'),
+ os.path.join(APEX_TEMP_DIR, 'build_ovs_nsh.sh'))
+
+ # TODO(trozet): Either fix opnfv env or default to use upstream env
+ if args.env_file == 'opnfv-environment.yaml':
# Override the env_file if it is defaulted to opnfv
# opnfv env file will not work with upstream
args.env_file = 'upstream-environment.yaml'
opnfv_env = os.path.join(args.deploy_dir, args.env_file)
- if not upstream:
- oc_deploy.prep_env(deploy_settings, net_settings, inventory,
- opnfv_env, net_env_target, APEX_TEMP_DIR)
- oc_deploy.prep_image(deploy_settings, sdn_image, APEX_TEMP_DIR,
- root_pw=root_pw)
+ oc_deploy.prep_env(deploy_settings, net_settings, inventory,
+ opnfv_env, net_env_target, APEX_TEMP_DIR)
+ if not args.virtual:
+ oc_deploy.LOOP_DEVICE_SIZE = "50G"
+ if platform.machine() == 'aarch64':
+ oc_image = os.path.join(args.image_dir, 'overcloud-full.qcow2')
else:
- shutil.copyfile(sdn_image, os.path.join(APEX_TEMP_DIR,
- 'overcloud-full.qcow2'))
- shutil.copyfile(
- opnfv_env,
- os.path.join(APEX_TEMP_DIR, os.path.basename(opnfv_env))
- )
+ oc_image = sdn_image
+ patched_containers = oc_deploy.prep_image(
+ deploy_settings, net_settings, oc_image, APEX_TEMP_DIR,
+ root_pw=root_pw, docker_tag=tag, patches=patches['overcloud'])
oc_deploy.create_deploy_cmd(deploy_settings, net_settings, inventory,
APEX_TEMP_DIR, args.virtual,
os.path.basename(opnfv_env),
net_data=net_data)
- deploy_playbook = os.path.join(args.lib_dir, ANSIBLE_PATH,
+ # Prepare undercloud with containers
+ docker_playbook = os.path.join(args.lib_dir, constants.ANSIBLE_PATH,
+ 'prepare_overcloud_containers.yml')
+ if ds_opts['containers']:
+ logging.info("Preparing Undercloud with Docker containers")
+ sdn_env = oc_deploy.get_docker_sdn_files(ds_opts)
+ sdn_env_files = str()
+ for sdn_file in sdn_env:
+ sdn_env_files += " -e {}".format(sdn_file)
+ if patched_containers:
+ oc_builder.archive_docker_patches(APEX_TEMP_DIR)
+ container_vars = dict()
+ container_vars['apex_temp_dir'] = APEX_TEMP_DIR
+ container_vars['patched_docker_services'] = list(
+ patched_containers)
+ container_vars['container_tag'] = constants.DOCKER_TAG
+ container_vars['stackrc'] = 'source /home/stack/stackrc'
+ container_vars['sdn'] = ds_opts['sdn_controller']
+ container_vars['undercloud_ip'] = undercloud_admin_ip
+ container_vars['os_version'] = os_version
+ container_vars['aarch64'] = platform.machine() == 'aarch64'
+ container_vars['sdn_env_file'] = sdn_env_files
+ container_vars['container_client'] = utils.find_container_client(
+ os_version)
+ try:
+ utils.run_ansible(container_vars, docker_playbook,
+ host=undercloud.ip, user='stack',
+ tmp_dir=APEX_TEMP_DIR)
+ logging.info("Container preparation complete")
+ except Exception:
+ logging.error("Unable to complete container prep on "
+ "Undercloud")
+ for tmp_file in UC_DISK_FILES:
+ os.remove(os.path.join(APEX_TEMP_DIR, tmp_file))
+ os.remove(os.path.join(APEX_TEMP_DIR, 'overcloud-full.qcow2'))
+ raise
+
+ deploy_playbook = os.path.join(args.lib_dir, constants.ANSIBLE_PATH,
'deploy_overcloud.yml')
virt_env = 'virtual-environment.yaml'
bm_env = 'baremetal-environment.yaml'
- for p_env in virt_env, bm_env:
+ k8s_env = 'kubernetes-environment.yaml'
+ for p_env in virt_env, bm_env, k8s_env:
shutil.copyfile(os.path.join(args.deploy_dir, p_env),
os.path.join(APEX_TEMP_DIR, p_env))
@@ -434,13 +557,22 @@ def main():
deploy_vars['virtual'] = args.virtual
deploy_vars['debug'] = args.debug
deploy_vars['aarch64'] = platform.machine() == 'aarch64'
+ deploy_vars['introspect'] = not (args.virtual or
+ deploy_vars['aarch64'] or
+ not introspect)
deploy_vars['dns_server_args'] = ''
deploy_vars['apex_temp_dir'] = APEX_TEMP_DIR
deploy_vars['apex_env_file'] = os.path.basename(opnfv_env)
deploy_vars['stackrc'] = 'source /home/stack/stackrc'
deploy_vars['overcloudrc'] = 'source /home/stack/overcloudrc'
- deploy_vars['upstream'] = upstream
+ deploy_vars['undercloud_ip'] = undercloud_admin_ip
+ deploy_vars['ha_enabled'] = ha_enabled
deploy_vars['os_version'] = os_version
+ deploy_vars['http_proxy'] = net_settings.get('http_proxy', '')
+ deploy_vars['https_proxy'] = net_settings.get('https_proxy', '')
+ deploy_vars['vim'] = ds_opts['vim']
+ deploy_vars['container_client'] = utils.find_container_client(
+ os_version)
for dns_server in net_settings['dns_servers']:
deploy_vars['dns_server_args'] += " --dns-nameserver {}".format(
dns_server)
@@ -449,10 +581,15 @@ def main():
user='stack', tmp_dir=APEX_TEMP_DIR)
logging.info("Overcloud deployment complete")
except Exception:
- logging.error("Deployment Failed. Please check log")
+ logging.error("Deployment Failed. Please check deploy log as "
+ "well as mistral logs in "
+ "{}".format(os.path.join(APEX_TEMP_DIR,
+ 'mistral_logs.tar.gz')))
raise
finally:
os.remove(os.path.join(APEX_TEMP_DIR, 'overcloud-full.qcow2'))
+ for tmp_file in UC_DISK_FILES:
+ os.remove(os.path.join(APEX_TEMP_DIR, tmp_file))
# Post install
logging.info("Executing post deploy configuration")
@@ -465,7 +602,7 @@ def main():
'UserKnownHostsFile=/dev/null -o ' \
'LogLevel=error'
deploy_vars['external_network_cmds'] = \
- oc_deploy.external_network_cmds(net_settings)
+ oc_deploy.external_network_cmds(net_settings, deploy_settings)
# TODO(trozet): just parse all ds_opts as deploy vars one time
deploy_vars['gluon'] = ds_opts['gluon']
deploy_vars['sdn'] = ds_opts['sdn_controller']
@@ -483,37 +620,129 @@ def main():
else:
deploy_vars['congress'] = False
deploy_vars['calipso'] = ds_opts.get('calipso', False)
- deploy_vars['calipso_ip'] = net_settings['networks']['admin'][
- 'installer_vm']['ip']
- # TODO(trozet): this is probably redundant with getting external
- # network info from undercloud.py
- if 'external' in net_settings.enabled_network_list:
- ext_cidr = net_settings['networks']['external'][0]['cidr']
- else:
- ext_cidr = net_settings['networks']['admin']['cidr']
- deploy_vars['external_cidr'] = str(ext_cidr)
- if ext_cidr.version == 6:
- deploy_vars['external_network_ipv6'] = True
+ deploy_vars['calipso_ip'] = undercloud_admin_ip
+ # overcloudrc.v3 removed and set as default in queens and later
+ if os_version == 'pike':
+ deploy_vars['overcloudrc_files'] = ['overcloudrc',
+ 'overcloudrc.v3']
else:
- deploy_vars['external_network_ipv6'] = False
- post_undercloud = os.path.join(args.lib_dir, ANSIBLE_PATH,
+ deploy_vars['overcloudrc_files'] = ['overcloudrc']
+
+ post_undercloud = os.path.join(args.lib_dir,
+ constants.ANSIBLE_PATH,
'post_deploy_undercloud.yml')
- logging.info("Executing post deploy configuration undercloud playbook")
+ logging.info("Executing post deploy configuration undercloud "
+ "playbook")
try:
- utils.run_ansible(deploy_vars, post_undercloud, host=undercloud.ip,
- user='stack', tmp_dir=APEX_TEMP_DIR)
+ utils.run_ansible(deploy_vars, post_undercloud,
+ host=undercloud.ip, user='stack',
+ tmp_dir=APEX_TEMP_DIR)
logging.info("Post Deploy Undercloud Configuration Complete")
except Exception:
logging.error("Post Deploy Undercloud Configuration failed. "
"Please check log")
raise
+
+ # Deploy kubernetes if enabled
+ # (TODO)zshi move handling of kubernetes deployment
+ # to its own deployment class
+ if deploy_vars['vim'] == 'k8s':
+ # clone kubespray repo
+ git.Repo.clone_from(constants.KUBESPRAY_URL,
+ os.path.join(APEX_TEMP_DIR, 'kubespray'))
+ shutil.copytree(
+ os.path.join(APEX_TEMP_DIR, 'kubespray', 'inventory',
+ 'sample'),
+ os.path.join(APEX_TEMP_DIR, 'kubespray', 'inventory',
+ 'apex'))
+ k8s_node_inventory = {
+ 'all':
+ {'hosts': {},
+ 'children': {
+ 'k8s-cluster': {
+ 'children': {
+ 'kube-master': {
+ 'hosts': {}
+ },
+ 'kube-node': {
+ 'hosts': {}
+ }
+ }
+ },
+ 'etcd': {
+ 'hosts': {}
+ }
+ }
+ }
+ }
+ for node, ip in deploy_vars['overcloud_nodes'].items():
+ k8s_node_inventory['all']['hosts'][node] = {
+ 'ansible_become': True,
+ 'ansible_ssh_host': ip,
+ 'ansible_become_user': 'root',
+ 'ip': ip
+ }
+ if 'controller' in node:
+ k8s_node_inventory['all']['children']['k8s-cluster'][
+ 'children']['kube-master']['hosts'][node] = None
+ k8s_node_inventory['all']['children']['etcd'][
+ 'hosts'][node] = None
+ elif 'compute' in node:
+ k8s_node_inventory['all']['children']['k8s-cluster'][
+ 'children']['kube-node']['hosts'][node] = None
+
+ kubespray_dir = os.path.join(APEX_TEMP_DIR, 'kubespray')
+ with open(os.path.join(kubespray_dir, 'inventory', 'apex',
+ 'apex.yaml'), 'w') as invfile:
+ yaml.dump(k8s_node_inventory, invfile,
+ default_flow_style=False)
+ k8s_deploy_vars = {}
+ # Add kubespray ansible control variables in k8s_deploy_vars,
+ # example: 'kube_network_plugin': 'flannel'
+ k8s_deploy = os.path.join(kubespray_dir, 'cluster.yml')
+ k8s_deploy_inv_file = os.path.join(kubespray_dir, 'inventory',
+ 'apex', 'apex.yaml')
+
+ k8s_remove_pkgs = os.path.join(args.lib_dir,
+ constants.ANSIBLE_PATH,
+ 'k8s_remove_pkgs.yml')
+ try:
+ logging.debug("Removing any existing overcloud docker "
+ "packages")
+ utils.run_ansible(k8s_deploy_vars, k8s_remove_pkgs,
+ host=k8s_deploy_inv_file,
+ user='heat-admin', tmp_dir=APEX_TEMP_DIR)
+ logging.info("k8s Deploy Remove Existing Docker Related "
+ "Packages Complete")
+ except Exception:
+ logging.error("k8s Deploy Remove Existing Docker Related "
+ "Packages failed. Please check log")
+ raise
+
+ try:
+ utils.run_ansible(k8s_deploy_vars, k8s_deploy,
+ host=k8s_deploy_inv_file,
+ user='heat-admin', tmp_dir=APEX_TEMP_DIR)
+ logging.info("k8s Deploy Overcloud Configuration Complete")
+ except Exception:
+ logging.error("k8s Deploy Overcloud Configuration failed."
+ "Please check log")
+ raise
+
# Post deploy overcloud node configuration
# TODO(trozet): just parse all ds_opts as deploy vars one time
deploy_vars['sfc'] = ds_opts['sfc']
deploy_vars['vpn'] = ds_opts['vpn']
+ deploy_vars['l2gw'] = ds_opts.get('l2gw')
+ deploy_vars['sriov'] = ds_opts.get('sriov')
+ deploy_vars['tacker'] = ds_opts.get('tacker')
+ deploy_vars['all_in_one'] = all_in_one
+ # TODO(trozet): need to set container client to docker until OOO
+ # migrates OC to podman. Remove this later.
+ deploy_vars['container_client'] = 'docker'
# TODO(trozet): pull all logs and store in tmp dir in overcloud
# playbook
- post_overcloud = os.path.join(args.lib_dir, ANSIBLE_PATH,
+ post_overcloud = os.path.join(args.lib_dir, constants.ANSIBLE_PATH,
'post_deploy_overcloud.yml')
# Run per overcloud node
for node, ip in deploy_vars['overcloud_nodes'].items():
diff --git a/apex/deployment/__init__.py b/apex/deployment/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/apex/deployment/__init__.py
diff --git a/apex/deployment/snapshot.py b/apex/deployment/snapshot.py
new file mode 100644
index 0000000..b33907f
--- /dev/null
+++ b/apex/deployment/snapshot.py
@@ -0,0 +1,241 @@
+##############################################################################
+# Copyright (c) 2018 Tim Rozet (trozet@redhat.com) and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+import fnmatch
+import logging
+import os
+import pprint
+import socket
+import time
+
+import libvirt
+
+import apex.common.constants as con
+from apex.common import exceptions as exc
+from apex.common import utils
+from apex.overcloud.node import OvercloudNode
+import apex.settings.deploy_settings as ds
+
+
+SNAP_FILE = 'snapshot.properties'
+CHECKSUM = 'OPNFV_SNAP_SHA512SUM'
+OVERCLOUD_RC = 'overcloudrc'
+SSH_KEY = 'id_rsa'
+OPENSTACK = 'openstack'
+OPENDAYLIGHT = 'opendaylight'
+SERVICES = (OPENSTACK, OPENDAYLIGHT)
+
+
+class SnapshotDeployment:
+ def __init__(self, deploy_settings, snap_cache_dir, fetch=True,
+ all_in_one=False):
+ self.id_rsa = None
+ self.fetch = fetch
+ ds_opts = deploy_settings['deploy_options']
+ self.os_version = ds_opts['os_version']
+ self.ha_enabled = deploy_settings['global_params']['ha_enabled']
+ if self.ha_enabled:
+ self.ha_ext = 'ha'
+ elif all_in_one:
+ self.ha_ext = 'noha-allinone'
+ else:
+ self.ha_ext = 'noha'
+ self.snap_cache_dir = os.path.join(snap_cache_dir,
+ "{}/{}".format(self.os_version,
+ self.ha_ext))
+ self.networks = []
+ self.oc_nodes = []
+ self.properties_url = "{}/apex/{}/{}".format(con.OPNFV_ARTIFACTS,
+ self.os_version,
+ self.ha_ext)
+ self.conn = libvirt.open('qemu:///system')
+ if not self.conn:
+ raise exc.SnapshotDeployException(
+ 'Unable to open libvirt connection')
+ if self.fetch:
+ self.pull_snapshot(self.properties_url, self.snap_cache_dir)
+ else:
+ logging.info('No fetch enabled. Will not attempt to pull latest '
+ 'snapshot')
+ self.deploy_snapshot()
+
+ @staticmethod
+ def pull_snapshot(url_path, snap_cache_dir):
+ """
+ Compare opnfv properties file and download and unpack snapshot if
+ necessary
+ :param url_path: path of latest snap info
+ :param snap_cache_dir: local directory for snap cache
+ :return: None
+ """
+ full_url = os.path.join(url_path, SNAP_FILE)
+ upstream_props = utils.fetch_properties(full_url)
+ logging.debug("Upstream properties are: {}".format(upstream_props))
+ try:
+ upstream_sha = upstream_props[CHECKSUM]
+ except KeyError:
+ logging.error('Unable to find {} for upstream properties: '
+ '{}'.format(CHECKSUM, upstream_props))
+ raise exc.SnapshotDeployException('Unable to find upstream '
+ 'properties checksum value')
+ local_prop_file = os.path.join(snap_cache_dir, SNAP_FILE)
+ try:
+ local_props = utils.fetch_properties(local_prop_file)
+ local_sha = local_props[CHECKSUM]
+ pull_snap = local_sha != upstream_sha
+ except (exc.FetchException, KeyError):
+ logging.info("No locally cached properties found, will pull "
+ "latest")
+ local_sha = None
+ pull_snap = True
+ logging.debug('Local sha: {}, Upstream sha: {}'.format(local_sha,
+ upstream_sha))
+ if pull_snap:
+ logging.info('SHA mismatch, will download latest snapshot')
+ full_snap_url = upstream_props['OPNFV_SNAP_URL']
+ snap_file = os.path.basename(full_snap_url)
+ snap_url = full_snap_url.replace(snap_file, '')
+ if not snap_url.startswith('http://'):
+ snap_url = 'http://' + snap_url
+ utils.fetch_upstream_and_unpack(dest=snap_cache_dir,
+ url=snap_url,
+ targets=[SNAP_FILE, snap_file]
+ )
+ else:
+ logging.info('SHA match, artifacts in cache are already latest. '
+ 'Will not download.')
+
+ def create_networks(self):
+ logging.info("Detecting snapshot networks")
+ try:
+ xmls = fnmatch.filter(os.listdir(self.snap_cache_dir), '*.xml')
+ except FileNotFoundError:
+ raise exc.SnapshotDeployException(
+ 'No XML files found in snap cache directory: {}'.format(
+ self.snap_cache_dir))
+ net_xmls = list()
+ for xml in xmls:
+ if xml.startswith('baremetal'):
+ continue
+ net_xmls.append(os.path.join(self.snap_cache_dir, xml))
+ if not net_xmls:
+ raise exc.SnapshotDeployException(
+ 'No network XML files detected in snap cache, '
+ 'please check local snap cache contents')
+ logging.info('Snapshot networks found: {}'.format(net_xmls))
+ for xml in net_xmls:
+ logging.debug('Creating network from {}'.format(xml))
+ with open(xml, 'r') as fh:
+ net_xml = fh.read()
+ net = self.conn.networkCreateXML(net_xml)
+ self.networks.append(net)
+ logging.info('Network started: {}'.format(net.name()))
+
+ def parse_and_create_nodes(self):
+ """
+ Parse snapshot node.yaml config file and create overcloud nodes
+ :return: None
+ """
+ node_file = os.path.join(self.snap_cache_dir, 'node.yaml')
+ if not os.path.isfile(node_file):
+ raise exc.SnapshotDeployException('Missing node definitions from '
+ ''.format(node_file))
+ node_data = utils.parse_yaml(node_file)
+ if 'servers' not in node_data:
+ raise exc.SnapshotDeployException('Invalid node.yaml format')
+ for node, data in node_data['servers'].items():
+ logging.info('Creating node: {}'.format(node))
+ logging.debug('Node data is:\n{}'.format(pprint.pformat(data)))
+ node_xml = os.path.join(self.snap_cache_dir,
+ '{}.xml'.format(data['vNode-name']))
+ node_qcow = os.path.join(self.snap_cache_dir,
+ '{}.qcow2'.format(data['vNode-name']))
+ self.oc_nodes.append(
+ OvercloudNode(ip=data['address'],
+ ovs_ctrlrs=data['ovs-controller'],
+ ovs_mgrs=data['ovs-managers'],
+ role=data['type'],
+ name=node,
+ node_xml=node_xml,
+ disk_img=node_qcow)
+ )
+ logging.info('Node Created')
+ logging.info('Starting nodes')
+ for node in self.oc_nodes:
+ node.start()
+
+ def get_controllers(self):
+ controllers = []
+ for node in self.oc_nodes:
+ if node.role == 'controller':
+ controllers.append(node)
+ return controllers
+
+ def is_service_up(self, service):
+ assert service in SERVICES
+ if service == OPENSTACK:
+ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ sock.settimeout(5)
+ controllers = self.get_controllers()
+ if not controllers:
+ raise exc.SnapshotDeployException('No OpenStack controllers found')
+
+ for node in controllers:
+ logging.info('Waiting until {} is up on controller: '
+ '{}'.format(service, node.name))
+ for x in range(10):
+ logging.debug('Checking {} is up attempt {}'.format(service,
+ str(x + 1)))
+ if service == OPENSTACK:
+ # Check if Neutron is up
+ if sock.connect_ex((node.ip, 9696)) == 0:
+ logging.info('{} is up on controller {}'.format(
+ service, node.name))
+ break
+ elif service == OPENDAYLIGHT:
+ url = 'http://{}:8081/diagstatus'.format(node.ip)
+ try:
+ utils.open_webpage(url)
+ logging.info('{} is up on controller {}'.format(
+ service, node.name))
+ break
+ except Exception as e:
+ logging.debug('Cannot contact ODL. Reason: '
+ '{}'.format(e))
+ time.sleep(60)
+ else:
+ logging.error('{} is not running after 10 attempts'.format(
+ service))
+ return False
+ return True
+
+ def deploy_snapshot(self):
+ # bring up networks
+ self.create_networks()
+ # check overcloudrc exists, id_rsa
+ for snap_file in (OVERCLOUD_RC, SSH_KEY):
+ if not os.path.isfile(os.path.join(self.snap_cache_dir,
+ snap_file)):
+ logging.warning('File is missing form snap cache: '
+ '{}'.format(snap_file))
+ # create nodes
+ self.parse_and_create_nodes()
+ # validate deployment
+ if self.is_service_up(OPENSTACK):
+ logging.info('OpenStack is up')
+ else:
+ raise exc.SnapshotDeployException('OpenStack is not alive')
+ if self.is_service_up(OPENDAYLIGHT):
+ logging.info('OpenDaylight is up')
+ else:
+ raise exc.SnapshotDeployException(
+ 'OpenDaylight {} is not reporting diag status')
+ # TODO(trozet): recreate external network/subnet if missing
+ logging.info('Snapshot deployment complete. Please use the {} file '
+ 'in {} to interact with '
+ 'OpenStack'.format(OVERCLOUD_RC, self.snap_cache_dir))
diff --git a/apex/deployment/tripleo.py b/apex/deployment/tripleo.py
new file mode 100644
index 0000000..c131e16
--- /dev/null
+++ b/apex/deployment/tripleo.py
@@ -0,0 +1,60 @@
+##############################################################################
+# Copyright (c) 2018 Tim Rozet (trozet@redhat.com) and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+# TODO(trozet): this will serve as the deployment class as we migrate logic out
+# of deploy.py
+import logging
+import os
+import pprint
+
+from apex.common.exceptions import ApexDeployException
+from apex.common import utils
+
+
+class ApexDeployment:
+ def __init__(self, deploy_settings, patch_file, ds_file):
+ self.ds = deploy_settings
+ # TODO(trozet): remove ds_file from args and have this class inherit
+ # super deployment class init which does all the settings
+ self.ds_file = ds_file
+ self.ds_globals = self.ds['global_params']
+ self.p_file = patch_file
+
+ def determine_patches(self):
+ patches = self.ds_globals['patches']
+ if not os.path.isfile(self.p_file):
+ new_file = os.path.join(os.path.dirname(self.ds_file),
+ 'common-patches.yaml')
+ if os.path.isfile(new_file):
+ logging.warning('Patch file {} not found, falling back to '
+ '{}'.format(self.p_file, new_file))
+ self.p_file = new_file
+ else:
+ logging.error('Unable to find common patch file: '
+ '{}'.format(self.p_file))
+ raise ApexDeployException(
+ 'Specified common patch file not found: {}'.format(
+ self.p_file))
+ logging.info('Loading patches from common patch file {}'.format(
+ self.p_file))
+ common_patches = utils.parse_yaml(self.p_file)
+ logging.debug('Content from common patch file is: {}'.format(
+ pprint.pformat(common_patches)))
+ os_version = self.ds['deploy_options']['os_version']
+ try:
+ common_patches = common_patches['patches'][os_version]
+ except KeyError:
+ logging.error('Error parsing common patches file, wrong format.')
+ raise ApexDeployException('Invalid format of common patch file')
+
+ for ptype in ('undercloud', 'overcloud'):
+ if ptype in common_patches:
+ patches[ptype] = utils.unique(patches[ptype] +
+ common_patches[ptype])
+ return patches
diff --git a/apex/inventory/inventory.py b/apex/inventory/inventory.py
index b5ffd2f..0546fe9 100644
--- a/apex/inventory/inventory.py
+++ b/apex/inventory/inventory.py
@@ -67,9 +67,12 @@ class Inventory(dict):
if ha and len(self['nodes']) < 5:
raise ApexInventoryException('You must provide at least 5 '
'nodes for HA deployment')
- elif len(self['nodes']) < 2:
- raise ApexInventoryException('You must provide at least 2 nodes '
+ elif len(self['nodes']) < 1:
+ raise ApexInventoryException('You must provide at least 1 node '
'for non-HA deployment')
+ elif list(self.get_node_counts())[0] < 1:
+ raise ApexInventoryException('You must provide at least 1 '
+ 'control node for deployment')
if virtual:
self['host-ip'] = '192.168.122.1'
diff --git a/apex/network/jumphost.py b/apex/network/jumphost.py
index c28c105..8655665 100644
--- a/apex/network/jumphost.py
+++ b/apex/network/jumphost.py
@@ -53,12 +53,8 @@ def configure_bridges(ns):
if cidr.version == 6:
ipv6_br_path = "/proc/sys/net/ipv6/conf/{}/disable_" \
"ipv6".format(NET_MAP[network])
- try:
- subprocess.check_call('echo', 0, '>', ipv6_br_path)
- except subprocess.CalledProcessError:
- logging.error("Unable to enable ipv6 on "
- "bridge {}".format(NET_MAP[network]))
- raise
+ with open(ipv6_br_path, 'w') as f:
+ print(0, file=f)
try:
ip_prefix = "{}/{}".format(ovs_ip, cidr.prefixlen)
subprocess.check_call(['ip', 'addr', 'add', ip_prefix, 'dev',
diff --git a/apex/network/network_data.py b/apex/network/network_data.py
index 1177af0..6f330c5 100644
--- a/apex/network/network_data.py
+++ b/apex/network/network_data.py
@@ -83,7 +83,7 @@ def create_network_data(ns, target=None):
"{}".format(net))
raise NetworkDataException("cidr is null for network {}".format(
net))
-
+ tmp_net['mtu'] = network.get('mtu', 1500)
network_data.append(copy.deepcopy(tmp_net))
# have to do this due to the aforementioned bug
diff --git a/apex/network/network_environment.py b/apex/network/network_environment.py
index ea71e0f..52b4452 100644
--- a/apex/network/network_environment.py
+++ b/apex/network/network_environment.py
@@ -82,7 +82,7 @@ class NetworkEnvironment(dict):
admin_prefix = str(admin_cidr.prefixlen)
self[param_def]['ControlPlaneSubnetCidr'] = admin_prefix
self[param_def]['ControlPlaneDefaultRoute'] = \
- nets[ADMIN_NETWORK]['installer_vm']['ip']
+ nets[ADMIN_NETWORK]['gateway']
self[param_def]['EC2MetadataIp'] = \
nets[ADMIN_NETWORK]['installer_vm']['ip']
self[param_def]['DnsServers'] = net_settings['dns_servers']
@@ -186,6 +186,8 @@ class NetworkEnvironment(dict):
for flag in IPV6_FLAGS:
self[param_def][flag] = True
+ self._update_service_netmap(net_settings.enabled_network_list)
+
def _get_vlan(self, network):
if isinstance(network['nic_mapping'][CONTROLLER]['vlan'], int):
return network['nic_mapping'][CONTROLLER]['vlan']
@@ -218,6 +220,13 @@ class NetworkEnvironment(dict):
prefix = ''
self[reg][key] = self.tht_dir + prefix + postfix
+ def _update_service_netmap(self, network_list):
+ if 'ServiceNetMap' not in self[param_def]:
+ return
+ for service, network in self[param_def]['ServiceNetMap'].items():
+ if network not in network_list:
+ self[param_def]['ServiceNetMap'][service] = 'ctlplane'
+
class NetworkEnvException(Exception):
def __init__(self, value):
diff --git a/apex/overcloud/config.py b/apex/overcloud/config.py
index a7f7d84..e8d8fbb 100644
--- a/apex/overcloud/config.py
+++ b/apex/overcloud/config.py
@@ -52,6 +52,9 @@ def create_nic_template(network_settings, deploy_settings, role, template_dir,
if ds.get('dvr') is True:
nets['admin']['nic_mapping'][role]['phys_type'] = \
'linux_bridge'
+ else:
+ nets['external'][0]['nic_mapping'][role]['phys_type'] = \
+ 'linux_bridge'
elif ds['dataplane'] == 'ovs_dpdk':
ovs_dpdk_br = 'br-phy'
if (ds.get('performance', {}).get(role.title(), {}).get('vpp', {})
@@ -66,9 +69,6 @@ def create_nic_template(network_settings, deploy_settings, role, template_dir,
nets['tenant']['nic_mapping'][role]['interface-options'] =\
ds['performance'][role.title()]['vpp']['interface-options']
- if role == 'controller' and ds.get('sfc', None):
- ext_net = 'interface'
-
template_output = template.render(
nets=nets,
role=role,
diff --git a/apex/overcloud/deploy.py b/apex/overcloud/deploy.py
index 809afc1..538f50a 100644
--- a/apex/overcloud/deploy.py
+++ b/apex/overcloud/deploy.py
@@ -11,14 +11,20 @@ import base64
import fileinput
import logging
import os
+import platform
+import pprint
import shutil
import uuid
import struct
import time
+import yaml
+import apex.builders.overcloud_builder as oc_builder
+import apex.builders.common_builder as c_builder
from apex.common import constants as con
from apex.common.exceptions import ApexDeployException
from apex.common import parsers
+from apex.common import utils
from apex.virtual import utils as virt_utils
from cryptography.hazmat.primitives import serialization as \
crypto_serialization
@@ -37,6 +43,8 @@ SDN_FILE_MAP = {
'dvr': 'neutron-opendaylight-fdio-dvr.yaml',
'default': 'neutron-opendaylight-honeycomb.yaml'
},
+ 'l2gw': 'neutron-l2gw-opendaylight.yaml',
+ 'sriov': 'neutron-opendaylight-sriov.yaml',
'default': 'neutron-opendaylight.yaml',
},
'onos': {
@@ -64,24 +72,75 @@ OVS_PERF_MAP = {
'NeutronDpdkMemoryChannels': 'memory_channels'
}
-OVS_NSH_KMOD_RPM = "openvswitch-kmod-2.6.1-1.el7.centos.x86_64.rpm"
-OVS_NSH_RPM = "openvswitch-2.6.1-1.el7.centos.x86_64.rpm"
ODL_NETVIRT_VPP_RPM = "/root/opendaylight-7.0.0-0.1.20170531snap665.el7" \
".noarch.rpm"
+LOOP_DEVICE_SIZE = "10G"
+
+LOSETUP_SERVICE = """[Unit]
+Description=Setup loop devices
+Before=network.target
+
+[Service]
+Type=oneshot
+ExecStart=/sbin/losetup /dev/loop3 /srv/data.img
+ExecStop=/sbin/losetup -d /dev/loop3
+TimeoutSec=60
+RemainAfterExit=yes
+
+[Install]
+WantedBy=multi-user.target
+"""
+
+DUPLICATE_COMPUTE_SERVICES = [
+ 'OS::TripleO::Services::ComputeNeutronCorePlugin',
+ 'OS::TripleO::Services::ComputeNeutronMetadataAgent',
+ 'OS::TripleO::Services::ComputeNeutronOvsAgent',
+ 'OS::TripleO::Services::ComputeNeutronL3Agent'
+]
+
+NFS_VARS = [
+ 'NovaNfsEnabled',
+ 'GlanceNfsEnabled',
+ 'CinderNfsEnabledBackend'
+]
+
def build_sdn_env_list(ds, sdn_map, env_list=None):
+ """
+ Builds a list of SDN environment files to be used in the deploy cmd.
+
+ This function recursively searches an sdn_map. First the sdn controller is
+ matched and then the function looks for enabled features for that
+ controller to determine which environment files should be used. By
+ default the feature will be checked if set to true in deploy settings to be
+ added to the list. If a feature does not have a boolean value, then the
+ key and value pair to compare with are checked as a tuple (k,v).
+
+ :param ds: deploy settings
+ :param sdn_map: SDN map to recursively search
+ :param env_list: recursive var to hold previously found env_list
+ :return: A list of env files
+ """
if env_list is None:
env_list = list()
for k, v in sdn_map.items():
- if ds['sdn_controller'] == k or (k in ds and ds[k] is True):
+ if ds['sdn_controller'] == k or (k in ds and ds[k]):
if isinstance(v, dict):
+ # Append default SDN env file first
+ # The assumption is that feature-enabled SDN env files
+ # override and do not conflict with previously set default
+ # settings
+ if ds['sdn_controller'] == k and 'default' in v:
+ env_list.append(os.path.join(con.THT_ENV_DIR,
+ v['default']))
env_list.extend(build_sdn_env_list(ds, v))
+ # check if the value is not a boolean
+ elif isinstance(v, tuple):
+ if ds[k] == v[0]:
+ env_list.append(os.path.join(con.THT_ENV_DIR, v[1]))
else:
env_list.append(os.path.join(con.THT_ENV_DIR, v))
- elif isinstance(v, tuple):
- if ds[k] == v[0]:
- env_list.append(os.path.join(con.THT_ENV_DIR, v[1]))
if len(env_list) == 0:
try:
env_list.append(os.path.join(
@@ -92,6 +151,26 @@ def build_sdn_env_list(ds, sdn_map, env_list=None):
return env_list
+def get_docker_sdn_files(ds_opts):
+ """
+ Returns docker env file for detected SDN
+ :param ds_opts: deploy options
+ :return: list of docker THT env files for an SDN
+ """
+ docker_services = con.VALID_DOCKER_SERVICES
+ tht_dir = con.THT_DOCKER_ENV_DIR
+ sdn_env_list = build_sdn_env_list(ds_opts, SDN_FILE_MAP)
+ for i, sdn_file in enumerate(sdn_env_list):
+ sdn_base = os.path.basename(sdn_file)
+ if sdn_base in docker_services:
+ if docker_services[sdn_base] is not None:
+ sdn_env_list[i] = \
+ os.path.join(tht_dir, docker_services[sdn_base])
+ else:
+ sdn_env_list[i] = os.path.join(tht_dir, sdn_base)
+ return sdn_env_list
+
+
def create_deploy_cmd(ds, ns, inv, tmp_dir,
virtual, env_file='opnfv-environment.yaml',
net_data=False):
@@ -99,22 +178,52 @@ def create_deploy_cmd(ds, ns, inv, tmp_dir,
logging.info("Creating deployment command")
deploy_options = ['network-environment.yaml']
+ ds_opts = ds['deploy_options']
+
+ if ds_opts['containers']:
+ deploy_options.append(os.path.join(con.THT_ENV_DIR,
+ 'docker.yaml'))
+
+ if ds['global_params']['ha_enabled']:
+ if ds_opts['containers']:
+ deploy_options.append(os.path.join(con.THT_ENV_DIR,
+ 'docker-ha.yaml'))
+ else:
+ deploy_options.append(os.path.join(con.THT_ENV_DIR,
+ 'puppet-pacemaker.yaml'))
+
if env_file:
deploy_options.append(env_file)
- ds_opts = ds['deploy_options']
- deploy_options += build_sdn_env_list(ds_opts, SDN_FILE_MAP)
+
+ if ds_opts['containers']:
+ deploy_options.append('docker-images.yaml')
+ sdn_docker_files = get_docker_sdn_files(ds_opts)
+ for sdn_docker_file in sdn_docker_files:
+ deploy_options.append(sdn_docker_file)
+ else:
+ deploy_options += build_sdn_env_list(ds_opts, SDN_FILE_MAP)
for k, v in OTHER_FILE_MAP.items():
if k in ds_opts and ds_opts[k]:
- deploy_options.append(os.path.join(con.THT_ENV_DIR, v))
+ if ds_opts['containers']:
+ deploy_options.append(os.path.join(con.THT_DOCKER_ENV_DIR,
+ "{}.yaml".format(k)))
+ else:
+ deploy_options.append(os.path.join(con.THT_ENV_DIR, v))
- if ds_opts['ceph']:
- prep_storage_env(ds, tmp_dir)
+ # TODO(trozet) Fix this check to look for if ceph is in controller services
+ # and not use name of the file
+ if ds_opts['ceph'] and 'csit' not in env_file:
+ prep_storage_env(ds, ns, virtual, tmp_dir)
deploy_options.append(os.path.join(con.THT_ENV_DIR,
'storage-environment.yaml'))
- if ds['global_params']['ha_enabled']:
- deploy_options.append(os.path.join(con.THT_ENV_DIR,
- 'puppet-pacemaker.yaml'))
+ if ds_opts['sriov']:
+ prep_sriov_env(ds, tmp_dir)
+
+ # Check for 'k8s' here intentionally, as we may support other values
+ # such as openstack/openshift for 'vim' option.
+ if ds_opts['vim'] == 'k8s':
+ deploy_options.append('kubernetes-environment.yaml')
if virtual:
deploy_options.append('virtual-environment.yaml')
@@ -122,12 +231,16 @@ def create_deploy_cmd(ds, ns, inv, tmp_dir,
deploy_options.append('baremetal-environment.yaml')
num_control, num_compute = inv.get_node_counts()
- if num_control == 0 or num_compute == 0:
- logging.error("Detected 0 control or compute nodes. Control nodes: "
- "{}, compute nodes{}".format(num_control, num_compute))
- raise ApexDeployException("Invalid number of control or computes")
- elif num_control > 1 and not ds['global_params']['ha_enabled']:
+ if num_control > 1 and not ds['global_params']['ha_enabled']:
num_control = 1
+ if platform.machine() == 'aarch64':
+ # aarch64 deploys were not completing in the default 90 mins.
+ # Not sure if this is related to the hardware the OOO support
+ # was developed on or the virtualization support in CentOS
+ # Either way it will probably get better over time as the aarch
+ # support matures in CentOS and deploy time should be tested in
+ # the future so this multiplier can be removed.
+ con.DEPLOY_TIMEOUT *= 2
cmd = "openstack overcloud deploy --templates --timeout {} " \
.format(con.DEPLOY_TIMEOUT)
# build cmd env args
@@ -140,12 +253,16 @@ def create_deploy_cmd(ds, ns, inv, tmp_dir,
if net_data:
cmd += ' --networks-file network_data.yaml'
libvirt_type = 'kvm'
- if virtual:
+ if virtual and (platform.machine() != 'aarch64'):
with open('/sys/module/kvm_intel/parameters/nested') as f:
nested_kvm = f.read().strip()
if nested_kvm != 'Y':
libvirt_type = 'qemu'
+ elif virtual and (platform.machine() == 'aarch64'):
+ libvirt_type = 'qemu'
cmd += ' --libvirt-type {}'.format(libvirt_type)
+ if platform.machine() == 'aarch64':
+ cmd += ' --override-ansible-cfg /home/stack/ansible.cfg '
logging.info("Deploy command set: {}".format(cmd))
with open(os.path.join(tmp_dir, 'deploy_command'), 'w') as fh:
@@ -153,13 +270,17 @@ def create_deploy_cmd(ds, ns, inv, tmp_dir,
return cmd
-def prep_image(ds, img, tmp_dir, root_pw=None):
+def prep_image(ds, ns, img, tmp_dir, root_pw=None, docker_tag=None,
+ patches=None):
"""
Locates sdn image and preps for deployment.
:param ds: deploy settings
+ :param ns: network settings
:param img: sdn image
:param tmp_dir: dir to store modified sdn image
:param root_pw: password to configure for overcloud image
+ :param docker_tag: Docker image tag for RDO version (default None)
+ :param patches: List of patches to apply to overcloud image
:return: None
"""
# TODO(trozet): Come up with a better way to organize this logic in this
@@ -172,6 +293,7 @@ def prep_image(ds, img, tmp_dir, root_pw=None):
ds_opts = ds['deploy_options']
virt_cmds = list()
sdn = ds_opts['sdn_controller']
+ patched_containers = set()
# we need this due to rhbz #1436021
# fixed in systemd-219-37.el7
if sdn is not False:
@@ -186,7 +308,25 @@ def prep_image(ds, img, tmp_dir, root_pw=None):
".service"
}])
+ if ns.get('http_proxy', ''):
+ virt_cmds.append({
+ con.VIRT_RUN_CMD:
+ "echo 'http_proxy={}' >> /etc/environment".format(
+ ns['http_proxy'])})
+
+ if ns.get('https_proxy', ''):
+ virt_cmds.append({
+ con.VIRT_RUN_CMD:
+ "echo 'https_proxy={}' >> /etc/environment".format(
+ ns['https_proxy'])})
+
+ tmp_oc_image = os.path.join(tmp_dir, 'overcloud-full.qcow2')
+ shutil.copyfile(img, tmp_oc_image)
+ logging.debug("Temporary overcloud image stored as: {}".format(
+ tmp_oc_image))
+
if ds_opts['vpn']:
+ oc_builder.inject_quagga(tmp_oc_image, tmp_dir)
virt_cmds.append({con.VIRT_RUN_CMD: "chmod +x /etc/rc.d/rc.local"})
virt_cmds.append({
con.VIRT_RUN_CMD:
@@ -226,15 +366,14 @@ def prep_image(ds, img, tmp_dir, root_pw=None):
if root_pw:
pw_op = "password:{}".format(root_pw)
virt_cmds.append({con.VIRT_PW: pw_op})
- if ds_opts['sfc'] and dataplane == 'ovs':
- virt_cmds.extend([
- {con.VIRT_RUN_CMD: "yum -y install "
- "/root/ovs/rpm/rpmbuild/RPMS/x86_64/"
- "{}".format(OVS_NSH_KMOD_RPM)},
- {con.VIRT_RUN_CMD: "yum downgrade -y "
- "/root/ovs/rpm/rpmbuild/RPMS/x86_64/"
- "{}".format(OVS_NSH_RPM)}
- ])
+
+ # FIXME(trozet) ovs build is failing in CentOS 7.6
+ # if dataplane == 'ovs':
+ # FIXME(trozet) remove this after RDO is updated with fix for
+ # https://bugzilla.redhat.com/show_bug.cgi?id=1544892
+ # https://review.rdoproject.org/r/#/c/13839/
+ # oc_builder.inject_ovs_nsh(tmp_oc_image, tmp_dir)
+
if dataplane == 'fdio':
# Patch neutron with using OVS external interface for router
# and add generic linux NS interface driver
@@ -248,48 +387,77 @@ def prep_image(ds, img, tmp_dir, root_pw=None):
"/root/nosdn_vpp_rpms/*.rpm"}
])
+ undercloud_admin_ip = ns['networks'][con.ADMIN_NETWORK][
+ 'installer_vm']['ip']
if sdn == 'opendaylight':
- if ds_opts['odl_version'] != con.DEFAULT_ODL_VERSION:
- virt_cmds.extend([
- {con.VIRT_RUN_CMD: "yum -y remove opendaylight"},
- {con.VIRT_RUN_CMD: "rm -rf /etc/puppet/modules/opendaylight"},
- {con.VIRT_RUN_CMD: "cd /etc/puppet/modules && tar xzf "
- "/root/puppet-opendaylight-"
- "{}.tar.gz".format(ds_opts['odl_version'])}
- ])
- if ds_opts['odl_version'] == 'master':
- virt_cmds.extend([
- {con.VIRT_RUN_CMD: "rpm -ivh --nodeps /root/{}/*".format(
- ds_opts['odl_version'])}
- ])
- else:
- virt_cmds.extend([
- {con.VIRT_RUN_CMD: "yum -y install /root/{}/*".format(
- ds_opts['odl_version'])}
- ])
-
- elif sdn == 'opendaylight' and 'odl_vpp_netvirt' in ds_opts \
- and ds_opts['odl_vpp_netvirt']:
- virt_cmds.extend([
- {con.VIRT_RUN_CMD: "yum -y remove opendaylight"},
- {con.VIRT_RUN_CMD: "yum -y install /root/{}/*".format(
- ODL_NETVIRT_VPP_RPM)}
- ])
-
- if sdn == 'ovn':
+ oc_builder.inject_opendaylight(
+ odl_version=ds_opts['odl_version'],
+ image=tmp_oc_image,
+ tmp_dir=tmp_dir,
+ uc_ip=undercloud_admin_ip,
+ os_version=ds_opts['os_version'],
+ docker_tag=docker_tag,
+ )
+ if docker_tag:
+ patched_containers = patched_containers.union({'opendaylight'})
+
+ if patches:
+ if ds_opts['os_version'] == 'master':
+ branch = ds_opts['os_version']
+ else:
+ branch = "stable/{}".format(ds_opts['os_version'])
+ logging.info('Adding patches to overcloud')
+ patched_containers = patched_containers.union(
+ c_builder.add_upstream_patches(patches,
+ tmp_oc_image, tmp_dir,
+ branch,
+ uc_ip=undercloud_admin_ip,
+ docker_tag=docker_tag))
+ # if containers with ceph, and no ceph device we need to use a
+ # persistent loop device for Ceph OSDs
+ if docker_tag and ds_opts['ceph_device'] == '/dev/loop3':
+ tmp_losetup = os.path.join(tmp_dir, 'losetup.service')
+ with open(tmp_losetup, 'w') as fh:
+ fh.write(LOSETUP_SERVICE)
virt_cmds.extend([
- {con.VIRT_RUN_CMD: "cd /root/ovs28 && yum update -y "
- "*openvswitch*"},
- {con.VIRT_RUN_CMD: "cd /root/ovs28 && yum downgrade -y "
- "*openvswitch*"}
+ {con.VIRT_UPLOAD: "{}:/usr/lib/systemd/system/".format(tmp_losetup)
+ },
+ {con.VIRT_RUN_CMD: 'truncate /srv/data.img --size {}'
+ .format(LOOP_DEVICE_SIZE)},
+ {con.VIRT_RUN_CMD: 'systemctl daemon-reload'},
+ {con.VIRT_RUN_CMD: 'systemctl enable losetup.service'},
])
-
- tmp_oc_image = os.path.join(tmp_dir, 'overcloud-full.qcow2')
- shutil.copyfile(img, tmp_oc_image)
- logging.debug("Temporary overcloud image stored as: {}".format(
- tmp_oc_image))
+ # TODO(trozet) remove this after LP#173474 is fixed
+ dhcp_unit = '/usr/lib/systemd/system/dhcp-interface@.service'
+ virt_cmds.append(
+ {con.VIRT_RUN_CMD: "crudini --del {} Unit "
+ "ConditionPathExists".format(dhcp_unit)})
+ # Prep for NFS
+ virt_cmds.extend([
+ {con.VIRT_INSTALL: "nfs-utils"},
+ {con.VIRT_RUN_CMD: "ln -s /usr/lib/systemd/system/nfs-server.service "
+ "/etc/systemd/system/multi-user.target.wants/"
+ "nfs-server.service"},
+ {con.VIRT_RUN_CMD: "mkdir -p /glance"},
+ {con.VIRT_RUN_CMD: "mkdir -p /cinder"},
+ {con.VIRT_RUN_CMD: "mkdir -p /nova"},
+ {con.VIRT_RUN_CMD: "chmod 777 /glance"},
+ {con.VIRT_RUN_CMD: "chmod 777 /cinder"},
+ {con.VIRT_RUN_CMD: "chmod 777 /nova"},
+ {con.VIRT_RUN_CMD: "chown nfsnobody:nfsnobody /glance"},
+ {con.VIRT_RUN_CMD: "chown nfsnobody:nfsnobody /cinder"},
+ {con.VIRT_RUN_CMD: "chown nfsnobody:nfsnobody /nova"},
+ {con.VIRT_RUN_CMD: "echo '/glance *(rw,sync,"
+ "no_root_squash,no_acl)' > /etc/exports"},
+ {con.VIRT_RUN_CMD: "echo '/cinder *(rw,sync,"
+ "no_root_squash,no_acl)' >> /etc/exports"},
+ {con.VIRT_RUN_CMD: "echo '/nova *(rw,sync,"
+ "no_root_squash,no_acl)' >> /etc/exports"},
+ {con.VIRT_RUN_CMD: "exportfs -avr"},
+ ])
virt_utils.virt_customize(virt_cmds, tmp_oc_image)
logging.info("Overcloud image customization complete")
+ return patched_containers
def make_ssh_key():
@@ -341,6 +509,10 @@ def prep_env(ds, ns, inv, opnfv_env, net_env, tmp_dir):
# SSH keys
private_key, public_key = make_ssh_key()
+ num_control, num_compute = inv.get_node_counts()
+ if num_control > 1 and not ds['global_params']['ha_enabled']:
+ num_control = 1
+
# Make easier/faster variables to index in the file editor
if 'performance' in ds_opts:
perf = True
@@ -368,6 +540,10 @@ def prep_env(ds, ns, inv, opnfv_env, net_env, tmp_dir):
else:
perf = False
+ tenant_settings = ns['networks']['tenant']
+ tenant_vlan_enabled = 'tenant' in ns.enabled_network_list and \
+ ns['networks']['tenant'].get('segmentation_type') == 'vlan'
+
# Modify OPNFV environment
# TODO: Change to build a dict and outputting yaml rather than parsing
for line in fileinput.input(tmp_opnfv_env, inplace=True):
@@ -391,6 +567,46 @@ def prep_env(ds, ns, inv, opnfv_env, net_env, tmp_dir):
ds_opts['dataplane'] == 'ovs_dpdk':
output_line = ' OS::TripleO::ComputeExtraConfigPre: ' \
'./ovs-dpdk-preconfig.yaml'
+ elif 'NeutronNetworkVLANRanges' in line:
+ vlan_setting = ''
+ if tenant_vlan_enabled:
+ if ns['networks']['tenant']['overlay_id_range']:
+ vlan_setting = ns['networks']['tenant']['overlay_id_range']
+ if 'datacentre' not in vlan_setting:
+ vlan_setting += ',datacentre:1:1000'
+ # SRIOV networks are VLAN based provider networks. In order to
+ # simplify the deployment, nfv_sriov will be the default physnet.
+ # VLANs are not needed in advance, and the user will have to create
+ # the network specifying the segmentation-id.
+ if ds_opts['sriov']:
+ if vlan_setting:
+ vlan_setting += ",nfv_sriov"
+ else:
+ vlan_setting = "datacentre:1:1000,nfv_sriov"
+ if vlan_setting:
+ output_line = " NeutronNetworkVLANRanges: " + vlan_setting
+ elif 'NeutronBridgeMappings' in line and tenant_vlan_enabled:
+ if tenant_settings['overlay_id_range']:
+ physnets = tenant_settings['overlay_id_range'].split(',')
+ output_line = " NeutronBridgeMappings: "
+ for physnet in physnets:
+ physnet_name = physnet.split(':')[0]
+ if physnet_name != 'datacentre':
+ output_line += "{}:br-vlan,".format(physnet_name)
+ output_line += "datacentre:br-ex"
+ elif 'OpenDaylightProviderMappings' in line and tenant_vlan_enabled \
+ and ds_opts['sdn_controller'] == 'opendaylight':
+ if tenant_settings['overlay_id_range']:
+ physnets = tenant_settings['overlay_id_range'].split(',')
+ output_line = " OpenDaylightProviderMappings: "
+ for physnet in physnets:
+ physnet_name = physnet.split(':')[0]
+ if physnet_name != 'datacentre':
+ output_line += "{}:br-vlan,".format(physnet_name)
+ output_line += "datacentre:br-ex"
+ elif 'NeutronNetworkType' in line and tenant_vlan_enabled:
+ output_line = " NeutronNetworkType: vlan\n" \
+ " NeutronTunnelTypes: ''"
if ds_opts['sdn_controller'] == 'opendaylight' and \
'odl_vpp_routing_node' in ds_opts:
@@ -400,16 +616,22 @@ def prep_env(ds, ns, inv, opnfv_env, net_env, tmp_dir):
ns['domain_name']))
elif not ds_opts['sdn_controller'] and ds_opts['dataplane'] == 'fdio':
if 'NeutronVPPAgentPhysnets' in line:
- output_line = (" NeutronVPPAgentPhysnets: 'datacentre:{}'".
- format(tenant_nic['Controller']))
+ # VPP interface tap0 will be used for external network
+ # connectivity.
+ output_line = (" NeutronVPPAgentPhysnets: "
+ "'datacentre:{},external:tap0'"
+ .format(tenant_nic['Controller']))
elif ds_opts['sdn_controller'] == 'opendaylight' and ds_opts.get(
'dvr') is True:
if 'OS::TripleO::Services::NeutronDhcpAgent' in line:
output_line = ''
elif 'NeutronDhcpAgentsPerNetwork' in line:
- num_control, num_compute = inv.get_node_counts()
+ if num_compute == 0:
+ num_dhcp_agents = num_control
+ else:
+ num_dhcp_agents = num_compute
output_line = (" NeutronDhcpAgentsPerNetwork: {}"
- .format(num_compute))
+ .format(num_dhcp_agents))
elif 'ComputeServices' in line:
output_line = (" ComputeServices:\n"
" - OS::TripleO::Services::NeutronDhcpAgent")
@@ -475,7 +697,50 @@ def prep_env(ds, ns, inv, opnfv_env, net_env, tmp_dir):
print(output_line)
+ # Merge compute services into control services if only a single
+ # node deployment
+ if num_compute == 0:
+ with open(tmp_opnfv_env, 'r') as fh:
+ data = yaml.safe_load(fh)
+ param_data = data['parameter_defaults']
+ logging.info("All in one deployment detected")
+ logging.info("Disabling NFS in env file")
+ # Check to see if any parameters are set for Compute
+ for param in param_data.keys():
+ if param != 'ComputeServices' and param.startswith('Compute'):
+ logging.warning("Compute parameter set, but will not be used "
+ "in deployment: {}. Please use Controller "
+ "based parameters when using All-in-one "
+ "deployments".format(param))
+ if param in NFS_VARS:
+ param_data[param] = False
+ logging.info("Checking if service merging required into "
+ "control services")
+ if ('ControllerServices' in param_data and 'ComputeServices' in
+ param_data):
+ logging.info("Services detected in environment file. Merging...")
+ ctrl_services = param_data['ControllerServices']
+ cmp_services = param_data['ComputeServices']
+ param_data['ControllerServices'] = list(set().union(
+ ctrl_services, cmp_services))
+ for dup_service in DUPLICATE_COMPUTE_SERVICES:
+ if dup_service in param_data['ControllerServices']:
+ param_data['ControllerServices'].remove(dup_service)
+ param_data.pop('ComputeServices')
+ logging.debug("Merged controller services: {}".format(
+ pprint.pformat(param_data['ControllerServices'])
+ ))
+ else:
+ logging.info("No services detected in env file, not merging "
+ "services")
+ with open(tmp_opnfv_env, 'w') as fh:
+ yaml.safe_dump(data, fh, default_flow_style=False)
+
logging.info("opnfv-environment file written to {}".format(tmp_opnfv_env))
+ with open(tmp_opnfv_env, 'r') as fh:
+ logging.debug("opnfv-environment content is : {}".format(
+ pprint.pformat(yaml.safe_load(fh.read()))
+ ))
def generate_ceph_key():
@@ -484,11 +749,13 @@ def generate_ceph_key():
return base64.b64encode(header + key)
-def prep_storage_env(ds, tmp_dir):
+def prep_storage_env(ds, ns, virtual, tmp_dir):
"""
Creates storage environment file for deployment. Source file is copied by
undercloud playbook to host.
:param ds:
+ :param ns:
+ :param virtual:
:param tmp_dir:
:return:
"""
@@ -510,9 +777,35 @@ def prep_storage_env(ds, tmp_dir):
elif 'CephAdminKey' in line:
print(" CephAdminKey: {}".format(generate_ceph_key().decode(
'utf-8')))
+ elif 'CephClientKey' in line:
+ print(" CephClientKey: {}".format(generate_ceph_key().decode(
+ 'utf-8')))
else:
print(line)
- if 'ceph_device' in ds_opts and ds_opts['ceph_device']:
+
+ if ds_opts['containers']:
+ ceph_params = {}
+
+ # max pgs allowed are calculated as num_mons * 200. Therefore we
+ # set number of pgs and pools so that the total will be less:
+ # num_pgs * num_pools * num_osds
+ ceph_params['CephPoolDefaultSize'] = 2
+ ceph_params['CephPoolDefaultPgNum'] = 32
+ if virtual:
+ ceph_params['CephAnsibleExtraConfig'] = {
+ 'centos_package_dependencies': [],
+ 'ceph_osd_docker_memory_limit': '1g',
+ 'ceph_mds_docker_memory_limit': '1g',
+ }
+ ceph_device = ds_opts['ceph_device']
+ ceph_params['CephAnsibleDisksConfig'] = {
+ 'devices': [ceph_device],
+ 'journal_size': 512,
+ 'osd_scenario': 'collocated'
+ }
+ utils.edit_tht_env(storage_file, 'parameter_defaults', ceph_params)
+ # TODO(trozet): remove following block as we only support containers now
+ elif 'ceph_device' in ds_opts and ds_opts['ceph_device']:
with open(storage_file, 'a') as fh:
fh.write(' ExtraConfig:\n')
fh.write(" ceph::profile::params::osds:{{{}:{{}}}}\n".format(
@@ -520,12 +813,58 @@ def prep_storage_env(ds, tmp_dir):
))
-def external_network_cmds(ns):
+def prep_sriov_env(ds, tmp_dir):
+ """
+ Creates SRIOV environment file for deployment. Source file is copied by
+ undercloud playbook to host.
+ :param ds:
+ :param tmp_dir:
+ :return:
+ """
+ ds_opts = ds['deploy_options']
+ sriov_iface = ds_opts['sriov']
+ sriov_file = os.path.join(tmp_dir, 'neutron-opendaylight-sriov.yaml')
+ if not os.path.isfile(sriov_file):
+ logging.error("sriov-environment file is not in tmp directory: {}. "
+ "Check if file was copied from "
+ "undercloud".format(tmp_dir))
+ raise ApexDeployException("sriov-environment file not copied from "
+ "undercloud")
+ # TODO(rnoriega): Instead of line editing, refactor this code to load
+ # yaml file into a dict, edit it and write the file back.
+ for line in fileinput.input(sriov_file, inplace=True):
+ line = line.strip('\n')
+ if 'NovaSchedulerDefaultFilters' in line:
+ print(" {}".format(line[3:]))
+ elif 'NovaSchedulerAvailableFilters' in line:
+ print(" {}".format(line[3:]))
+ elif 'NeutronPhysicalDevMappings' in line:
+ print(" NeutronPhysicalDevMappings: \"nfv_sriov:{}\""
+ .format(sriov_iface))
+ elif 'NeutronSriovNumVFs' in line:
+ print(" NeutronSriovNumVFs: \"{}:8\"".format(sriov_iface))
+ elif 'NovaPCIPassthrough' in line:
+ print(" NovaPCIPassthrough:")
+ elif 'devname' in line:
+ print(" - devname: \"{}\"".format(sriov_iface))
+ elif 'physical_network' in line:
+ print(" physical_network: \"nfv_sriov\"")
+ else:
+ print(line)
+
+
+def external_network_cmds(ns, ds):
"""
Generates external network openstack commands
:param ns: network settings
+ :param ds: deploy settings
:return: list of commands to configure external network
"""
+ ds_opts = ds['deploy_options']
+ external_physnet = 'datacentre'
+ if ds_opts['dataplane'] == 'fdio' and \
+ ds_opts['sdn_controller'] != 'opendaylight':
+ external_physnet = 'external'
if 'external' in ns.enabled_network_list:
net_config = ns['networks']['external'][0]
external = True
@@ -546,7 +885,8 @@ def external_network_cmds(ns):
'compute']['vlan'])
cmds.append("openstack network create external --project service "
"--external --provider-network-type {} "
- "--provider-physical-network datacentre".format(ext_type))
+ "--provider-physical-network {}"
+ .format(ext_type, external_physnet))
# create subnet command
cidr = net_config['cidr']
subnet_cmd = "openstack subnet create external-subnet --project " \
@@ -554,8 +894,7 @@ def external_network_cmds(ns):
"--allocation-pool start={},end={} --subnet-range " \
"{}".format(gateway, pool_start, pool_end, str(cidr))
if external and cidr.version == 6:
- subnet_cmd += ' --ip-version 6 --ipv6-ra-mode slaac ' \
- '--ipv6-address-mode slaac'
+ subnet_cmd += ' --ip-version 6'
cmds.append(subnet_cmd)
logging.debug("Neutron external network commands determined "
"as: {}".format(cmds))
diff --git a/apex/overcloud/node.py b/apex/overcloud/node.py
new file mode 100644
index 0000000..622d1fd
--- /dev/null
+++ b/apex/overcloud/node.py
@@ -0,0 +1,147 @@
+##############################################################################
+# Copyright (c) 2018 Tim Rozet (trozet@redhat.com) and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+import logging
+import os
+import shutil
+import xml.etree.ElementTree as ET
+
+import distro
+import libvirt
+
+from apex.common.exceptions import OvercloudNodeException
+
+
+class OvercloudNode:
+ """
+ Overcloud server
+ """
+ def __init__(self, role, ip, ovs_ctrlrs, ovs_mgrs, name, node_xml,
+ disk_img):
+ self.role = role
+ self.ip = ip
+ self.ovs_ctrlrs = ovs_ctrlrs
+ self.ovs_mgrs = ovs_mgrs
+ self.name = name
+ self.node_xml_file = node_xml
+ self.node_xml = None
+ self.vm = None
+ self.disk_img = None
+ if not os.path.isfile(self.node_xml_file):
+ raise OvercloudNodeException('XML definition file not found: '
+ '{}'.format(self.node_xml_file))
+ if not os.path.isfile(disk_img):
+ raise OvercloudNodeException('Disk image file not found: '
+ '{}'.format(disk_img))
+ self.conn = libvirt.open('qemu:///system')
+ if not self.conn:
+ raise OvercloudNodeException('Unable to open libvirt connection')
+
+ self.create(src_disk=disk_img)
+
+ def _configure_disk(self, disk):
+ # find default storage pool path
+ pool = self.conn.storagePoolLookupByName('default')
+ if pool is None:
+ raise OvercloudNodeException('Cannot find default storage pool')
+ pool_xml = pool.XMLDesc()
+ logging.debug('Default storage pool xml: {}'.format(pool_xml))
+ etree = ET.fromstring(pool_xml)
+ try:
+ path = etree.find('target').find('path').text
+ logging.info('System libvirt default pool path: {}'.format(path))
+ except AttributeError as e:
+ logging.error('Failure to find libvirt storage path: {}'.format(
+ e))
+ raise OvercloudNodeException('Cannot find default storage path')
+ # copy disk to system path
+ self.disk_img = os.path.join(path, os.path.basename(disk))
+ logging.info('Copying disk image to: {}. This may take some '
+ 'time...'.format(self.disk_img))
+ shutil.copyfile(disk, self.disk_img)
+
+ @staticmethod
+ def _update_xml(xml, disk_path=None):
+ """
+ Updates a libvirt XML file for the current architecture and OS of this
+ machine
+ :param xml: XML string of Libvirt domain definition
+ :param disk_path: Optional file path to update for the backing disk
+ image
+ :return: Updated XML
+ """
+ logging.debug('Parsing xml')
+ try:
+ etree = ET.fromstring(xml)
+ except ET.ParseError:
+ logging.error('Unable to parse node XML: {}'.format(xml))
+ raise OvercloudNodeException('Unable to parse node XML')
+
+ try:
+ type_element = etree.find('os').find('type')
+ if 'machine' in type_element.keys():
+ type_element.set('machine', 'pc')
+ logging.debug('XML updated with machine "pc"')
+ except AttributeError:
+ logging.warning('Failure to set XML machine type')
+
+ # qemu-kvm path may differ per system, need to detect it and update xml
+ linux_ver = distro.linux_distribution()[0]
+ if linux_ver == 'Fedora':
+ qemu_path = '/usr/bin/qemu-kvm'
+ else:
+ qemu_path = '/usr/libexec/qemu-kvm'
+
+ try:
+ etree.find('devices').find('emulator').text = qemu_path
+ logging.debug('XML updated with emulator location: '
+ '{}'.format(qemu_path))
+ xml = ET.tostring(etree).decode('utf-8')
+ except AttributeError:
+ logging.warning('Failure to update XML qemu path')
+
+ if disk_path:
+ try:
+ disk_element = etree.find('devices').find('disk').find(
+ 'source')
+ disk_element.set('file', disk_path)
+ logging.debug('XML updated with file path: {}'.format(
+ disk_path))
+ except AttributeError:
+ logging.error('Failure to parse XML and set disk type')
+ raise OvercloudNodeException(
+ 'Unable to set new disk path in xml {}'.format(xml))
+
+ return ET.tostring(etree).decode('utf-8')
+
+ def create(self, src_disk):
+ # copy disk to pool and get new disk location
+ logging.debug('Preparing disk image')
+ self._configure_disk(src_disk)
+ logging.debug('Parsing node XML from {}'.format(self.node_xml_file))
+ with open(self.node_xml_file, 'r') as fh:
+ self.node_xml = fh.read()
+ # if machine is not pc we need to set, also need to update qemu-kvm and
+ # storage location
+ self.node_xml = self._update_xml(self.node_xml, self.disk_img)
+ logging.info('Creating node {} in libvirt'.format(self.name))
+ self.vm = self.conn.defineXML(self.node_xml)
+
+ def start(self):
+ """
+ Boot node in libvirt
+ :return:
+ """
+ try:
+ self.vm.create()
+ logging.info('Node {} started'.format(self.name))
+ except libvirt.libvirtError as e:
+ logging.error('Failed to start domain: {}'.format(self.name))
+ raise OvercloudNodeException('Failed to start VM. Reason: '
+ '{}'.format(e))
diff --git a/apex/settings/deploy_settings.py b/apex/settings/deploy_settings.py
index f2012b2..9f8a6f1 100644
--- a/apex/settings/deploy_settings.py
+++ b/apex/settings/deploy_settings.py
@@ -23,11 +23,15 @@ REQ_DEPLOY_SETTINGS = ['sdn_controller',
'ceph',
'gluon',
'rt_kvm',
- 'os_version']
+ 'os_version',
+ 'l2gw',
+ 'sriov',
+ 'containers',
+ 'ceph_device',
+ 'vim']
OPT_DEPLOY_SETTINGS = ['performance',
'vsperf',
- 'ceph_device',
'yardstick',
'dovetail',
'odl_vpp_routing_node',
@@ -102,12 +106,16 @@ class DeploySettings(dict):
self['deploy_options'][req_set] = 'ovs'
elif req_set == 'ceph':
self['deploy_options'][req_set] = True
+ elif req_set == 'ceph_device':
+ self['deploy_options'][req_set] = '/dev/loop3'
elif req_set == 'odl_version':
self['deploy_options'][req_set] = \
constants.DEFAULT_ODL_VERSION
elif req_set == 'os_version':
self['deploy_options'][req_set] = \
constants.DEFAULT_OS_VERSION
+ elif req_set == 'vim':
+ self['deploy_options'][req_set] = 'openstack'
else:
self['deploy_options'][req_set] = False
elif req_set == 'odl_version' and self['deploy_options'][
@@ -115,9 +123,11 @@ class DeploySettings(dict):
raise DeploySettingsException(
"Invalid ODL version: {}".format(self[deploy_options][
'odl_version']))
-
- if self['deploy_options']['odl_version'] == 'oxygen':
- self['deploy_options']['odl_version'] = 'master'
+ elif req_set == 'sriov':
+ if self['deploy_options'][req_set] is True:
+ raise DeploySettingsException(
+ "Invalid SRIOV interface name: {}".format(
+ self['deploy_options']['sriov']))
if 'performance' in deploy_options:
if not isinstance(deploy_options['performance'], dict):
diff --git a/apex/settings/network_settings.py b/apex/settings/network_settings.py
index f656683..36d143c 100644
--- a/apex/settings/network_settings.py
+++ b/apex/settings/network_settings.py
@@ -167,10 +167,13 @@ class NetworkSettings(dict):
"""
_network = self.get_network(network)
# if vlan not defined then default it to native
- if network is not ADMIN_NETWORK:
- for role in ROLES:
+ for role in ROLES:
+ if network is not ADMIN_NETWORK:
if 'vlan' not in _network['nic_mapping'][role]:
_network['nic_mapping'][role]['vlan'] = 'native'
+ else:
+ # ctlplane network must be native
+ _network['nic_mapping'][role]['vlan'] = 'native'
cidr = _network.get('cidr')
diff --git a/apex/tests/config/98faaca.diff b/apex/tests/config/98faaca.diff
new file mode 100644
index 0000000..96462d5
--- /dev/null
+++ b/apex/tests/config/98faaca.diff
@@ -0,0 +1,331 @@
+From 98faacad44e39a456d9fe1a1d21f5a65e8de4fc1 Mon Sep 17 00:00:00 2001
+From: Janki Chhatbar <jchhatba@redhat.com>
+Date: Tue, 23 Jan 2018 22:43:49 +0530
+Subject: [PATCH] Minor update steps for ODL
+
+Updating OpenStack (within release) means updating ODL from v1 to v1.1.
+This is done by "openstack overcloud update" which collects
+update_tasks. ODL needs 2 different steps to achieve this
+minor update. These are called Level1 and Level2. L1 is
+simple - stop ODL, update, start. This is taken care by paunch
+and no separate implementation is needed. L2 has extra steps
+which are implemented in update_tasks and post_update_tasks.
+
+Updating ODL within the same major release (1->1.1) consists of either
+L1 or L2 steps. These steps are decided from ODLUpdateLevel parameter
+specified in environments/services-docker/update-odl.yaml.
+
+Upgrading ODL to the next major release (1.1->2) requires
+only the L2 steps. These are implemented as upgrade_tasks and
+post_upgrade_tasks in https://review.opendev.org/489201.
+
+Steps involved in level 2 update are
+ 1. Block OVS instances to connect to ODL
+ 2. Set ODL upgrade flag to True
+ 3. Start ODL
+ 4. Start Neutron re-sync and wait for it to finish
+ 5. Delete OVS groups and ports
+ 6. Stop OVS
+ 7. Unblock OVS ports
+ 8. Start OVS
+ 9. Unset ODL upgrade flag
+
+These steps are exactly same as upgrade_tasks.
+The logic implemented is:
+follow upgrade_tasks; when update_level == 2
+
+Change-Id: Ie532800663dd24313a7350b5583a5080ddb796e7
+---
+
+diff --git a/common/deploy-steps.j2 b/common/deploy-steps.j2
+index 595e16c..c4fb05f 100644
+--- a/common/deploy-steps.j2
++++ b/common/deploy-steps.j2
+@@ -23,6 +23,7 @@
+ {% set post_upgrade_steps_max = 4 -%}
+ {% set fast_forward_upgrade_steps_max = 9 -%}
+ {% set fast_forward_upgrade_prep_steps_max = 3 -%}
++{% set post_update_steps_max = 4 -%}
+
+ heat_template_version: queens
+
+@@ -590,3 +591,15 @@
+ - include_tasks: {{role.name}}/fast_forward_upgrade_tasks.yaml
+ when: role_name == '{{role.name}}' and ansible_hostname == {{role.name}}[0]
+ {%- endfor %}
++ post_update_steps_tasks: |
++{%- for role in roles %}
++ - include: {{role.name}}/post_update_tasks.yaml
++ when: role_name == '{{role.name}}'
++{%- endfor %}
++ post_update_steps_playbook: |
++ - hosts: overcloud
++ tasks:
++ - include: post_update_steps_tasks.yaml
++ with_sequence: start=0 end={{post_update_steps_max-1}}
++ loop_control:
++ loop_var: step
+diff --git a/common/services.yaml b/common/services.yaml
+index 2a62c1b..c197b05 100644
+--- a/common/services.yaml
++++ b/common/services.yaml
+@@ -283,6 +283,16 @@
+ expression: coalesce($.data, []).where($ != null).select($.get('update_tasks')).where($ != null).flatten().distinct()
+ data: {get_attr: [ServiceChain, role_data]}
+
++ PostUpdateTasks:
++ type: OS::Heat::Value
++ properties:
++ type: comma_delimited_list
++ value:
++ yaql:
++ # Note we use distinct() here to filter any identical tasks, e.g yum update for all services
++ expression: coalesce($.data, []).where($ != null).select($.get('post_update_tasks')).where($ != null).flatten().distinct()
++ data: {get_attr: [ServiceChain, role_data]}
++
+ UpgradeBatchTasks:
+ type: OS::Heat::Value
+ properties:
+@@ -349,6 +359,7 @@
+ upgrade_tasks: {get_attr: [UpgradeTasks, value]}
+ post_upgrade_tasks: {get_attr: [PostUpgradeTasks, value]}
+ update_tasks: {get_attr: [UpdateTasks, value]}
++ post_update_tasks: {get_attr: [PostUpdateTasks, value]}
+ upgrade_batch_tasks: {get_attr: [UpgradeBatchTasks, value]}
+ service_metadata_settings: {get_attr: [ServiceServerMetadataHook, metadata]}
+
+diff --git a/docker/services/opendaylight-api.yaml b/docker/services/opendaylight-api.yaml
+index 6175db9..3cafe53 100644
+--- a/docker/services/opendaylight-api.yaml
++++ b/docker/services/opendaylight-api.yaml
+@@ -44,6 +44,14 @@
+ type: string
+ description: Specifies the default CA cert to use if TLS is used for
+ services in the internal network.
++ ODLUpdateLevel:
++ default: 1
++ description: Specify the level of update
++ type: number
++ constraints:
++ - allowed_values:
++ - 1
++ - 2
+
+ conditions:
+
+@@ -167,23 +175,25 @@
+ - opendaylight_enabled.rc == 0
+ service: name=opendaylight state=stopped enabled=no
+ # Containarised deployment upgrade steps
+- - name: remove journal and snapshots
+- when: step|int == 0
+- file:
+- path: /var/lib/opendaylight/{{item}}
+- state: absent
+- with_items:
+- - snapshots
+- - journal
+- - name: Set ODL upgrade flag to True
+- copy:
+- dest: /var/lib/opendaylight/etc/opendaylight/datastore/initial/config/genius-mdsalutil-config.xml
+- content: |
+- <config xmlns="urn:opendaylight:params:xml:ns:yang:mdsalutil">
+- <upgradeInProgress>true</upgradeInProgress>
+- </config>
+- when: step|int == 1
+- post_upgrade_tasks:
++ - name: ODL container L2 update and upgrade tasks
++ block: &odl_container_upgrade_tasks
++ - name: remove journal and snapshots
++ when: step|int == 0
++ file:
++ path: /var/lib/opendaylight/{{item}}
++ state: absent
++ with_items:
++ - snapshots
++ - journal
++ - name: Set ODL upgrade flag to True
++ copy:
++ dest: /var/lib/opendaylight/etc/opendaylight/datastore/initial/config/genius-mdsalutil-config.xml
++ content: |
++ <config xmlns="urn:opendaylight:params:xml:ns:yang:mdsalutil">
++ <upgradeInProgress>true</upgradeInProgress>
++ </config>
++ when: step|int == 1
++ post_upgrade_tasks: &odl_container_post_upgrade_tasks
+ - name: Unset upgrade flag in ODL
+ shell:
+ str_replace:
+@@ -192,7 +202,20 @@
+ -H "Content-Type: application/json" \
+ $ODL_URI/restconf/config/genius-mdsalutil:config'
+ params:
+- $ODL_USERNAME: {get_param: [OpenDaylightBase, OpenDaylightUsername]}
+- $ODL_PASSWORD: {get_param: [OpenDaylightBase, OpenDaylightPassword]}
++ $ODL_USERNAME: {get_attr: [OpenDaylightBase, role_data, config_settings, 'opendaylight::username']}
++ $ODL_PASSWORD: {get_attr: [OpenDaylightBase, role_data, config_settings, 'opendaylight::password']}
+ $ODL_URI: {get_param: [EndpointMap, OpenDaylightInternal, uri]}
+ when: step|int == 0
++ update_tasks:
++ - name: Get ODL update level
++ block: &get_odl_update_level
++ - name: store update level to update_level variable
++ set_fact:
++ odl_update_level: {get_param: ODLUpdateLevel}
++ - name: Run L2 update tasks that are similar to upgrade_tasks when update level is 2
++ block: *odl_container_upgrade_tasks
++ when: odl_update_level == 2
++ post_update_tasks:
++ - block: *get_odl_update_level
++ - block: *odl_container_post_upgrade_tasks
++ when: odl_update_level == 2
+\ No newline at end of file
+diff --git a/environments/services-docker/update-odl.yaml b/environments/services-docker/update-odl.yaml
+new file mode 100644
+index 0000000..87d74ef
+--- /dev/null
++++ b/environments/services-docker/update-odl.yaml
+@@ -0,0 +1,11 @@
++# This file describes parameters needed for ODL update.
++# This file is to be used along with other env files during
++# level 2 minor update.
++# Level 2 update involves yang changes in ODL within same ODL release and
++# hence needs DB wipe and resync.
++# Level 1 is simple update - stop ODL, pull new image, start ODL
++# This file is not be used during level1 update or major upgrade.
++# In case doubt, please reach out to ODL developers on #tripleo IRC channel
++
++parameter_defaults:
++ ODLUpdateLevel: 2
+\ No newline at end of file
+diff --git a/puppet/services/opendaylight-ovs.yaml b/puppet/services/opendaylight-ovs.yaml
+index 3390645..958e1bb 100644
+--- a/puppet/services/opendaylight-ovs.yaml
++++ b/puppet/services/opendaylight-ovs.yaml
+@@ -104,6 +104,14 @@
+ type: string
+ description: Specifies the default CA cert to use if TLS is used for
+ services in the internal network.
++ ODLUpdateLevel:
++ default: 1
++ description: Specify the level of update
++ type: number
++ constraints:
++ - allowed_values:
++ - 1
++ - 2
+
+ parameter_groups:
+ - label: deprecated
+@@ -230,14 +238,16 @@
+ - openvswitch_enabled.rc == 0
+ service: name=openvswitch state=stopped
+ # Container upgrade steps.
+- - name: Block connections to ODL. #This rule will be inserted at the top.
+- iptables: chain=OUTPUT action=insert protocol=tcp destination_port={{ item }} jump=DROP
+- when: step|int == 0
+- with_items:
+- - 6640
+- - 6653
+- - 6633
+- post_upgrade_tasks:
++ - name: ODL container L2 update and upgrade tasks
++ block: &odl_container_upgrade_tasks
++ - name: Block connections to ODL. #This rule will be inserted at the top.
++ iptables: chain=OUTPUT action=insert protocol=tcp destination_port={{ item }} jump=DROP
++ when: step|int == 0
++ with_items:
++ - 6640
++ - 6653
++ - 6633
++ post_upgrade_tasks: &odl_container_post_upgrade_tasks
+ - name: Check service openvswitch is running
+ command: systemctl is-active --quiet openvswitch
+ tags: common
+@@ -260,6 +270,20 @@
+ - name: start openvswitch service
+ when: step|int == 3
+ service : name=openvswitch state=started
++ update_tasks:
++ - name: Get ODL update level
++ block: &get_odl_update_level
++ - name: store update level to update_level variable
++ set_fact:
++ odl_update_level: {get_param: ODLUpdateLevel}
++ - name: Run L2 update tasks that are similar to upgrade_tasks when update level is 2
++ block: *odl_container_upgrade_tasks
++ when: odl_update_level == 2
++ post_update_tasks:
++ - block: *get_odl_update_level
++ - block: *odl_container_post_upgrade_tasks
++ when: odl_update_level == 2
++
+ metadata_settings:
+ if:
+ - internal_tls_enabled
+@@ -267,4 +291,4 @@
+ - service: ovs
+ network: {get_param: [ServiceNetMap, OpendaylightApiNetwork]}
+ type: node
+- - null
++ - null
+\ No newline at end of file
+diff --git a/releasenotes/notes/odl_upgrade-f5540d242b9a6b52.yaml b/releasenotes/notes/odl_upgrade-f5540d242b9a6b52.yaml
+index 45703d0..e2943de 100644
+--- a/releasenotes/notes/odl_upgrade-f5540d242b9a6b52.yaml
++++ b/releasenotes/notes/odl_upgrade-f5540d242b9a6b52.yaml
+@@ -1,6 +1,6 @@
+ ---
+
+-features:
++upgrade:
+ - Add ODL upgradability
+ Steps of upgrade are as follows
+ 1. Block OVS instances to connect to ODL done in upgrade_tasks
+diff --git a/releasenotes/notes/update_odl-cb997ce5c136ebb7.yaml b/releasenotes/notes/update_odl-cb997ce5c136ebb7.yaml
+new file mode 100644
+index 0000000..1bcf8ed
+--- /dev/null
++++ b/releasenotes/notes/update_odl-cb997ce5c136ebb7.yaml
+@@ -0,0 +1,19 @@
++---
++features:
++ - Minor update ODL steps are added. ODL minor update (within same ODL
++ release) can have 2 different workflow. These are called level 1 and
++ level2. Level 1 is simple - stop, update and start ODL. Level 2 is
++ complex and involved yang model changes. This requires wiping of
++ DB and resync to repopulate the data.
++ Steps involved in level 2 update are
++ 1. Block OVS instances to connect to ODL
++ 2. Set ODL upgrade flag to True
++ 3. Start ODL
++ 4. Start Neutron re-sync and wait for it to finish
++ 5. Delete OVS groups and ports
++ 6. Stop OVS
++ 7. Unblock OVS ports
++ 8. Start OVS
++ 9. Unset ODL upgrade flag
++ To achieve L2 update, use "-e environments/services-docker/
++ update-odl.yaml" along with other env files to the update command.
+\ No newline at end of file
+diff --git a/tools/yaml-validate.py b/tools/yaml-validate.py
+index 59473f5..9ab6a87 100755
+--- a/tools/yaml-validate.py
++++ b/tools/yaml-validate.py
+@@ -46,11 +46,11 @@
+ OPTIONAL_DOCKER_SECTIONS = ['docker_puppet_tasks', 'upgrade_tasks',
+ 'fast_forward_upgrade_tasks',
+ 'post_upgrade_tasks', 'update_tasks',
+- 'service_config_settings', 'host_prep_tasks',
+- 'metadata_settings', 'kolla_config',
+- 'global_config_settings', 'logging_source',
+- 'logging_groups', 'external_deploy_tasks',
+- 'external_post_deploy_tasks',
++ 'post_update_tasks', 'service_config_settings',
++ 'host_prep_tasks', 'metadata_settings',
++ 'kolla_config', 'global_config_settings',
++ 'logging_source', 'logging_groups',
++ 'external_deploy_tasks', 'external_post_deploy_tasks',
+ 'docker_config_scripts', 'step_config']
+ REQUIRED_DOCKER_PUPPET_CONFIG_SECTIONS = ['config_volume', 'step_config',
+ 'config_image']
diff --git a/apex/tests/config/admin.xml b/apex/tests/config/admin.xml
new file mode 100644
index 0000000..69b15b1
--- /dev/null
+++ b/apex/tests/config/admin.xml
@@ -0,0 +1,7 @@
+<network connections='1' ipv6='yes'>
+ <name>admin</name>
+ <uuid>761c34f8-2a72-4205-8e69-5ed6626c6efa</uuid>
+ <forward mode='bridge'/>
+ <bridge name='br-admin'/>
+ <virtualport type='openvswitch'/>
+</network>
diff --git a/apex/tests/config/baremetal0.xml b/apex/tests/config/baremetal0.xml
new file mode 100644
index 0000000..4ff8f65
--- /dev/null
+++ b/apex/tests/config/baremetal0.xml
@@ -0,0 +1,73 @@
+<domain type='kvm'>
+ <name>baremetal0</name>
+ <uuid>25bf15b6-130c-4bca-87af-e5cbc14bb454</uuid>
+ <memory unit='KiB'>12582912</memory>
+ <currentMemory unit='KiB'>12582912</currentMemory>
+ <vcpu placement='static'>4</vcpu>
+ <resource>
+ <partition>/machine</partition>
+ </resource>
+ <os>
+ <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
+ <boot dev='hd'/>
+ <bootmenu enable='no'/>
+ </os>
+ <features>
+ <acpi/>
+ <apic/>
+ <pae/>
+ </features>
+ <cpu mode='host-passthrough'/>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>restart</on_crash>
+ <devices>
+ <emulator>/usr/libexec/qemu-kvm</emulator>
+ <disk type='file' device='disk'>
+ <driver name='qemu' type='qcow2' cache='unsafe'/>
+ <source file='/home/images/baremetal0.qcow2'/>
+ <target dev='sda' bus='sata'/>
+ <address type='drive' controller='0' bus='0' target='0' unit='0'/>
+ </disk>
+ <controller type='scsi' index='0' model='virtio-scsi'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
+ </controller>
+ <controller type='usb' index='0'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
+ </controller>
+ <controller type='pci' index='0' model='pci-root'/>
+ <controller type='sata' index='0'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
+ </controller>
+ <interface type='bridge'>
+ <mac address='00:5b:06:25:0c:dc'/>
+ <source bridge='br-admin'/>
+ <virtualport type='openvswitch'>
+ <parameters interfaceid='04b63cb9-21a9-4385-bbd6-df677a5eeecf'/>
+ </virtualport>
+ <model type='virtio'/>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
+ </interface>
+ <serial type='pty'>
+ <target port='0'/>
+ </serial>
+ <console type='pty'>
+ <target type='serial' port='0'/>
+ </console>
+ <input type='mouse' bus='ps2'/>
+ <input type='keyboard' bus='ps2'/>
+ <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1'>
+ <listen type='address' address='127.0.0.1'/>
+ </graphics>
+ <video>
+ <model type='cirrus' vram='16384' heads='1' primary='yes'/>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
+ </video>
+ <memballoon model='virtio'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
+ </memballoon>
+ </devices>
+ <seclabel type='dynamic' model='selinux' relabel='yes'/>
+ <seclabel type='dynamic' model='dac' relabel='yes'/>
+</domain>
diff --git a/apex/tests/config/common-patches.yaml b/apex/tests/config/common-patches.yaml
new file mode 100644
index 0000000..fef8fcd
--- /dev/null
+++ b/apex/tests/config/common-patches.yaml
@@ -0,0 +1,6 @@
+---
+patches:
+ queens:
+ undercloud:
+ - change-id: I2e0a40d7902f592e4b7bd727f57048111e0bea36
+ project: openstack/tripleo-common
diff --git a/apex/tests/config/dummy-deploy-settings.yaml b/apex/tests/config/dummy-deploy-settings.yaml
new file mode 100644
index 0000000..54890f3
--- /dev/null
+++ b/apex/tests/config/dummy-deploy-settings.yaml
@@ -0,0 +1,19 @@
+---
+global_params:
+ ha_enabled: false
+ patches:
+ undercloud:
+ - change-id: I2e0a40d7902f592e4b7bd727f57048111e0bea36
+ project: openstack/tripleo-common
+ overcloud:
+ - change-id: Ie988ba6a2d444a614e97c0edf5fce24b23970310
+ project: openstack/puppet-tripleo
+deploy_options:
+ containers: true
+ os_version: queens
+ sdn_controller: opendaylight
+ odl_version: oxygen
+ tacker: false
+ congress: false
+ sfc: false
+ vpn: false
diff --git a/apex/tests/config/inventory-virt-1-compute-node.yaml b/apex/tests/config/inventory-virt-1-compute-node.yaml
new file mode 100644
index 0000000..4c2dc5d
--- /dev/null
+++ b/apex/tests/config/inventory-virt-1-compute-node.yaml
@@ -0,0 +1,14 @@
+---
+nodes:
+ node0:
+ arch: x86_64
+ capabilities: profile:compute
+ cpu: 4
+ disk: 41
+ ipmi_ip: 192.168.122.1
+ ipmi_pass: password
+ ipmi_user: admin
+ mac_address: 00:a8:58:29:f9:99
+ memory: 10240
+ pm_port: 6230
+ pm_type: pxe_ipmitool
diff --git a/apex/tests/config/node.yaml b/apex/tests/config/node.yaml
new file mode 100644
index 0000000..e05644c
--- /dev/null
+++ b/apex/tests/config/node.yaml
@@ -0,0 +1,12 @@
+---
+servers:
+ overcloud-controller-0.opnfvlf.org:
+ address: 192.0.2.28
+ orig-ctl-mac: 00:5b:06:25:0c:dc
+ ovs-controller: tcp:192.0.2.28:6653
+ ovs-managers:
+ - ptcp:6639:127.0.0.1
+ - tcp:192.0.2.28:6640
+ type: controller
+ user: heat-admin
+ vNode-name: baremetal0
diff --git a/apex/tests/config/snapshot.properties b/apex/tests/config/snapshot.properties
new file mode 100644
index 0000000..64c149e
--- /dev/null
+++ b/apex/tests/config/snapshot.properties
@@ -0,0 +1,2 @@
+OPNFV_SNAP_URL=artifacts.opnfv.org/apex/master/noha/apex-csit-snap-2018-08-05.tar.gz
+OPNFV_SNAP_SHA512SUM=bb0c6fa0e675dcb39cfad11d81bb99f309d5cfc236e36a74d05ee813584f3e5bb92aa23dec775846317b75d574f8c86186c666f78a299c24fb68849897bdd4bc
diff --git a/apex/tests/test_apex_build_utils.py b/apex/tests/test_apex_build_utils.py
index d9d542d..36caaf1 100644
--- a/apex/tests/test_apex_build_utils.py
+++ b/apex/tests/test_apex_build_utils.py
@@ -9,17 +9,20 @@
import argparse
import git
+import os
+import unittest
from mock import patch
from apex import build_utils
+from apex.tests import constants as con
from nose.tools import (
assert_is_instance,
assert_raises)
-class TestBuildUtils(object):
+class TestBuildUtils(unittest.TestCase):
@classmethod
def setup_class(cls):
"""This method is run once for each class before any tests are run"""
@@ -165,3 +168,25 @@ class TestBuildUtils(object):
def test_main_debug(self, mock_get_parser):
with patch.object(build_utils.sys, 'argv', self.sys_argv_debug):
build_utils.main()
+
+ def test_strip_patch_sections(self):
+ with open(os.path.join(con.TEST_DUMMY_CONFIG, '98faaca.diff')) as fh:
+ dummy_patch = fh.read()
+ tmp_patch = build_utils.strip_patch_sections(dummy_patch)
+ self.assertNotRegex(tmp_patch, 'releasenotes')
+ self.assertNotRegex(tmp_patch, 'Minor update ODL steps')
+ self.assertNotRegex(tmp_patch, 'Steps of upgrade are as follows')
+ self.assertNotRegex(tmp_patch, 'Steps invlolved in level 2 update')
+
+ def test_is_path_in_patch(self):
+ with open(os.path.join(con.TEST_DUMMY_CONFIG, '98faaca.diff')) as fh:
+ dummy_patch = fh.read()
+ self.assertTrue(build_utils.is_path_in_patch(dummy_patch,
+ 'releasenotes/'))
+
+ def test_strip_no_patch_sections(self):
+ with open(os.path.join(con.TEST_DUMMY_CONFIG, '98faaca.diff')) as fh:
+ dummy_patch = fh.read()
+ tmp_patch = build_utils.strip_patch_sections(dummy_patch,
+ sections=[])
+ self.assertEqual(dummy_patch, tmp_patch)
diff --git a/apex/tests/test_apex_common_builder.py b/apex/tests/test_apex_common_builder.py
index c32f72c..3ff95bb 100644
--- a/apex/tests/test_apex_common_builder.py
+++ b/apex/tests/test_apex_common_builder.py
@@ -10,11 +10,22 @@
import unittest
from apex.builders import common_builder as c_builder
+from apex.builders import exceptions
from apex.common import constants as con
from mock import patch
from mock import mock_open
from mock import MagicMock
+DOCKER_YAML = {
+ 'resource_registry': {
+ 'OS::TripleO::Services::NovaApi': '../docker/services/nova-api.yaml',
+ 'OS::TripleO::Services::NovaConductor':
+ '../docker/services/nova-conductor.yaml'
+ }
+}
+
+a_mock_open = mock_open(read_data=None)
+
class TestCommonBuilder(unittest.TestCase):
@classmethod
@@ -39,13 +50,55 @@ class TestCommonBuilder(unittest.TestCase):
path = '/etc/puppet/modules/tripleo'
self.assertEquals(c_builder.project_to_path(project), path)
project = 'openstack/nova'
- path = '/usr/lib/python2.7/site-packages/nova'
+ path = '/usr/lib/python2.7/site-packages/'
self.assertEquals(c_builder.project_to_path(project), path)
+ def test_is_patch_promoted(self):
+ dummy_change = {'submitted': '2017-06-05 20:23:09.000000000',
+ 'status': 'MERGED'}
+ self.assertTrue(c_builder.is_patch_promoted(dummy_change,
+ 'master',
+ con.DOCKERHUB_OOO))
+
+ def test_is_patch_promoted_docker(self):
+ dummy_change = {'submitted': '2017-06-05 20:23:09.000000000',
+ 'status': 'MERGED'}
+ dummy_image = 'centos-binary-opendaylight'
+ self.assertTrue(c_builder.is_patch_promoted(dummy_change,
+ 'master',
+ con.DOCKERHUB_OOO,
+ docker_image=dummy_image))
+
+ def test_patch_not_promoted(self):
+ dummy_change = {'submitted': '2900-06-05 20:23:09.000000000',
+ 'status': 'MERGED'}
+ self.assertFalse(c_builder.is_patch_promoted(dummy_change,
+ 'master',
+ con.DOCKERHUB_OOO))
+
+ def test_patch_not_promoted_docker(self):
+ dummy_change = {'submitted': '2900-06-05 20:23:09.000000000',
+ 'status': 'MERGED'}
+ dummy_image = 'centos-binary-opendaylight'
+ self.assertFalse(c_builder.is_patch_promoted(dummy_change,
+ 'master',
+ con.DOCKERHUB_OOO,
+ docker_image=dummy_image))
+
+ def test_patch_not_promoted_and_not_merged(self):
+ dummy_change = {'submitted': '2900-06-05 20:23:09.000000000',
+ 'status': 'BLAH'}
+ self.assertFalse(c_builder.is_patch_promoted(dummy_change,
+ 'master',
+ con.DOCKERHUB_OOO))
+
@patch('builtins.open', mock_open())
+ @patch('apex.builders.common_builder.is_patch_promoted')
+ @patch('apex.build_utils.get_change')
@patch('apex.build_utils.get_patch')
@patch('apex.virtual.utils.virt_customize')
- def test_add_upstream_patches(self, mock_customize, mock_get_patch):
+ def test_add_upstream_patches(self, mock_customize, mock_get_patch,
+ mock_get_change, mock_is_patch_promoted):
mock_get_patch.return_value = None
change_id = 'I301370fbf47a71291614dd60e4c64adc7b5ebb42'
patches = [{
@@ -64,10 +117,116 @@ class TestCommonBuilder(unittest.TestCase):
{con.VIRT_RUN_CMD: "cd {} && patch -p1 < {}".format(
project_path, patch_file)}]
mock_get_patch.return_value = 'some random diff'
+ mock_is_patch_promoted.return_value = False
c_builder.add_upstream_patches(patches, 'dummy.qcow2', '/dummytmp/')
mock_customize.assert_called_once_with(test_virt_ops, 'dummy.qcow2')
@patch('builtins.open', mock_open())
+ @patch('apex.builders.common_builder.is_patch_promoted')
+ @patch('apex.build_utils.get_change')
+ @patch('apex.build_utils.get_patch')
+ @patch('apex.virtual.utils.virt_customize')
+ def test_add_upstream_patches_docker_puppet(
+ self, mock_customize, mock_get_patch, mock_get_change,
+ mock_is_patch_promoted):
+ change_id = 'I301370fbf47a71291614dd60e4c64adc7b5ebb42'
+ patches = [{
+ 'change-id': change_id,
+ 'project': 'openstack/puppet-tripleo'
+ }]
+ project_path = '/etc/puppet/modules/tripleo'
+ patch_file = "{}.patch".format(change_id)
+ patch_file_path = "/dummytmp/{}".format(patch_file)
+ test_virt_ops = [
+ {con.VIRT_INSTALL: 'patch'},
+ {con.VIRT_UPLOAD: "{}:{}".format(patch_file_path,
+ project_path)},
+ {con.VIRT_RUN_CMD: "cd {} && patch -p1 < {}".format(
+ project_path, patch_file)}]
+ mock_get_patch.return_value = 'some random diff'
+ mock_is_patch_promoted.return_value = False
+ c_builder.add_upstream_patches(patches, 'dummy.qcow2', '/dummytmp/',
+ uc_ip='192.0.2.1',
+ docker_tag='latest')
+ mock_customize.assert_called_once_with(test_virt_ops, 'dummy.qcow2')
+
+ @patch('builtins.open', mock_open())
+ @patch('apex.builders.common_builder.is_patch_promoted')
+ @patch('apex.build_utils.get_change')
+ @patch('apex.builders.common_builder.project_to_docker_image')
+ @patch('apex.builders.overcloud_builder.build_dockerfile')
+ @patch('apex.build_utils.get_patch')
+ @patch('apex.virtual.utils.virt_customize')
+ def test_add_upstream_patches_docker_python(
+ self, mock_customize, mock_get_patch, mock_build_docker_file,
+ mock_project2docker, ock_get_change, mock_is_patch_promoted):
+ mock_project2docker.return_value = ['NovaApi']
+ change_id = 'I301370fbf47a71291614dd60e4c64adc7b5ebb42'
+ patches = [{
+ 'change-id': change_id,
+ 'project': 'openstack/nova'
+ }]
+ mock_get_patch.return_value = 'some random diff'
+ mock_is_patch_promoted.return_value = False
+ services = c_builder.add_upstream_patches(patches, 'dummy.qcow2',
+ '/dummytmp/',
+ uc_ip='192.0.2.1',
+ docker_tag='latest')
+ assert mock_customize.not_called
+ assert mock_build_docker_file.called
+ self.assertSetEqual(services, {'NovaApi'})
+
+ @patch('builtins.open', mock_open())
+ @patch('apex.builders.common_builder.is_patch_promoted')
+ @patch('apex.build_utils.get_change')
+ @patch('apex.builders.common_builder.project_to_docker_image')
+ @patch('apex.builders.overcloud_builder.build_dockerfile')
+ @patch('apex.build_utils.get_patch')
+ @patch('apex.virtual.utils.virt_customize')
+ def test_not_add_upstream_patches_docker_python(
+ self, mock_customize, mock_get_patch, mock_build_docker_file,
+ mock_project2docker, ock_get_change, mock_is_patch_promoted):
+ # Test that the calls are not made when the patch is already merged and
+ # promoted
+ mock_project2docker.return_value = ['NovaApi']
+ change_id = 'I301370fbf47a71291614dd60e4c64adc7b5ebb42'
+ patches = [{
+ 'change-id': change_id,
+ 'project': 'openstack/nova'
+ }]
+ mock_get_patch.return_value = 'some random diff'
+ mock_is_patch_promoted.return_value = True
+ services = c_builder.add_upstream_patches(patches, 'dummy.qcow2',
+ '/dummytmp/',
+ uc_ip='192.0.2.1',
+ docker_tag='latest')
+ assert mock_customize.not_called
+ assert mock_build_docker_file.not_called
+ assert len(services) == 0
+
+ @patch('builtins.open', mock_open())
+ @patch('apex.builders.common_builder.is_patch_promoted')
+ @patch('apex.build_utils.get_change')
+ @patch('apex.build_utils.get_patch')
+ @patch('apex.virtual.utils.virt_customize')
+ def test_not_upstream_patches_docker_puppet(
+ self, mock_customize, mock_get_patch, mock_get_change,
+ mock_is_patch_promoted):
+ # Test that the calls are not made when the patch is already merged and
+ # promoted
+ change_id = 'I301370fbf47a71291614dd60e4c64adc7b5ebb42'
+ patches = [{
+ 'change-id': change_id,
+ 'project': 'openstack/puppet-tripleo'
+ }]
+ mock_get_patch.return_value = 'some random diff'
+ mock_is_patch_promoted.return_value = True
+ c_builder.add_upstream_patches(patches, 'dummy.qcow2', '/dummytmp/',
+ uc_ip='192.0.2.1',
+ docker_tag='latest')
+ assert mock_customize.not_called
+
+ @patch('builtins.open', mock_open())
@patch('apex.virtual.utils.virt_customize')
def test_add_repo(self, mock_customize):
c_builder.add_repo('fake/url', 'dummyrepo', 'dummy.qcow2',
@@ -85,3 +244,67 @@ class TestCommonBuilder(unittest.TestCase):
self.assertEqual(c_builder.create_git_archive('fake/url', 'dummyrepo',
'/dummytmp/'),
'/dummytmp/dummyrepo.tar')
+
+ def test_project_to_docker_image(self):
+ found_services = c_builder.project_to_docker_image('nova',
+ con.DOCKERHUB_OOO)
+ assert 'nova-api' in found_services
+
+ @patch('apex.common.utils.open_webpage')
+ def test_project_to_docker_image_bad_web_content(
+ self, mock_open_web):
+ mock_open_web.return_value = b'{"blah": "blah"}'
+ self.assertRaises(exceptions.ApexCommonBuilderException,
+ c_builder.project_to_docker_image,
+ 'nova',
+ con.DOCKERHUB_OOO)
+
+ def test_get_neutron_driver(self):
+ ds_opts = {'dataplane': 'fdio',
+ 'sdn_controller': 'opendaylight',
+ 'odl_version': 'master',
+ 'vpn': False,
+ 'sriov': False}
+ self.assertEquals(c_builder.get_neutron_driver(ds_opts),
+ 'odl')
+ ds_opts['sdn_controller'] = None
+ ds_opts['vpp'] = True
+ self.assertEquals(c_builder.get_neutron_driver(ds_opts),
+ 'vpp')
+ ds_opts['sdn_controller'] = 'ovn'
+ self.assertEquals(c_builder.get_neutron_driver(ds_opts),
+ 'ovn')
+
+ @patch('apex.builders.common_builder.yaml')
+ @patch('apex.overcloud.deploy.os.path.isfile')
+ @patch('builtins.open', a_mock_open, create=True)
+ def test_prepare_container_images(self, mock_is_file, mock_yaml):
+ mock_yaml.safe_load.return_value = {
+ 'parameter_defaults': {
+ 'ContainerImagePrepare': [
+ {'set':
+ {'namespace': 'blah',
+ 'neutron_driver': 'null',
+ }
+ }
+ ]
+ }
+ }
+ expected_output = {
+ 'parameter_defaults': {
+ 'ContainerImagePrepare': [
+ {'set':
+ {'namespace': 'docker.io/tripleoqueens',
+ 'neutron_driver': 'odl',
+ }
+ }
+ ]
+ }
+ }
+
+ c_builder.prepare_container_images('dummy.yaml', 'queens',
+ 'odl')
+ mock_yaml.safe_dump.assert_called_with(
+ expected_output,
+ a_mock_open.return_value,
+ default_flow_style=False)
diff --git a/apex/tests/test_apex_common_utils.py b/apex/tests/test_apex_common_utils.py
index 6f2a947..1ecb7df 100644
--- a/apex/tests/test_apex_common_utils.py
+++ b/apex/tests/test_apex_common_utils.py
@@ -12,12 +12,14 @@ import os
import shutil
import urllib.error
+from apex.common import exceptions
from apex.common import utils
from apex.settings.network_settings import NetworkSettings
from apex.tests.constants import (
TEST_CONFIG_DIR,
TEST_PLAYBOOK_DIR)
+from mock import patch, mock_open
from nose.tools import (
assert_equal,
assert_is_instance,
@@ -25,6 +27,7 @@ from nose.tools import (
assert_raises)
NET_SETS = os.path.join(TEST_CONFIG_DIR, 'network', 'network_settings.yaml')
+a_mock_open = mock_open(read_data=None)
class TestCommonUtils:
@@ -61,8 +64,11 @@ class TestCommonUtils:
def test_run_ansible(self):
playbook = 'apex/tests/playbooks/test_playbook.yaml'
+ extra_vars = [{'testvar1': 'value1', 'testvar2': 'value2'}]
assert_equal(utils.run_ansible(None, os.path.join(playbook),
dry_run=True), None)
+ assert_equal(utils.run_ansible(extra_vars, os.path.join(playbook),
+ dry_run=True, host='1.1.1.1'), None)
def test_failed_run_ansible(self):
playbook = 'apex/tests/playbooks/test_failed_playbook.yaml'
@@ -78,7 +84,7 @@ class TestCommonUtils:
def test_fetch_upstream_previous_file(self):
test_file = 'overcloud-full.tar.md5'
- url = 'https://images.rdoproject.org/master/delorean/' \
+ url = 'https://images.rdoproject.org/master/rdo_trunk/' \
'current-tripleo/stable/'
os.makedirs('/tmp/fetch_test', exist_ok=True)
open("/tmp/fetch_test/{}".format(test_file), 'w').close()
@@ -100,3 +106,57 @@ class TestCommonUtils:
url, ['dummy_test.tar'])
assert os.path.isfile('/tmp/fetch_test/test.txt')
shutil.rmtree('/tmp/fetch_test')
+
+ def test_nofetch_upstream_and_unpack(self):
+ test_file = 'overcloud-full.tar.md5'
+ url = 'https://images.rdoproject.org/master/delorean/' \
+ 'current-tripleo/stable/'
+ os.makedirs('/tmp/fetch_test', exist_ok=True)
+ target = "/tmp/fetch_test/{}".format(test_file)
+ open(target, 'w').close()
+ target_mtime = os.path.getmtime(target)
+ utils.fetch_upstream_and_unpack('/tmp/fetch_test',
+ url, [test_file], fetch=False)
+ post_target_mtime = os.path.getmtime(target)
+ shutil.rmtree('/tmp/fetch_test')
+ assert_equal(target_mtime, post_target_mtime)
+
+ def test_nofetch_upstream_and_unpack_no_target(self):
+ test_file = 'overcloud-full.tar.md5'
+ url = 'https://images.rdoproject.org/master/delorean/' \
+ 'current-tripleo/stable/'
+ utils.fetch_upstream_and_unpack('/tmp/fetch_test',
+ url, [test_file])
+ assert os.path.isfile("/tmp/fetch_test/{}".format(test_file))
+ shutil.rmtree('/tmp/fetch_test')
+
+ def test_open_webpage(self):
+ output = utils.open_webpage('http://opnfv.org')
+ assert output is not None
+
+ def test_open_invalid_webpage(self):
+ assert_raises(exceptions.FetchException, utils.open_webpage,
+ 'http://inv4lIdweb-page.com')
+
+ @patch('builtins.open', a_mock_open)
+ @patch('yaml.safe_dump')
+ @patch('yaml.safe_load')
+ def test_edit_tht_env(self, mock_yaml_load, mock_yaml_dump):
+ settings = {'SomeParameter': 'some_value'}
+ mock_yaml_load.return_value = {
+ 'parameter_defaults': {'SomeParameter': 'dummy'}
+ }
+ utils.edit_tht_env('/dummy-environment.yaml', 'parameter_defaults',
+ settings)
+ new_data = {'parameter_defaults': settings}
+ mock_yaml_dump.assert_called_once_with(new_data, a_mock_open(),
+ default_flow_style=False)
+
+ def test_unique(self):
+ dummy_list = [1, 2, 1, 3, 4, 5, 5]
+ assert_equal(utils.unique(dummy_list), [1, 2, 3, 4, 5])
+
+ def test_find_container_client(self):
+ for version in 'rocky', 'queens':
+ assert_equal(utils.find_container_client(version), 'docker')
+ assert_equal(utils.find_container_client('master'), 'podman')
diff --git a/apex/tests/test_apex_deploy.py b/apex/tests/test_apex_deploy.py
index 403b709..004c21c 100644
--- a/apex/tests/test_apex_deploy.py
+++ b/apex/tests/test_apex_deploy.py
@@ -8,6 +8,7 @@
##############################################################################
import argparse
+import os
import unittest
from mock import patch
@@ -17,12 +18,12 @@ from mock import mock_open
from apex.common.exceptions import ApexDeployException
from apex.common.constants import DEFAULT_OS_VERSION
-from apex.deploy import deploy_quickstart
from apex.deploy import validate_cross_settings
from apex.deploy import build_vms
from apex.deploy import create_deploy_parser
from apex.deploy import validate_deploy_args
from apex.deploy import main
+from apex.tests.constants import TEST_DUMMY_CONFIG
from nose.tools import (
assert_is_instance,
@@ -48,9 +49,6 @@ class TestDeploy(unittest.TestCase):
def teardown(self):
"""This method is run once after _each_ test method is executed"""
- def test_deloy_quickstart(self):
- deploy_quickstart(None, None, None)
-
def test_validate_cross_settings(self):
deploy_settings = {'deploy_options': {'dataplane': 'ovs'}}
net_settings = Mock()
@@ -85,12 +83,23 @@ class TestDeploy(unittest.TestCase):
args = Mock()
args.inventory_file = None
args.virtual = True
+ args.snapshot = False
+ validate_deploy_args(args)
+
+ def test_validate_snapshot_deploy_args(self):
+ args = Mock()
+ args.deploy_settings_file = os.path.join(TEST_DUMMY_CONFIG,
+ 'dummy-deploy-settings.yaml')
+ args.inventory_file = None
+ args.virtual = True
+ args.snapshot = True
validate_deploy_args(args)
def test_validate_deploy_args_no_virt_no_inv(self):
args = Mock()
args.inventory_file = 'file_name'
args.virtual = False
+ args.snapshot = False
assert_raises(ApexDeployException, validate_deploy_args, args)
@patch('apex.deploy.os.path')
@@ -99,14 +108,19 @@ class TestDeploy(unittest.TestCase):
args = Mock()
args.inventory_file = None
args.virtual = True
+ args.snapshot = False
assert_raises(ApexDeployException, validate_deploy_args, args)
def test_validate_deploy_args_virt_and_inv_file(self):
args = Mock()
args.inventory_file = 'file_name'
args.virtual = True
+ args.snapshot = False
assert_raises(ApexDeployException, validate_deploy_args, args)
+ @patch('apex.deploy.c_builder')
+ @patch('apex.deploy.ApexDeployment')
+ @patch('apex.deploy.uc_builder')
@patch('apex.deploy.network_data.create_network_data')
@patch('apex.deploy.shutil')
@patch('apex.deploy.oc_deploy')
@@ -132,7 +146,8 @@ class TestDeploy(unittest.TestCase):
mock_deploy_sets, mock_net_sets, mock_net_env,
mock_utils, mock_parsers, mock_oc_cfg,
mock_virt_utils, mock_inv, mock_build_vms, mock_uc_lib,
- mock_oc_deploy, mock_shutil, mock_network_data):
+ mock_oc_deploy, mock_shutil, mock_network_data,
+ mock_uc_builder, mock_deployment, mock_c_builder):
net_sets_dict = {'networks': MagicMock(),
'dns_servers': 'test'}
ds_opts_dict = {'global_params': MagicMock(),
@@ -142,13 +157,16 @@ class TestDeploy(unittest.TestCase):
'dataplane': 'ovs',
'sfc': False,
'vpn': False,
+ 'vim': 'openstack',
'yardstick': 'test',
- 'os_version': DEFAULT_OS_VERSION}}
+ 'os_version': DEFAULT_OS_VERSION,
+ 'containers': False}}
args = mock_parser.return_value.parse_args.return_value
args.virtual = False
args.quickstart = False
args.debug = False
- args.upstream = False
+ args.snapshot = False
+ args.upstream = True
net_sets = mock_net_sets.return_value
net_sets.enabled_network_list = ['external']
net_sets.__getitem__.side_effect = net_sets_dict.__getitem__
@@ -159,6 +177,7 @@ class TestDeploy(unittest.TestCase):
mock_parsers.parse_nova_output.return_value = {'testnode1': 'test'}
main()
+ @patch('apex.deploy.SnapshotDeployment')
@patch('apex.deploy.validate_cross_settings')
@patch('apex.deploy.virt_utils')
@patch('apex.deploy.utils')
@@ -169,15 +188,19 @@ class TestDeploy(unittest.TestCase):
@patch('apex.deploy.os')
@patch('apex.deploy.create_deploy_parser')
@patch('builtins.open', a_mock_open, create=True)
- def test_main_qs(self, mock_parser, mock_os, mock_deploy,
- mock_net_sets, mock_net_env, mock_inv, mock_utils,
- mock_virt_utils, mock_cross):
+ def test_main_snapshot(self, mock_parser, mock_os, mock_deploy,
+ mock_net_sets, mock_net_env, mock_inv, mock_utils,
+ mock_virt_utils, mock_cross, mock_snap_deployment):
args = mock_parser.return_value.parse_args.return_value
args.virtual = False
- args.quickstart = True
+ args.snapshot = True
args.debug = True
main()
+ mock_snap_deployment.assert_called()
+ @patch('apex.deploy.c_builder')
+ @patch('apex.deploy.ApexDeployment')
+ @patch('apex.deploy.uc_builder')
@patch('apex.deploy.network_data.create_network_data')
@patch('apex.deploy.shutil')
@patch('apex.deploy.oc_deploy')
@@ -203,7 +226,8 @@ class TestDeploy(unittest.TestCase):
mock_deploy_sets, mock_net_sets, mock_net_env,
mock_utils, mock_parsers, mock_oc_cfg,
mock_virt_utils, mock_inv, mock_build_vms, mock_uc_lib,
- mock_oc_deploy, mock_shutil, mock_network_data):
+ mock_oc_deploy, mock_shutil, mock_network_data,
+ mock_uc_builder, mock_deployment, mock_c_builder):
# didn't work yet line 412
# net_sets_dict = {'networks': {'admin': {'cidr': MagicMock()}},
# 'dns_servers': 'test'}
@@ -215,8 +239,10 @@ class TestDeploy(unittest.TestCase):
'dataplane': 'ovs',
'sfc': False,
'vpn': False,
+ 'vim': 'openstack',
'yardstick': 'test',
- 'os_version': DEFAULT_OS_VERSION}}
+ 'os_version': DEFAULT_OS_VERSION,
+ 'containers': False}}
args = mock_parser.return_value.parse_args.return_value
args.virtual = True
args.quickstart = False
@@ -226,7 +252,72 @@ class TestDeploy(unittest.TestCase):
args.virt_compute_nodes = 1
args.virt_compute_ram = None
args.virt_default_ram = 12
- args.upstream = False
+ args.upstream = True
+ args.snapshot = False
+ net_sets = mock_net_sets.return_value
+ net_sets.enabled_network_list = ['admin']
+ deploy_sets = mock_deploy_sets.return_value
+ deploy_sets.__getitem__.side_effect = ds_opts_dict.__getitem__
+ deploy_sets.__contains__.side_effect = ds_opts_dict.__contains__
+ main()
+ args.virt_compute_ram = 16
+ args.virt_default_ram = 10
+ main()
+
+ @patch('apex.deploy.ApexDeployment')
+ @patch('apex.deploy.c_builder')
+ @patch('apex.deploy.uc_builder')
+ @patch('apex.deploy.oc_builder')
+ @patch('apex.deploy.network_data.create_network_data')
+ @patch('apex.deploy.shutil')
+ @patch('apex.deploy.oc_deploy')
+ @patch('apex.deploy.uc_lib')
+ @patch('apex.deploy.build_vms')
+ @patch('apex.deploy.Inventory')
+ @patch('apex.deploy.virt_utils')
+ @patch('apex.deploy.oc_cfg')
+ @patch('apex.deploy.parsers')
+ @patch('apex.deploy.utils')
+ @patch('apex.deploy.NetworkEnvironment')
+ @patch('apex.deploy.NetworkSettings')
+ @patch('apex.deploy.DeploySettings')
+ @patch('apex.deploy.os')
+ @patch('apex.deploy.json')
+ @patch('apex.deploy.jumphost')
+ @patch('apex.deploy.validate_cross_settings')
+ @patch('apex.deploy.validate_deploy_args')
+ @patch('apex.deploy.create_deploy_parser')
+ @patch('builtins.open', a_mock_open, create=True)
+ def test_main_virt_containers_upstream(
+ self, mock_parser, mock_val_args, mock_cross_sets, mock_jumphost,
+ mock_json, mock_os, mock_deploy_sets, mock_net_sets, mock_net_env,
+ mock_utils, mock_parsers, mock_oc_cfg, mock_virt_utils,
+ mock_inv, mock_build_vms, mock_uc_lib, mock_oc_deploy,
+ mock_shutil, mock_network_data, mock_oc_builder,
+ mock_uc_builder, mock_c_builder, mock_deployment):
+
+ ds_opts_dict = {'global_params': MagicMock(),
+ 'deploy_options': {'gluon': False,
+ 'congress': False,
+ 'sdn_controller': 'opendaylight',
+ 'dataplane': 'ovs',
+ 'sfc': False,
+ 'vpn': False,
+ 'vim': 'openstack',
+ 'yardstick': 'test',
+ 'os_version': DEFAULT_OS_VERSION,
+ 'containers': True}}
+ args = mock_parser.return_value.parse_args.return_value
+ args.virtual = True
+ args.quickstart = False
+ args.debug = True
+ args.virt_default_ram = 10
+ args.ha_enabled = True
+ args.virt_compute_nodes = 1
+ args.virt_compute_ram = None
+ args.virt_default_ram = 12
+ args.upstream = True
+ args.snapshot = False
net_sets = mock_net_sets.return_value
net_sets.enabled_network_list = ['admin']
deploy_sets = mock_deploy_sets.return_value
@@ -236,3 +327,67 @@ class TestDeploy(unittest.TestCase):
args.virt_compute_ram = 16
args.virt_default_ram = 10
main()
+ mock_oc_deploy.prep_image.assert_called()
+ # TODO(trozet) add assertions here with arguments for functions in
+ # deploy main
+
+ @patch('apex.deploy.c_builder')
+ @patch('apex.deploy.ApexDeployment')
+ @patch('apex.deploy.uc_builder')
+ @patch('apex.deploy.network_data.create_network_data')
+ @patch('apex.deploy.shutil')
+ @patch('apex.deploy.git')
+ @patch('apex.deploy.oc_deploy')
+ @patch('apex.deploy.uc_lib')
+ @patch('apex.deploy.build_vms')
+ @patch('apex.deploy.Inventory')
+ @patch('apex.deploy.virt_utils')
+ @patch('apex.deploy.oc_cfg')
+ @patch('apex.deploy.parsers')
+ @patch('apex.deploy.utils')
+ @patch('apex.deploy.NetworkEnvironment')
+ @patch('apex.deploy.NetworkSettings')
+ @patch('apex.deploy.DeploySettings')
+ @patch('apex.deploy.os')
+ @patch('apex.deploy.json')
+ @patch('apex.deploy.jumphost')
+ @patch('apex.deploy.validate_cross_settings')
+ @patch('apex.deploy.validate_deploy_args')
+ @patch('apex.deploy.create_deploy_parser')
+ @patch('builtins.open', a_mock_open, create=True)
+ def test_main_k8s(self, mock_parser, mock_val_args, mock_cross_sets,
+ mock_jumphost, mock_json, mock_os,
+ mock_deploy_sets, mock_net_sets, mock_net_env,
+ mock_utils, mock_parsers, mock_oc_cfg,
+ mock_virt_utils, mock_inv, mock_build_vms, mock_uc_lib,
+ mock_oc_deploy, mock_git, mock_shutil,
+ mock_network_data, mock_uc_builder, mock_deployment,
+ mock_c_builder):
+ net_sets_dict = {'networks': MagicMock(),
+ 'dns_servers': 'test'}
+ ds_opts_dict = {'global_params': MagicMock(),
+ 'deploy_options': {'gluon': False,
+ 'congress': True,
+ 'sdn_controller': False,
+ 'dataplane': 'ovs',
+ 'sfc': False,
+ 'vpn': False,
+ 'vim': 'k8s',
+ 'yardstick': 'test',
+ 'os_version': DEFAULT_OS_VERSION,
+ 'containers': False}}
+ args = mock_parser.return_value.parse_args.return_value
+ args.virtual = False
+ args.quickstart = False
+ args.debug = False
+ args.upstream = False
+ args.snapshot = False
+ net_sets = mock_net_sets.return_value
+ net_sets.enabled_network_list = ['external']
+ net_sets.__getitem__.side_effect = net_sets_dict.__getitem__
+ net_sets.__contains__.side_effect = net_sets_dict.__contains__
+ deploy_sets = mock_deploy_sets.return_value
+ deploy_sets.__getitem__.side_effect = ds_opts_dict.__getitem__
+ deploy_sets.__contains__.side_effect = ds_opts_dict.__contains__
+ mock_parsers.parse_nova_output.return_value = {'testnode1': 'test'}
+ main()
diff --git a/apex/tests/test_apex_deployment_snapshot.py b/apex/tests/test_apex_deployment_snapshot.py
new file mode 100644
index 0000000..d754258
--- /dev/null
+++ b/apex/tests/test_apex_deployment_snapshot.py
@@ -0,0 +1,374 @@
+##############################################################################
+# Copyright (c) 2018 Tim Rozet (trozet@redhat.com) (Red Hat)
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+from mock import patch
+import os
+import unittest
+import urllib.request
+
+from apex.common import exceptions as exc
+from apex.deployment.snapshot import SnapshotDeployment
+from apex.settings.deploy_settings import DeploySettings
+from apex.tests.constants import TEST_DUMMY_CONFIG
+
+DUMMY_SNAP_DIR = '/tmp/dummy_cache'
+
+
+class TestSnapshotDeployment(unittest.TestCase):
+ @classmethod
+ def setup_class(cls):
+ """This method is run once for each class before any tests are run"""
+
+ @classmethod
+ def teardown_class(cls):
+ """This method is run once for each class _after_ all tests are run"""
+
+ def setup(self):
+ """This method is run once before _each_ test method is executed"""
+
+ def teardown(self):
+ """This method is run once after _each_ test method is executed"""
+
+ @patch('apex.deployment.snapshot.SnapshotDeployment.pull_snapshot')
+ @patch('apex.deployment.snapshot.libvirt.open')
+ @patch('apex.deployment.snapshot.SnapshotDeployment.deploy_snapshot')
+ def test_init(self, mock_deploy_snap, mock_libvirt_open, mock_pull_snap):
+
+ ds_file = os.path.join(TEST_DUMMY_CONFIG, 'dummy-deploy-settings.yaml')
+ ds = DeploySettings(ds_file)
+ d = SnapshotDeployment(deploy_settings=ds,
+ snap_cache_dir=DUMMY_SNAP_DIR,
+ fetch=True, all_in_one=False)
+ snap_dir = os.path.join(DUMMY_SNAP_DIR, 'queens', 'noha')
+ self.assertEqual(d.snap_cache_dir, snap_dir)
+ mock_pull_snap.assert_called()
+ mock_deploy_snap.assert_called()
+ self.assertEqual(d.ha_ext, 'noha')
+
+ @patch('apex.deployment.snapshot.SnapshotDeployment.pull_snapshot')
+ @patch('apex.deployment.snapshot.libvirt.open')
+ @patch('apex.deployment.snapshot.SnapshotDeployment.deploy_snapshot')
+ def test_init_allinone_no_fetch(self, mock_deploy_snap, mock_libvirt_open,
+ mock_pull_snap):
+
+ ds_file = os.path.join(TEST_DUMMY_CONFIG, 'dummy-deploy-settings.yaml')
+ ds = DeploySettings(ds_file)
+ d = SnapshotDeployment(deploy_settings=ds,
+ snap_cache_dir=DUMMY_SNAP_DIR,
+ fetch=False, all_in_one=True)
+ snap_dir = os.path.join(DUMMY_SNAP_DIR, 'queens', 'noha-allinone')
+ self.assertEqual(d.snap_cache_dir, snap_dir)
+ mock_pull_snap.assert_not_called()
+ mock_deploy_snap.assert_called()
+ self.assertEqual(d.ha_ext, 'noha-allinone')
+
+ @patch('apex.deployment.snapshot.utils.fetch_upstream_and_unpack')
+ @patch('apex.deployment.snapshot.utils.fetch_properties')
+ def test_pull_snapshot_is_latest(self, mock_fetch_props,
+ mock_fetch_artifact):
+ mock_fetch_props.return_value = {
+ 'OPNFV_SNAP_URL': 'artifacts.opnfv.org/apex/master/noha/'
+ 'apex-csit-snap-2018-08-05.tar.gz',
+ 'OPNFV_SNAP_SHA512SUM': 'bb0c6fa0e675dcb39cfad11d81bb99f309d5cfc23'
+ '6e36a74d05ee813584f3e5bb92aa23dec77584631'
+ '7b75d574f8c86186c666f78a299c24fb68849897b'
+ 'dd4bc'
+ }
+ SnapshotDeployment.pull_snapshot('http://dummy_url',
+ TEST_DUMMY_CONFIG)
+ mock_fetch_artifact.assert_not_called()
+
+ @patch('apex.deployment.snapshot.utils.fetch_upstream_and_unpack')
+ @patch('apex.deployment.snapshot.utils.fetch_properties')
+ def test_pull_snapshot_fetch_props_failure(self, mock_fetch_props,
+ mock_fetch_artifact):
+ mock_fetch_props.side_effect = exc.FetchException
+ self.assertRaises(exc.FetchException,
+ SnapshotDeployment.pull_snapshot,
+ 'http://dummy_url', TEST_DUMMY_CONFIG)
+
+ @patch('apex.deployment.snapshot.utils.fetch_upstream_and_unpack')
+ @patch('apex.deployment.snapshot.utils.fetch_properties')
+ def test_pull_snapshot_is_not_latest(self, mock_fetch_props,
+ mock_fetch_artifact):
+ mock_fetch_props.side_effect = [{
+ 'OPNFV_SNAP_URL': 'artifacts.opnfv.org/apex/master/noha/'
+ 'apex-csit-snap-2018-08-05.tar.gz',
+ 'OPNFV_SNAP_SHA512SUM': '123c6fa0e675dcb39cfad11d81bb99f309d5cfc23'
+ '6e36a74d05ee813584f3e5bb92aa23dec77584631'
+ '7b75d574f8c86186c666f78a299c24fb68849897b'
+ 'dd4bc'},
+ {
+ 'OPNFV_SNAP_URL': 'artifacts.opnfv.org/apex/master/noha/'
+ 'apex-csit-snap-2018-08-05.tar.gz',
+ 'OPNFV_SNAP_SHA512SUM': 'bb0c6fa0e675dcb39cfad11d81bb99f309d5cfc23'
+ '6e36a74d05ee813584f3e5bb92aa23dec77584631'
+ '7b75d574f8c86186c666f78a299c24fb68849897b'
+ 'dd4bc'}]
+ SnapshotDeployment.pull_snapshot('http://dummy_url',
+ TEST_DUMMY_CONFIG)
+ mock_fetch_artifact.assert_called()
+
+ @patch('apex.deployment.snapshot.OvercloudNode')
+ @patch('apex.deployment.snapshot.SnapshotDeployment.pull_snapshot')
+ @patch('apex.deployment.snapshot.libvirt.open')
+ @patch('apex.deployment.snapshot.SnapshotDeployment.deploy_snapshot')
+ def test_create_networks(self, mock_deploy_snap, mock_libvirt_open,
+ mock_pull_snap, mock_oc_node):
+ ds_file = os.path.join(TEST_DUMMY_CONFIG, 'dummy-deploy-settings.yaml')
+ ds = DeploySettings(ds_file)
+ d = SnapshotDeployment(deploy_settings=ds,
+ snap_cache_dir=DUMMY_SNAP_DIR,
+ fetch=False, all_in_one=False)
+ d.snap_cache_dir = TEST_DUMMY_CONFIG
+ conn = mock_libvirt_open('qemu:///system')
+ d.create_networks()
+ conn.networkCreateXML.assert_called()
+
+ @patch('apex.deployment.snapshot.OvercloudNode')
+ @patch('apex.deployment.snapshot.SnapshotDeployment.pull_snapshot')
+ @patch('apex.deployment.snapshot.libvirt.open')
+ @patch('apex.deployment.snapshot.SnapshotDeployment.deploy_snapshot')
+ def test_create_networks_invalid_cache(self, mock_deploy_snap,
+ mock_libvirt_open, mock_pull_snap,
+ mock_oc_node):
+ ds_file = os.path.join(TEST_DUMMY_CONFIG, 'dummy-deploy-settings.yaml')
+ ds = DeploySettings(ds_file)
+ d = SnapshotDeployment(deploy_settings=ds,
+ snap_cache_dir=DUMMY_SNAP_DIR,
+ fetch=False, all_in_one=False)
+ d.snap_cache_dir = '/doesnotexist/'
+ self.assertRaises(exc.SnapshotDeployException, d.create_networks)
+
+ @patch('apex.deployment.snapshot.fnmatch')
+ @patch('apex.deployment.snapshot.OvercloudNode')
+ @patch('apex.deployment.snapshot.SnapshotDeployment.pull_snapshot')
+ @patch('apex.deployment.snapshot.libvirt.open')
+ @patch('apex.deployment.snapshot.SnapshotDeployment.deploy_snapshot')
+ def test_create_networks_no_net_xmls(self, mock_deploy_snap,
+ mock_libvirt_open, mock_pull_snap,
+ mock_oc_node, mock_fnmatch):
+ ds_file = os.path.join(TEST_DUMMY_CONFIG, 'dummy-deploy-settings.yaml')
+ ds = DeploySettings(ds_file)
+ d = SnapshotDeployment(deploy_settings=ds,
+ snap_cache_dir=DUMMY_SNAP_DIR,
+ fetch=False, all_in_one=False)
+ d.snap_cache_dir = '/doesnotexist/'
+ mock_fnmatch.filter.return_value = []
+ self.assertRaises(exc.SnapshotDeployException, d.create_networks)
+
+ @patch('apex.deployment.snapshot.OvercloudNode')
+ @patch('apex.deployment.snapshot.SnapshotDeployment.pull_snapshot')
+ @patch('apex.deployment.snapshot.libvirt.open')
+ @patch('apex.deployment.snapshot.SnapshotDeployment.deploy_snapshot')
+ def test_parse_and_create_nodes(self, mock_deploy_snap, mock_libvirt_open,
+ mock_pull_snap, mock_oc_node):
+ ds_file = os.path.join(TEST_DUMMY_CONFIG, 'dummy-deploy-settings.yaml')
+ ds = DeploySettings(ds_file)
+ d = SnapshotDeployment(deploy_settings=ds,
+ snap_cache_dir=DUMMY_SNAP_DIR,
+ fetch=False, all_in_one=False)
+ d.snap_cache_dir = TEST_DUMMY_CONFIG
+ node = mock_oc_node()
+ d.parse_and_create_nodes()
+ node.start.assert_called()
+ self.assertListEqual([node], d.oc_nodes)
+
+ @patch('apex.deployment.snapshot.utils.parse_yaml')
+ @patch('apex.deployment.snapshot.OvercloudNode')
+ @patch('apex.deployment.snapshot.SnapshotDeployment.pull_snapshot')
+ @patch('apex.deployment.snapshot.libvirt.open')
+ @patch('apex.deployment.snapshot.SnapshotDeployment.deploy_snapshot')
+ def test_parse_and_create_nodes_invalid_node_yaml(
+ self, mock_deploy_snap, mock_libvirt_open, mock_pull_snap,
+ mock_oc_node, mock_parse_yaml):
+ ds_file = os.path.join(TEST_DUMMY_CONFIG, 'dummy-deploy-settings.yaml')
+ ds = DeploySettings(ds_file)
+ d = SnapshotDeployment(deploy_settings=ds,
+ snap_cache_dir=DUMMY_SNAP_DIR,
+ fetch=False, all_in_one=False)
+ d.snap_cache_dir = TEST_DUMMY_CONFIG
+ node = mock_oc_node()
+ mock_parse_yaml.return_value = {'blah': 'dummy'}
+ self.assertRaises(exc.SnapshotDeployException,
+ d.parse_and_create_nodes)
+ node.start.assert_not_called()
+
+ @patch('apex.deployment.snapshot.OvercloudNode')
+ @patch('apex.deployment.snapshot.SnapshotDeployment.pull_snapshot')
+ @patch('apex.deployment.snapshot.libvirt.open')
+ @patch('apex.deployment.snapshot.SnapshotDeployment.deploy_snapshot')
+ def test_get_controllers(self, mock_deploy_snap, mock_libvirt_open,
+ mock_pull_snap, mock_oc_node):
+ ds_file = os.path.join(TEST_DUMMY_CONFIG, 'dummy-deploy-settings.yaml')
+ ds = DeploySettings(ds_file)
+ d = SnapshotDeployment(deploy_settings=ds,
+ snap_cache_dir=DUMMY_SNAP_DIR,
+ fetch=False, all_in_one=False)
+ d.snap_cache_dir = TEST_DUMMY_CONFIG
+ node = mock_oc_node()
+ node.role = 'controller'
+ d.oc_nodes = [node]
+ self.assertListEqual(d.get_controllers(), [node])
+
+ @patch('apex.deployment.snapshot.OvercloudNode')
+ @patch('apex.deployment.snapshot.SnapshotDeployment.pull_snapshot')
+ @patch('apex.deployment.snapshot.libvirt.open')
+ @patch('apex.deployment.snapshot.SnapshotDeployment.deploy_snapshot')
+ def test_get_controllers_none(self, mock_deploy_snap, mock_libvirt_open,
+ mock_pull_snap, mock_oc_node):
+ ds_file = os.path.join(TEST_DUMMY_CONFIG, 'dummy-deploy-settings.yaml')
+ ds = DeploySettings(ds_file)
+ d = SnapshotDeployment(deploy_settings=ds,
+ snap_cache_dir=DUMMY_SNAP_DIR,
+ fetch=False, all_in_one=False)
+ d.snap_cache_dir = TEST_DUMMY_CONFIG
+ node = mock_oc_node()
+ node.role = 'compute'
+ d.oc_nodes = [node]
+ self.assertListEqual(d.get_controllers(), [])
+
+ @patch('apex.deployment.snapshot.SnapshotDeployment.get_controllers')
+ @patch('apex.deployment.snapshot.time')
+ @patch('apex.deployment.snapshot.socket')
+ @patch('apex.deployment.snapshot.OvercloudNode')
+ @patch('apex.deployment.snapshot.SnapshotDeployment.pull_snapshot')
+ @patch('apex.deployment.snapshot.libvirt.open')
+ @patch('apex.deployment.snapshot.SnapshotDeployment.deploy_snapshot')
+ def test_is_openstack_up(self, mock_deploy_snap, mock_libvirt_open,
+ mock_pull_snap, mock_oc_node, mock_socket,
+ mock_time, mock_get_ctrls):
+ ds_file = os.path.join(TEST_DUMMY_CONFIG, 'dummy-deploy-settings.yaml')
+ ds = DeploySettings(ds_file)
+ d = SnapshotDeployment(deploy_settings=ds,
+ snap_cache_dir=DUMMY_SNAP_DIR,
+ fetch=False, all_in_one=False)
+ d.snap_cache_dir = TEST_DUMMY_CONFIG
+ node = mock_oc_node()
+ node.ip = '123.123.123.123'
+ node.name = 'dummy-controller-0'
+ mock_get_ctrls.return_value = [node]
+ sock = mock_socket.socket(mock_socket.AF_INET, mock_socket.SOCK_STREAM)
+ sock.connect_ex.return_value = 0
+ self.assertTrue(d.is_service_up('openstack'))
+
+ @patch('apex.deployment.snapshot.SnapshotDeployment.get_controllers')
+ @patch('apex.deployment.snapshot.time')
+ @patch('apex.deployment.snapshot.socket')
+ @patch('apex.deployment.snapshot.OvercloudNode')
+ @patch('apex.deployment.snapshot.SnapshotDeployment.pull_snapshot')
+ @patch('apex.deployment.snapshot.libvirt.open')
+ @patch('apex.deployment.snapshot.SnapshotDeployment.deploy_snapshot')
+ def test_is_openstack_up_false(self, mock_deploy_snap, mock_libvirt_open,
+ mock_pull_snap, mock_oc_node, mock_socket,
+ mock_time, mock_get_ctrls):
+ ds_file = os.path.join(TEST_DUMMY_CONFIG, 'dummy-deploy-settings.yaml')
+ ds = DeploySettings(ds_file)
+ d = SnapshotDeployment(deploy_settings=ds,
+ snap_cache_dir=DUMMY_SNAP_DIR,
+ fetch=False, all_in_one=False)
+ d.snap_cache_dir = TEST_DUMMY_CONFIG
+ node = mock_oc_node()
+ node.ip = '123.123.123.123'
+ node.name = 'dummy-controller-0'
+ mock_get_ctrls.return_value = [node]
+ sock = mock_socket.socket(mock_socket.AF_INET, mock_socket.SOCK_STREAM)
+ sock.connect_ex.return_value = 1
+ self.assertFalse(d.is_service_up('openstack'))
+
+ @patch('apex.deployment.snapshot.SnapshotDeployment.get_controllers')
+ @patch('apex.deployment.snapshot.time')
+ @patch('apex.deployment.snapshot.utils')
+ @patch('apex.deployment.snapshot.OvercloudNode')
+ @patch('apex.deployment.snapshot.SnapshotDeployment.pull_snapshot')
+ @patch('apex.deployment.snapshot.libvirt.open')
+ @patch('apex.deployment.snapshot.SnapshotDeployment.deploy_snapshot')
+ def test_is_opendaylight_up(self, mock_deploy_snap, mock_libvirt_open,
+ mock_pull_snap, mock_oc_node, mock_utils,
+ mock_time, mock_get_ctrls):
+ ds_file = os.path.join(TEST_DUMMY_CONFIG, 'dummy-deploy-settings.yaml')
+ ds = DeploySettings(ds_file)
+ d = SnapshotDeployment(deploy_settings=ds,
+ snap_cache_dir=DUMMY_SNAP_DIR,
+ fetch=False, all_in_one=False)
+ d.snap_cache_dir = TEST_DUMMY_CONFIG
+ node = mock_oc_node()
+ node.ip = '123.123.123.123'
+ node.name = 'dummy-controller-0'
+ mock_get_ctrls.return_value = [node]
+ mock_utils.open_webpage.return_value = 0
+ self.assertTrue(d.is_service_up('opendaylight'))
+
+ @patch('apex.deployment.snapshot.SnapshotDeployment.get_controllers')
+ @patch('apex.deployment.snapshot.time')
+ @patch('apex.deployment.snapshot.utils')
+ @patch('apex.deployment.snapshot.OvercloudNode')
+ @patch('apex.deployment.snapshot.SnapshotDeployment.pull_snapshot')
+ @patch('apex.deployment.snapshot.libvirt.open')
+ @patch('apex.deployment.snapshot.SnapshotDeployment.deploy_snapshot')
+ def test_is_opendaylight_up_false(self, mock_deploy_snap,
+ mock_libvirt_open, mock_pull_snap,
+ mock_oc_node, mock_utils,
+ mock_time, mock_get_ctrls):
+ ds_file = os.path.join(TEST_DUMMY_CONFIG, 'dummy-deploy-settings.yaml')
+ ds = DeploySettings(ds_file)
+ d = SnapshotDeployment(deploy_settings=ds,
+ snap_cache_dir=DUMMY_SNAP_DIR,
+ fetch=False, all_in_one=False)
+ d.snap_cache_dir = TEST_DUMMY_CONFIG
+ node = mock_oc_node()
+ node.ip = '123.123.123.123'
+ node.name = 'dummy-controller-0'
+ mock_get_ctrls.return_value = [node]
+ mock_utils.open_webpage.side_effect = urllib.request.URLError(
+ reason='blah')
+ self.assertFalse(d.is_service_up('opendaylight'))
+
+ @patch('apex.deployment.snapshot.os.path.isfile')
+ @patch('apex.deployment.snapshot.SnapshotDeployment.is_service_up')
+ @patch('apex.deployment.snapshot.SnapshotDeployment'
+ '.parse_and_create_nodes')
+ @patch('apex.deployment.snapshot.SnapshotDeployment.pull_snapshot')
+ @patch('apex.deployment.snapshot.libvirt.open')
+ @patch('apex.deployment.snapshot.SnapshotDeployment.create_networks')
+ def test_deploy_snapshot(self, mock_create_networks, mock_libvirt_open,
+ mock_pull_snap, mock_parse_create,
+ mock_service_up, mock_is_file):
+ mock_is_file.return_value = True
+ ds_file = os.path.join(TEST_DUMMY_CONFIG, 'dummy-deploy-settings.yaml')
+ ds = DeploySettings(ds_file)
+ SnapshotDeployment(deploy_settings=ds, snap_cache_dir=DUMMY_SNAP_DIR,
+ fetch=False, all_in_one=False)
+ mock_parse_create.assert_called()
+ mock_create_networks.assert_called()
+ mock_service_up.assert_called()
+
+ @patch('apex.deployment.snapshot.os.path.isfile')
+ @patch('apex.deployment.snapshot.SnapshotDeployment.is_service_up')
+ @patch('apex.deployment.snapshot.SnapshotDeployment'
+ '.parse_and_create_nodes')
+ @patch('apex.deployment.snapshot.SnapshotDeployment.pull_snapshot')
+ @patch('apex.deployment.snapshot.libvirt.open')
+ @patch('apex.deployment.snapshot.SnapshotDeployment.create_networks')
+ def test_deploy_snapshot_services_down(self, mock_create_networks,
+ mock_libvirt_open,
+ mock_pull_snap, mock_parse_create,
+ mock_service_up, mock_is_file):
+ mock_is_file.return_value = True
+ ds_file = os.path.join(TEST_DUMMY_CONFIG, 'dummy-deploy-settings.yaml')
+ ds = DeploySettings(ds_file)
+ mock_service_up.return_value = False
+ self.assertRaises(exc.SnapshotDeployException,
+ SnapshotDeployment,
+ ds, DUMMY_SNAP_DIR, False, False)
+
+ mock_service_up.side_effect = [True, False]
+ self.assertRaises(exc.SnapshotDeployException,
+ SnapshotDeployment,
+ ds, DUMMY_SNAP_DIR, False, False)
diff --git a/apex/tests/test_apex_deployment_tripleo.py b/apex/tests/test_apex_deployment_tripleo.py
new file mode 100644
index 0000000..912fe10
--- /dev/null
+++ b/apex/tests/test_apex_deployment_tripleo.py
@@ -0,0 +1,49 @@
+##############################################################################
+# Copyright (c) 2018 Tim Rozet (trozet@redhat.com) (Red Hat)
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+import os
+import unittest
+
+from apex.deployment.tripleo import ApexDeployment
+from apex.settings.deploy_settings import DeploySettings
+from apex.tests.constants import TEST_DUMMY_CONFIG
+
+
+class TestApexDeployment(unittest.TestCase):
+ @classmethod
+ def setup_class(cls):
+ """This method is run once for each class before any tests are run"""
+
+ @classmethod
+ def teardown_class(cls):
+ """This method is run once for each class _after_ all tests are run"""
+
+ def setup(self):
+ """This method is run once before _each_ test method is executed"""
+
+ def teardown(self):
+ """This method is run once after _each_ test method is executed"""
+
+ def test_determine_patches(self):
+ self.maxDiff = None
+ ds_file = os.path.join(TEST_DUMMY_CONFIG, 'dummy-deploy-settings.yaml')
+ ds = DeploySettings(ds_file)
+ patches_file = os.path.join(TEST_DUMMY_CONFIG, 'common-patches.yaml')
+ d = ApexDeployment(deploy_settings=ds, patch_file=patches_file,
+ ds_file=ds_file)
+ patches = d.determine_patches()
+ test_patches = {
+ 'undercloud':
+ [{'change-id': 'I2e0a40d7902f592e4b7bd727f57048111e0bea36',
+ 'project': 'openstack/tripleo-common'}],
+ 'overcloud':
+ [{'change-id': 'Ie988ba6a2d444a614e97c0edf5fce24b23970310',
+ 'project': 'openstack/puppet-tripleo'}]
+ }
+ self.assertDictEqual(patches, test_patches)
diff --git a/apex/tests/test_apex_inventory.py b/apex/tests/test_apex_inventory.py
index 7197946..38a4271 100644
--- a/apex/tests/test_apex_inventory.py
+++ b/apex/tests/test_apex_inventory.py
@@ -56,10 +56,15 @@ class TestInventory:
os.path.join(TEST_DUMMY_CONFIG, 'inventory-virt.yaml'),
virtual=True, ha=True)
+ def test_inventory_valid_allinone_count(self):
+ i = Inventory(os.path.join(TEST_DUMMY_CONFIG,
+ 'inventory-virt-1-node.yaml'), ha=False)
+ assert_equal(list(i.get_node_counts()), [1, 0])
+
def test_inventory_invalid_noha_count(self):
assert_raises(ApexInventoryException, Inventory,
os.path.join(TEST_DUMMY_CONFIG,
- 'inventory-virt-1-node.yaml'),
+ 'inventory-virt-1-compute-node.yaml'),
virtual=True, ha=False)
def test_inventory_virtual(self):
diff --git a/apex/tests/test_apex_network_environment.py b/apex/tests/test_apex_network_environment.py
index 79a72a5..7aa6ef1 100644
--- a/apex/tests/test_apex_network_environment.py
+++ b/apex/tests/test_apex_network_environment.py
@@ -165,3 +165,10 @@ class TestNetworkEnvironment:
e = NetworkEnvException("test")
print(e)
assert_is_instance(e, NetworkEnvException)
+
+ def test_service_netmap(self):
+ ns = copy(self.ns)
+ ns.enabled_network_list = ['admin']
+ ne = NetworkEnvironment(ns, os.path.join(TEST_BUILD_DIR, NET_ENV_FILE))
+ for network in ne['parameter_defaults']['ServiceNetMap'].values():
+ assert_equal(network, 'ctlplane')
diff --git a/apex/tests/test_apex_network_settings.py b/apex/tests/test_apex_network_settings.py
index 5e2fa07..764c9ef 100644
--- a/apex/tests/test_apex_network_settings.py
+++ b/apex/tests/test_apex_network_settings.py
@@ -112,6 +112,9 @@ class TestNetworkSettings:
# remove vlan from storage net
storage_net_nicmap['compute'].pop('vlan', None)
assert_is_instance(NetworkSettings(ns), NetworkSettings)
+ for role in ('compute', 'controller'):
+ assert_equal(ns['networks'][ADMIN_NETWORK]['nic_mapping'][
+ role]['vlan'], 'native')
# TODO
# need to manipulate interfaces some how
diff --git a/apex/tests/test_apex_overcloud_builder.py b/apex/tests/test_apex_overcloud_builder.py
index e9a6e6c..8bed3d7 100644
--- a/apex/tests/test_apex_overcloud_builder.py
+++ b/apex/tests/test_apex_overcloud_builder.py
@@ -11,7 +11,9 @@ import unittest
from apex.builders import overcloud_builder as oc_builder
from apex.common import constants as con
-from mock import patch
+from mock import patch, mock_open
+
+a_mock_open = mock_open(read_data=None)
class TestOvercloudBuilder(unittest.TestCase):
@@ -37,14 +39,71 @@ class TestOvercloudBuilder(unittest.TestCase):
mock_git_archive.return_value = '/dummytmp/puppet-opendaylight.tar'
archive = '/dummytmp/puppet-opendaylight.tar'
test_virt_ops = [
- {con.VIRT_INSTALL: 'opendaylight'},
{con.VIRT_UPLOAD: "{}:/etc/puppet/modules/".format(archive)},
{con.VIRT_RUN_CMD: 'rm -rf /etc/puppet/modules/opendaylight'},
{con.VIRT_RUN_CMD: "cd /etc/puppet/modules/ && tar xvf "
- "puppet-opendaylight.tar"}
+ "puppet-opendaylight.tar"},
+ {con.VIRT_INSTALL: "java-1.8.0-openjdk"},
+ {con.VIRT_INSTALL: 'opendaylight'}
]
oc_builder.inject_opendaylight(con.DEFAULT_ODL_VERSION, 'dummy.qcow2',
- '/dummytmp/')
+ '/dummytmp/', uc_ip='192.0.2.2',
+ os_version=con.DEFAULT_OS_VERSION)
+ assert mock_git_archive.called
+ assert mock_add_repo.called
+ mock_customize.assert_called_once_with(test_virt_ops, 'dummy.qcow2')
+
+ @patch('apex.builders.overcloud_builder.build_dockerfile')
+ @patch('apex.builders.common_builder.create_git_archive')
+ @patch('apex.builders.common_builder.add_repo')
+ @patch('apex.virtual.utils.virt_customize')
+ def test_inject_opendaylight_docker(self, mock_customize, mock_add_repo,
+ mock_git_archive, mock_build_docker):
+ mock_git_archive.return_value = '/dummytmp/puppet-opendaylight.tar'
+ archive = '/dummytmp/puppet-opendaylight.tar'
+ test_virt_ops = [
+ {con.VIRT_UPLOAD: "{}:/etc/puppet/modules/".format(archive)},
+ {con.VIRT_RUN_CMD: 'rm -rf /etc/puppet/modules/opendaylight'},
+ {con.VIRT_RUN_CMD: "cd /etc/puppet/modules/ && tar xvf "
+ "puppet-opendaylight.tar"},
+ {con.VIRT_INSTALL: "java-1.8.0-openjdk"},
+ ]
+ oc_builder.inject_opendaylight('oxygen', 'dummy.qcow2',
+ '/dummytmp/', uc_ip='192.0.2.2',
+ os_version=con.DEFAULT_OS_VERSION,
+ docker_tag='latest')
+ odl_url = "https://nexus.opendaylight.org/content/repositories" \
+ "/opendaylight-oxygen-epel-7-x86_64-devel/"
+ docker_cmds = [
+ "RUN yum remove opendaylight -y",
+ "RUN echo $'[opendaylight]\\n\\",
+ "baseurl={}\\n\\".format(odl_url),
+ "gpgcheck=0\\n\\",
+ "enabled=1' > /etc/yum.repos.d/opendaylight.repo",
+ "RUN yum -y install opendaylight"
+ ]
+ src_img_uri = "192.0.2.1:8787/nova-api/centos-binary-master:latest"
assert mock_git_archive.called
assert mock_add_repo.called
+ assert mock_build_docker.called_once_with(
+ 'opendaylight', '/dummytmp', docker_cmds, src_img_uri
+ )
mock_customize.assert_called_once_with(test_virt_ops, 'dummy.qcow2')
+
+ @patch('builtins.open', a_mock_open)
+ @patch('os.makedirs')
+ @patch('os.path.isfile')
+ @patch('os.path.isdir')
+ def test_build_dockerfile(self, mock_isdir, mock_isfile, mock_makedirs):
+ src_img_uri = "192.0.2.1:8787/nova-api/centos-binary-master:latest"
+ oc_builder.build_dockerfile('nova-api', '/tmpdummy/', ['RUN dummy'],
+ src_img_uri)
+ a_mock_open.assert_called_with(
+ '/tmpdummy/containers/nova-api/Dockerfile', 'a+')
+ a_mock_open().write.assert_called_once_with('RUN dummy')
+
+ @patch('tarfile.open')
+ @patch('os.path.isdir')
+ def test_archive_docker_patches(self, mock_isdir, mock_tarfile):
+ oc_builder.archive_docker_patches('/tmpdummy/')
+ assert mock_tarfile.assert_called
diff --git a/apex/tests/test_apex_overcloud_deploy.py b/apex/tests/test_apex_overcloud_deploy.py
index 59e9048..79dbf54 100644
--- a/apex/tests/test_apex_overcloud_deploy.py
+++ b/apex/tests/test_apex_overcloud_deploy.py
@@ -7,6 +7,8 @@
# http://www.apache.org/licenses/LICENSE-2.0
##############################################################################
+import mock
+import os
import sys
import unittest
@@ -24,8 +26,11 @@ from apex.overcloud.deploy import make_ssh_key
from apex.overcloud.deploy import prep_env
from apex.overcloud.deploy import generate_ceph_key
from apex.overcloud.deploy import prep_storage_env
+from apex.overcloud.deploy import prep_sriov_env
from apex.overcloud.deploy import external_network_cmds
from apex.overcloud.deploy import create_congress_cmds
+from apex.overcloud.deploy import SDN_FILE_MAP
+from apex.overcloud.deploy import get_docker_sdn_files
from nose.tools import (
assert_regexp_matches,
@@ -70,19 +75,41 @@ class TestOvercloudDeploy(unittest.TestCase):
res = '/usr/share/openstack-tripleo-heat-templates/environments/test'
assert_equal(build_sdn_env_list(ds, sdn_map), [res])
+ def test_build_sdn_env_list_with_string(self):
+ ds = {'sdn_controller': 'opendaylight',
+ 'sriov': 'xxx'}
+ prefix = '/usr/share/openstack-tripleo-heat-templates/environments'
+ res = [os.path.join(prefix, 'neutron-opendaylight.yaml'),
+ os.path.join(prefix, 'neutron-opendaylight-sriov.yaml')]
+ assert_equal(build_sdn_env_list(ds, SDN_FILE_MAP), res)
+
+ def test_build_sdn_env_list_with_default(self):
+ ds = {'sdn_controller': 'opendaylight',
+ 'vpn': True}
+ prefix = '/usr/share/openstack-tripleo-heat-templates/environments'
+ res = [os.path.join(prefix, 'neutron-opendaylight.yaml'),
+ os.path.join(prefix, 'neutron-bgpvpn-opendaylight.yaml')]
+ assert_equal(build_sdn_env_list(ds, SDN_FILE_MAP), res)
+
+ @patch('apex.overcloud.deploy.prep_sriov_env')
@patch('apex.overcloud.deploy.prep_storage_env')
@patch('apex.overcloud.deploy.build_sdn_env_list')
@patch('builtins.open', mock_open())
- def test_create_deploy_cmd(self, mock_sdn_list, mock_prep_storage):
+ def test_create_deploy_cmd(self, mock_sdn_list, mock_prep_storage,
+ mock_prep_sriov):
mock_sdn_list.return_value = []
- ds = {'deploy_options': MagicMock(),
+ ds = {'deploy_options':
+ {'ha_enabled': True,
+ 'congress': True,
+ 'tacker': True,
+ 'containers': False,
+ 'barometer': True,
+ 'ceph': False,
+ 'sriov': False,
+ 'vim': 'openstack'
+ },
'global_params': MagicMock()}
- ds['global_params'].__getitem__.side_effect = \
- lambda i: True if i == 'ha_enabled' else MagicMock()
- ds['deploy_options'].__getitem__.side_effect = \
- lambda i: True if i == 'congress' else MagicMock()
- ds['deploy_options'].__contains__.side_effect = \
- lambda i: True if i == 'congress' else MagicMock()
+
ns = {'ntp': ['ntp']}
inv = MagicMock()
inv.get_node_counts.return_value = (3, 2)
@@ -96,16 +123,63 @@ class TestOvercloudDeploy(unittest.TestCase):
assert_in('--control-scale 3', result_cmd)
assert_in('--compute-scale 2', result_cmd)
+ @patch('apex.overcloud.deploy.prep_sriov_env')
+ @patch('apex.overcloud.deploy.prep_storage_env')
+ @patch('builtins.open', mock_open())
+ def test_create_deploy_cmd_containers_sdn(self, mock_prep_storage,
+ mock_prep_sriov):
+ ds = {'deploy_options':
+ {'ha_enabled': True,
+ 'congress': False,
+ 'tacker': False,
+ 'containers': True,
+ 'barometer': False,
+ 'vpn': False,
+ 'ceph': True,
+ 'sdn_controller': 'opendaylight',
+ 'sriov': False,
+ 'os_version': 'queens',
+ 'vim': 'openstack'
+ },
+ 'global_params': MagicMock()}
+
+ ns = {'ntp': ['ntp']}
+ inv = MagicMock()
+ inv.get_node_counts.return_value = (3, 2)
+ virt = True
+ result_cmd = create_deploy_cmd(ds, ns, inv, '/tmp', virt)
+ assert_in('--ntp-server ntp', result_cmd)
+ assert_not_in('enable_tacker.yaml', result_cmd)
+ assert_not_in('enable_congress.yaml', result_cmd)
+ assert_not_in('enable_barometer.yaml', result_cmd)
+ assert_in('virtual-environment.yaml', result_cmd)
+ assert_in('--control-scale 3', result_cmd)
+ assert_in('--compute-scale 2', result_cmd)
+ assert_in('docker-images.yaml', result_cmd)
+ assert_in('/usr/share/openstack-tripleo-heat-templates/environments'
+ '/docker.yaml', result_cmd)
+ assert_in('/usr/share/openstack-tripleo-heat-templates/environments/'
+ 'storage-environment.yaml', result_cmd)
+ assert_in('/usr/share/openstack-tripleo-heat-templates/environments'
+ '/services/neutron-opendaylight.yaml', result_cmd)
+ ds['deploy_options']['os_version'] = 'master'
+ result_cmd = create_deploy_cmd(ds, ns, inv, '/tmp', virt)
+ assert_in('/usr/share/openstack-tripleo-heat-templates/environments'
+ '/services/neutron-opendaylight.yaml', result_cmd)
+
+ @patch('apex.overcloud.deploy.prep_sriov_env')
@patch('apex.overcloud.deploy.prep_storage_env')
@patch('apex.overcloud.deploy.build_sdn_env_list')
@patch('builtins.open', mock_open())
def test_create_deploy_cmd_no_ha_bm(self, mock_sdn_list,
- mock_prep_storage):
+ mock_prep_storage, mock_prep_sriov):
mock_sdn_list.return_value = []
ds = {'deploy_options': MagicMock(),
'global_params': MagicMock()}
ds['global_params'].__getitem__.side_effect = \
lambda i: False if i == 'ha_enabled' else MagicMock()
+ ds['deploy_options'].__getitem__.side_effect = \
+ lambda i: 'master' if i == 'os_version' else MagicMock()
ns = {'ntp': ['ntp']}
inv = MagicMock()
inv.get_node_counts.return_value = (3, 2)
@@ -119,57 +193,61 @@ class TestOvercloudDeploy(unittest.TestCase):
assert_not_in('enable_congress.yaml', result_cmd)
assert_not_in('enable_barometer.yaml', result_cmd)
- @patch('apex.overcloud.deploy.prep_storage_env')
- @patch('apex.overcloud.deploy.build_sdn_env_list')
- def test_create_deploy_cmd_raises(self, mock_sdn_list, mock_prep_storage):
- mock_sdn_list.return_value = []
- ds = {'deploy_options': MagicMock(),
- 'global_params': MagicMock()}
- ns = {}
- inv = MagicMock()
- inv.get_node_counts.return_value = (0, 0)
- virt = False
- assert_raises(ApexDeployException, create_deploy_cmd,
- ds, ns, inv, '/tmp', virt)
-
+ @patch('apex.builders.overcloud_builder.inject_opendaylight')
@patch('apex.overcloud.deploy.virt_utils')
@patch('apex.overcloud.deploy.shutil')
- @patch('apex.overcloud.deploy.os.path')
+ @patch('apex.overcloud.deploy.os.path.isfile')
@patch('builtins.open', mock_open())
- def test_prep_image(self, mock_os_path, mock_shutil, mock_virt_utils):
+ def test_prep_image(self, mock_is_file, mock_shutil, mock_virt_utils,
+ mock_inject_odl):
+ mock_is_file.return_value = True
ds_opts = {'dataplane': 'fdio',
'sdn_controller': 'opendaylight',
- 'odl_version': 'master'}
+ 'odl_version': 'master',
+ 'vpn': False,
+ 'sriov': False}
ds = {'deploy_options': MagicMock(),
'global_params': MagicMock()}
ds['deploy_options'].__getitem__.side_effect = \
lambda i: ds_opts.get(i, MagicMock())
- prep_image(ds, 'undercloud.qcow2', '/tmp', root_pw='test')
+ ns = MagicMock()
+ prep_image(ds, ns, 'undercloud.qcow2', '/tmp', root_pw='test')
mock_virt_utils.virt_customize.assert_called()
+ mock_inject_odl.assert_called()
@patch('apex.overcloud.deploy.virt_utils')
@patch('apex.overcloud.deploy.shutil')
- @patch('apex.overcloud.deploy.os.path')
+ @patch('apex.overcloud.deploy.os.path.isfile')
@patch('builtins.open', mock_open())
- def test_prep_image_sdn_false(self, mock_os_path, mock_shutil,
+ def test_prep_image_sdn_false(self, mock_is_file, mock_shutil,
mock_virt_utils):
+ mock_is_file.return_value = True
ds_opts = {'dataplane': 'fdio',
+ 'vpn': False,
'sdn_controller': False}
ds = {'deploy_options': MagicMock(),
'global_params': MagicMock()}
ds['deploy_options'].__getitem__.side_effect = \
lambda i: ds_opts.get(i, MagicMock())
- prep_image(ds, 'undercloud.qcow2', '/tmp', root_pw='test')
+ ns = MagicMock()
+ prep_image(ds, ns, 'undercloud.qcow2', '/tmp', root_pw='test')
mock_virt_utils.virt_customize.assert_called()
+ @patch('apex.builders.overcloud_builder.inject_ovs_nsh')
+ @patch('apex.overcloud.deploy.utils.fetch_upstream_and_unpack')
+ @patch('apex.builders.overcloud_builder.inject_opendaylight')
@patch('apex.overcloud.deploy.virt_utils')
@patch('apex.overcloud.deploy.shutil')
- @patch('apex.overcloud.deploy.os.path')
+ @patch('apex.overcloud.deploy.os.path.isfile')
@patch('builtins.open', mock_open())
- def test_prep_image_sdn_odl(self, mock_os_path, mock_shutil,
- mock_virt_utils):
+ def test_prep_image_sdn_odl(self, mock_is_file, mock_shutil,
+ mock_virt_utils, mock_inject_odl,
+ mock_fetch, mock_ovs_nsh):
+ mock_is_file.return_value = True
ds_opts = {'dataplane': 'ovs',
'sdn_controller': 'opendaylight',
+ 'vpn': False,
+ 'sfc': False,
'odl_version': con.DEFAULT_ODL_VERSION,
'odl_vpp_netvirt': True}
ds = {'deploy_options': MagicMock(),
@@ -178,15 +256,80 @@ class TestOvercloudDeploy(unittest.TestCase):
lambda i: ds_opts.get(i, MagicMock())
ds['deploy_options'].__contains__.side_effect = \
lambda i: True if i in ds_opts else MagicMock()
- prep_image(ds, 'undercloud.qcow2', '/tmp', root_pw='test')
+ ns = MagicMock()
+ prep_image(ds, ns, 'undercloud.qcow2', '/tmp', root_pw='test')
mock_virt_utils.virt_customize.assert_called()
+ mock_inject_odl.assert_called()
+ # mock_ovs_nsh.assert_called()
+ @patch('apex.overcloud.deploy.c_builder')
+ @patch('apex.overcloud.deploy.oc_builder')
@patch('apex.overcloud.deploy.virt_utils')
@patch('apex.overcloud.deploy.shutil')
- @patch('apex.overcloud.deploy.os.path')
+ @patch('apex.overcloud.deploy.os.path.isfile')
@patch('builtins.open', mock_open())
- def test_prep_image_sdn_odl_not_def(self, mock_os_path,
- mock_shutil, mock_virt_utils):
+ def test_prep_image_sdn_odl_upstream_containers_patches(
+ self, mock_is_file, mock_shutil, mock_virt_utils,
+ mock_oc_builder, mock_c_builder):
+ mock_is_file.return_value = True
+ ds_opts = {'dataplane': 'ovs',
+ 'sdn_controller': 'opendaylight',
+ 'odl_version': con.DEFAULT_ODL_VERSION,
+ 'odl_vpp_netvirt': True}
+ ds = {'deploy_options': MagicMock(),
+ 'global_params': MagicMock()}
+ ds['deploy_options'].__getitem__.side_effect = \
+ lambda i: ds_opts.get(i, MagicMock())
+ ds['deploy_options'].__contains__.side_effect = \
+ lambda i: True if i in ds_opts else MagicMock()
+ ns = MagicMock()
+ mock_c_builder.add_upstream_patches.return_value = ['nova-api']
+ patches = ['dummy_nova_patch']
+ rv = prep_image(ds, ns, 'undercloud.qcow2', '/tmp', root_pw='test',
+ docker_tag='latest', patches=patches)
+ mock_oc_builder.inject_opendaylight.assert_called()
+ mock_virt_utils.virt_customize.assert_called()
+ mock_c_builder.add_upstream_patches.assert_called()
+ self.assertListEqual(sorted(rv), ['nova-api', 'opendaylight'])
+
+ @patch('apex.overcloud.deploy.c_builder')
+ @patch('apex.overcloud.deploy.oc_builder')
+ @patch('apex.overcloud.deploy.virt_utils')
+ @patch('apex.overcloud.deploy.shutil')
+ @patch('apex.overcloud.deploy.os.path.isfile')
+ @patch('builtins.open', mock_open())
+ def test_prep_image_nosdn_upstream_containers_patches(
+ self, mock_is_file, mock_shutil, mock_virt_utils,
+ mock_oc_builder, mock_c_builder):
+ mock_is_file.return_value = True
+ ds_opts = {'dataplane': 'ovs',
+ 'sdn_controller': False,
+ 'odl_version': con.DEFAULT_ODL_VERSION,
+ 'odl_vpp_netvirt': False}
+ ds = {'deploy_options': MagicMock(),
+ 'global_params': MagicMock()}
+ ds['deploy_options'].__getitem__.side_effect = \
+ lambda i: ds_opts.get(i, MagicMock())
+ ds['deploy_options'].__contains__.side_effect = \
+ lambda i: True if i in ds_opts else MagicMock()
+ ns = MagicMock()
+ mock_c_builder.add_upstream_patches.return_value = ['nova-api']
+ patches = ['dummy_nova_patch']
+ rv = prep_image(ds, ns, 'undercloud.qcow2', '/tmp', root_pw='test',
+ docker_tag='latest', patches=patches)
+ mock_virt_utils.virt_customize.assert_called()
+ mock_c_builder.add_upstream_patches.assert_called()
+ self.assertListEqual(sorted(rv), ['nova-api'])
+
+ @patch('apex.overcloud.deploy.oc_builder')
+ @patch('apex.overcloud.deploy.virt_utils')
+ @patch('apex.overcloud.deploy.shutil')
+ @patch('apex.overcloud.deploy.os.path.isfile')
+ @patch('builtins.open', mock_open())
+ def test_prep_image_sdn_odl_not_def(self, mock_is_file,
+ mock_shutil, mock_virt_utils,
+ mock_oc_builder):
+ mock_is_file.return_value = True
ds_opts = {'dataplane': 'ovs',
'sdn_controller': 'opendaylight',
'odl_version': 'uncommon'}
@@ -194,71 +337,152 @@ class TestOvercloudDeploy(unittest.TestCase):
'global_params': MagicMock()}
ds['deploy_options'].__getitem__.side_effect = \
lambda i: ds_opts.get(i, MagicMock())
- prep_image(ds, 'undercloud.qcow2', '/tmp', root_pw='test')
+ ns = MagicMock()
+ prep_image(ds, ns, 'undercloud.qcow2', '/tmp', root_pw='test')
mock_virt_utils.virt_customize.assert_called()
+ mock_oc_builder.inject_opendaylight.assert_called()
+ @patch('apex.builders.overcloud_builder.inject_ovs_nsh')
@patch('apex.overcloud.deploy.virt_utils')
@patch('apex.overcloud.deploy.shutil')
- @patch('apex.overcloud.deploy.os.path')
+ @patch('apex.overcloud.deploy.os.path.isfile')
@patch('builtins.open', mock_open())
- def test_prep_image_sdn_ovn(self, mock_os_path, mock_shutil,
- mock_virt_utils):
+ def test_prep_image_sdn_ovn(self, mock_is_file, mock_shutil,
+ mock_virt_utils, mock_ovs_nsh):
+ mock_is_file.return_value = True
ds_opts = {'dataplane': 'ovs',
+ 'vpn': False,
+ 'sfc': False,
'sdn_controller': 'ovn'}
ds = {'deploy_options': MagicMock(),
'global_params': MagicMock()}
ds['deploy_options'].__getitem__.side_effect = \
lambda i: ds_opts.get(i, MagicMock())
- prep_image(ds, 'undercloud.qcow2', '/tmp', root_pw='test')
+ ns = MagicMock()
+ prep_image(ds, ns, 'undercloud.qcow2', '/tmp', root_pw='test')
mock_virt_utils.virt_customize.assert_called()
+ # mock_ovs_nsh.assert_called()
+
+ @patch('apex.builders.overcloud_builder.inject_ovs_nsh')
+ @patch('apex.overcloud.deploy.utils.fetch_upstream_and_unpack')
+ @patch('apex.builders.overcloud_builder.inject_quagga')
+ @patch('apex.builders.overcloud_builder.inject_opendaylight')
+ @patch('apex.overcloud.deploy.virt_utils')
+ @patch('apex.overcloud.deploy.shutil')
+ @patch('apex.overcloud.deploy.os.path.isfile')
+ @patch('builtins.open', mock_open())
+ def test_prep_image_sdn_odl_vpn(self, mock_is_file, mock_shutil,
+ mock_virt_utils, mock_inject_odl,
+ mock_inject_quagga, mock_fetch,
+ mock_ovs_nsh):
+ mock_is_file.return_value = True
+ ds_opts = {'dataplane': 'ovs',
+ 'sdn_controller': 'opendaylight',
+ 'vpn': True,
+ 'sfc': False,
+ 'odl_version': con.DEFAULT_ODL_VERSION,
+ 'odl_vpp_netvirt': True}
+ ds = {'deploy_options': MagicMock(),
+ 'global_params': MagicMock()}
+ ds['deploy_options'].__getitem__.side_effect = \
+ lambda i: ds_opts.get(i, MagicMock())
+ ds['deploy_options'].__contains__.side_effect = \
+ lambda i: True if i in ds_opts else MagicMock()
+ ns = MagicMock()
+ prep_image(ds, ns, 'undercloud.qcow2', '/tmp', root_pw='test')
+ mock_virt_utils.virt_customize.assert_called()
+ mock_inject_odl.assert_called()
+ mock_inject_quagga.assert_called()
+ # mock_ovs_nsh.assert_called()
+
+ @patch('apex.builders.overcloud_builder.inject_ovs_nsh')
+ @patch('apex.builders.overcloud_builder.inject_opendaylight')
+ @patch('apex.overcloud.deploy.virt_utils')
+ @patch('apex.overcloud.deploy.shutil')
+ @patch('apex.overcloud.deploy.os.path.isfile')
+ @patch('builtins.open', mock_open())
+ def test_prep_image_sdn_odl_sfc(self, mock_is_file, mock_shutil,
+ mock_virt_utils, mock_inject_odl,
+ mock_inject_ovs_nsh):
+ mock_is_file.return_value = True
+ ds_opts = {'dataplane': 'ovs',
+ 'sdn_controller': 'opendaylight',
+ 'vpn': False,
+ 'sfc': True,
+ 'odl_version': con.DEFAULT_ODL_VERSION,
+ 'odl_vpp_netvirt': True}
+ ds = {'deploy_options': MagicMock(),
+ 'global_params': MagicMock()}
+ ds['deploy_options'].__getitem__.side_effect = \
+ lambda i: ds_opts.get(i, MagicMock())
+ ds['deploy_options'].__contains__.side_effect = \
+ lambda i: True if i in ds_opts else MagicMock()
+ ns = MagicMock()
+ prep_image(ds, ns, 'undercloud.qcow2', '/tmp', root_pw='test')
+ mock_virt_utils.virt_customize.assert_called()
+ mock_inject_odl.assert_called()
+ # mock_inject_ovs_nsh.assert_called()
@patch('apex.overcloud.deploy.os.path.isfile')
def test_prep_image_no_image(self, mock_isfile):
mock_isfile.return_value = False
assert_raises(ApexDeployException, prep_image,
- {}, 'undercloud.qcow2', '/tmp')
+ {}, {}, 'undercloud.qcow2', '/tmp')
def test_make_ssh_key(self):
priv, pub = make_ssh_key()
assert_in('-----BEGIN PRIVATE KEY-----', priv)
assert_in('ssh-rsa', pub)
+ @patch('apex.overcloud.deploy.yaml')
@patch('apex.overcloud.deploy.fileinput')
@patch('apex.overcloud.deploy.shutil')
- def test_prep_env(self, mock_shutil, mock_fileinput):
+ @patch('builtins.open', mock_open())
+ def test_prep_env(self, mock_shutil, mock_fileinput, mock_yaml):
mock_fileinput.input.return_value = \
['CloudDomain', 'replace_private_key', 'replace_public_key',
'opendaylight::vpp_routing_node', 'ControllerExtraConfig',
'NovaComputeExtraConfig', 'ComputeKernelArgs', 'HostCpusList',
'ComputeExtraConfigPre', 'resource_registry',
'NovaSchedulerDefaultFilters']
- ds = {'deploy_options':
+ mock_yaml.safe_load.return_value = {
+ 'parameter_defaults': {
+ 'ControllerServices': [1, 2, 3],
+ 'ComputeServices': [3, 4, 5]
+ }}
+ ds = {'global_params': {'ha_enabled': False},
+ 'deploy_options':
{'sdn_controller': 'opendaylight',
'odl_vpp_routing_node': 'test',
'dataplane': 'ovs_dpdk',
+ 'sriov': 'xxx',
'performance': {'Compute': {'vpp': {'main-core': 'test',
'corelist-workers': 'test'},
'ovs': {'dpdk_cores': 'test'},
'kernel': {'test': 'test'}},
'Controller': {'vpp': 'test'}}}}
- ns = {'domain_name': 'test.domain',
- 'networks':
- {'tenant':
- {'nic_mapping': {'controller':
- {'members': ['tenant_nic']},
- 'compute':
- {'members': ['tenant_nic']}}},
- 'external':
- [{'nic_mapping': {'controller':
- {'members': ['ext_nic']},
- 'compute':
- {'members': ['ext_nic']}}}]}}
- inv = None
+ ns_dict = {'domain_name': 'test.domain',
+ 'networks':
+ {'tenant':
+ {'nic_mapping': {'controller':
+ {'members': ['tenant_nic']},
+ 'compute':
+ {'members': ['tenant_nic']}}},
+ 'external':
+ [{'nic_mapping': {'controller':
+ {'members': ['ext_nic']},
+ 'compute':
+ {'members': ['ext_nic']}}}]}}
+ inv = MagicMock()
+ inv.get_node_counts.return_value = (1, 0)
try:
# Swap stdout
saved_stdout = sys.stdout
out = StringIO()
sys.stdout = out
+ ns = MagicMock()
+ ns.enabled_network_list = ['external', 'tenant']
+ ns.__getitem__.side_effect = lambda i: ns_dict.get(i, MagicMock())
# run test
prep_env(ds, ns, inv, 'opnfv-env.yml', '/net-env.yml', '/tmp')
output = out.getvalue().strip()
@@ -266,42 +490,56 @@ class TestOvercloudDeploy(unittest.TestCase):
assert_in('ssh-rsa', output)
assert_in('ComputeKernelArgs: \'test=test \'', output)
assert_in('fdio::vpp_cpu_main_core: \'test\'', output)
+ mock_yaml.safe_dump.assert_called_with(
+ {'parameter_defaults': {
+ 'ControllerServices': [1, 2, 3, 4, 5],
+ }},
+ mock.ANY, default_flow_style=False
+ )
finally:
# put stdout back
sys.stdout = saved_stdout
@patch('apex.overcloud.deploy.fileinput')
@patch('apex.overcloud.deploy.shutil')
+ @patch('builtins.open', mock_open())
def test_prep_env_round_two(self, mock_shutil, mock_fileinput):
mock_fileinput.input.return_value = \
['NeutronVPPAgentPhysnets']
- ds = {'deploy_options':
+ ds = {'global_params': {'ha_enabled': False},
+ 'deploy_options':
{'sdn_controller': False,
'dataplane': 'fdio',
+ 'sriov': 'xxx',
'performance': {'Compute': {},
'Controller': {}}}}
- ns = {'domain_name': 'test.domain',
- 'networks':
- {'tenant':
- {'nic_mapping': {'controller':
- {'members': ['tenant_nic']},
- 'compute':
- {'members': ['tenant_nic']}}},
- 'external':
- [{'nic_mapping': {'controller':
- {'members': ['ext_nic']},
- 'compute':
- {'members': ['ext_nic']}}}]}}
- inv = None
+ ns_dict = {'domain_name': 'test.domain',
+ 'networks':
+ {'tenant':
+ {'nic_mapping': {'controller':
+ {'members': ['tenant_nic']},
+ 'compute':
+ {'members': ['tenant_nic']}}},
+ 'external':
+ [{'nic_mapping': {'controller':
+ {'members': ['ext_nic']},
+ 'compute':
+ {'members': ['ext_nic']}}}]}}
+ inv = MagicMock()
+ inv.get_node_counts.return_value = (3, 2)
try:
# Swap stdout
saved_stdout = sys.stdout
out = StringIO()
sys.stdout = out
+ ns = MagicMock()
+ ns.enabled_network_list = ['external', 'tenant']
+ ns.__getitem__.side_effect = lambda i: ns_dict.get(i, MagicMock())
# run test
prep_env(ds, ns, inv, 'opnfv-env.yml', '/net-env.yml', '/tmp')
output = out.getvalue().strip()
- assert_in('NeutronVPPAgentPhysnets: \'datacentre:tenant_nic\'',
+ assert_in('NeutronVPPAgentPhysnets: '
+ '\'datacentre:tenant_nic,external:tap0\'',
output)
assert_in('NeutronVPPAgentPhysnets', output)
finally:
@@ -310,26 +548,29 @@ class TestOvercloudDeploy(unittest.TestCase):
@patch('apex.overcloud.deploy.fileinput')
@patch('apex.overcloud.deploy.shutil')
+ @patch('builtins.open', mock_open())
def test_prep_env_round_three(self, mock_shutil, mock_fileinput):
mock_fileinput.input.return_value = \
['OS::TripleO::Services::NeutronDhcpAgent',
'NeutronDhcpAgentsPerNetwork', 'ComputeServices']
- ds = {'deploy_options':
+ ds = {'global_params': {'ha_enabled': False},
+ 'deploy_options':
{'sdn_controller': 'opendaylight',
'dataplane': 'fdio',
+ 'sriov': 'xxx',
'dvr': True}}
- ns = {'domain_name': 'test.domain',
- 'networks':
- {'tenant':
- {'nic_mapping': {'controller':
- {'members': ['tenant_nic']},
- 'compute':
- {'members': ['tenant_nic']}}},
- 'external':
- [{'nic_mapping': {'controller':
- {'members': ['ext_nic']},
- 'compute':
- {'members': ['ext_nic']}}}]}}
+ ns_dict = {'domain_name': 'test.domain',
+ 'networks':
+ {'tenant':
+ {'nic_mapping': {'controller':
+ {'members': ['tenant_nic']},
+ 'compute':
+ {'members': ['tenant_nic']}}},
+ 'external':
+ [{'nic_mapping': {'controller':
+ {'members': ['ext_nic']},
+ 'compute':
+ {'members': ['ext_nic']}}}]}}
inv = MagicMock()
inv.get_node_counts.return_value = (3, 2)
try:
@@ -337,6 +578,9 @@ class TestOvercloudDeploy(unittest.TestCase):
saved_stdout = sys.stdout
out = StringIO()
sys.stdout = out
+ ns = MagicMock()
+ ns.enabled_network_list = ['external', 'tenant']
+ ns.__getitem__.side_effect = lambda i: ns_dict.get(i, MagicMock())
# run test
prep_env(ds, ns, inv, 'opnfv-env.yml', '/net-env.yml', '/tmp')
output = out.getvalue().strip()
@@ -345,6 +589,111 @@ class TestOvercloudDeploy(unittest.TestCase):
# put stdout back
sys.stdout = saved_stdout
+ @patch('apex.overcloud.deploy.fileinput')
+ @patch('apex.overcloud.deploy.shutil')
+ @patch('builtins.open', mock_open())
+ def test_prep_env_tenant_vlan(self, mock_shutil, mock_fileinput):
+ mock_fileinput.input.return_value = \
+ ['NeutronNetworkVLANRanges',
+ 'NeutronNetworkType', 'NeutronBridgeMappings']
+ ds = {'global_params': {'ha_enabled': False},
+ 'deploy_options':
+ {'sdn_controller': False,
+ 'dataplane': 'ovs',
+ 'sriov': 'xxx',
+ 'dvr': True}}
+ ns_dict = {'domain_name': 'test.domain',
+ 'networks':
+ {'tenant':
+ {'nic_mapping': {'controller':
+ {'members': ['tenant_nic']},
+ 'compute':
+ {'members': ['tenant_nic']}},
+ 'segmentation_type': 'vlan',
+ 'overlay_id_range': 'vlan:500:600'
+ },
+ 'external':
+ [{'nic_mapping': {'controller':
+ {'members': ['ext_nic']},
+ 'compute':
+ {'members': ['ext_nic']}}}]}}
+ inv = MagicMock()
+ inv.get_node_counts.return_value = (3, 2)
+ try:
+ # Swap stdout
+ saved_stdout = sys.stdout
+ out = StringIO()
+ sys.stdout = out
+ ns = MagicMock()
+ ns.enabled_network_list = ['external', 'tenant']
+ ns.__getitem__.side_effect = lambda i: ns_dict.get(i, MagicMock())
+ # run test
+ prep_env(ds, ns, inv, 'opnfv-env.yml', '/net-env.yml', '/tmp')
+ output = out.getvalue().strip()
+ assert_in('NeutronNetworkVLANRanges: '
+ 'vlan:500:600,datacentre:1:1000', output)
+ assert_in('NeutronNetworkType: vlan', output)
+ assert_in('NeutronBridgeMappings: '
+ 'vlan:br-vlan,datacentre:br-ex', output)
+ assert_not_in('OpenDaylightProviderMappings', output)
+ finally:
+ # put stdout back
+ sys.stdout = saved_stdout
+
+ @patch('apex.overcloud.deploy.fileinput')
+ @patch('apex.overcloud.deploy.shutil')
+ @patch('builtins.open', mock_open())
+ def test_prep_env_tenant_vlan_odl(self, mock_shutil, mock_fileinput):
+ mock_fileinput.input.return_value = \
+ ['NeutronNetworkVLANRanges',
+ 'NeutronNetworkType',
+ 'NeutronBridgeMappings',
+ 'OpenDaylightProviderMappings']
+ ds = {'global_params': {'ha_enabled': False},
+ 'deploy_options':
+ {'sdn_controller': 'opendaylight',
+ 'dataplane': 'ovs',
+ 'sriov': 'xxx',
+ 'dvr': True}}
+ ns_dict = {'domain_name': 'test.domain',
+ 'networks':
+ {'tenant':
+ {'nic_mapping': {'controller':
+ {'members': ['tenant_nic']},
+ 'compute':
+ {'members': ['tenant_nic']}},
+ 'segmentation_type': 'vlan',
+ 'overlay_id_range': 'vlan:500:600'
+ },
+ 'external':
+ [{'nic_mapping': {'controller':
+ {'members': ['ext_nic']},
+ 'compute':
+ {'members': ['ext_nic']}}}]}}
+ inv = MagicMock()
+ inv.get_node_counts.return_value = (3, 2)
+ try:
+ # Swap stdout
+ saved_stdout = sys.stdout
+ out = StringIO()
+ sys.stdout = out
+ ns = MagicMock()
+ ns.enabled_network_list = ['external', 'tenant']
+ ns.__getitem__.side_effect = lambda i: ns_dict.get(i, MagicMock())
+ # run test
+ prep_env(ds, ns, inv, 'opnfv-env.yml', '/net-env.yml', '/tmp')
+ output = out.getvalue().strip()
+ assert_in('NeutronNetworkVLANRanges: '
+ 'vlan:500:600,datacentre:1:1000', output)
+ assert_in('NeutronNetworkType: vlan', output)
+ assert_in('NeutronBridgeMappings: '
+ 'vlan:br-vlan,datacentre:br-ex', output)
+ assert_in('OpenDaylightProviderMappings: '
+ 'vlan:br-vlan,datacentre:br-ex', output)
+ finally:
+ # put stdout back
+ sys.stdout = saved_stdout
+
def test_generate_ceph_key(self):
assert_equal(len(generate_ceph_key()), 40)
@@ -356,21 +705,109 @@ class TestOvercloudDeploy(unittest.TestCase):
mock_ceph_key):
mock_fileinput.input.return_value = \
['CephClusterFSID', 'CephMonKey', 'CephAdminKey', 'random_key']
- ds = {'deploy_options': MagicMock()}
- ds['deploy_options'].__getitem__.side_effect = \
- lambda i: '/dev/sdx' if i == 'ceph_device' else MagicMock()
- ds['deploy_options'].__contains__.side_effect = \
- lambda i: True if i == 'ceph_device' else MagicMock()
- prep_storage_env(ds, '/tmp')
+ ds = {'deploy_options': {
+ 'ceph_device': '/dev/sdx',
+ 'containers': False
+ }}
+ ns = {}
+ prep_storage_env(ds, ns, virtual=False, tmp_dir='/tmp')
+
+ @patch('apex.overcloud.deploy.utils.edit_tht_env')
+ @patch('apex.overcloud.deploy.generate_ceph_key')
+ @patch('apex.overcloud.deploy.fileinput')
+ @patch('apex.overcloud.deploy.os.path.isfile')
+ @patch('builtins.open', mock_open())
+ def test_prep_storage_env_containers(self, mock_isfile, mock_fileinput,
+ mock_ceph_key, mock_edit_tht):
+ mock_fileinput.input.return_value = \
+ ['CephClusterFSID', 'CephMonKey', 'CephAdminKey', 'random_key']
+ ds = {'deploy_options': {
+ 'ceph_device': '/dev/sdx',
+ 'containers': True,
+ 'os_version': 'master'
+ }, 'global_params': {'ha_enabled': False}}
+ ns = {'networks': {con.ADMIN_NETWORK: {'installer_vm':
+ {'ip': '192.0.2.1'}}}
+ }
+ prep_storage_env(ds, ns, virtual=True, tmp_dir='/tmp')
+ ceph_params = {
+ 'CephPoolDefaultSize': 2,
+ 'CephAnsibleExtraConfig': {
+ 'centos_package_dependencies': [],
+ 'ceph_osd_docker_memory_limit': '1g',
+ 'ceph_mds_docker_memory_limit': '1g'
+ },
+ 'CephPoolDefaultPgNum': 32,
+ 'CephAnsibleDisksConfig': {
+ 'devices': ['/dev/sdx'],
+ 'journal_size': 512,
+ 'osd_scenario': 'collocated'
+ }
+ }
+ mock_edit_tht.assert_called_with('/tmp/storage-environment.yaml',
+ 'parameter_defaults',
+ ceph_params)
@patch('apex.overcloud.deploy.os.path.isfile')
@patch('builtins.open', mock_open())
def test_prep_storage_env_raises(self, mock_isfile):
mock_isfile.return_value = False
ds = {'deploy_options': MagicMock()}
- assert_raises(ApexDeployException, prep_storage_env, ds, '/tmp')
+ ns = {}
+ assert_raises(ApexDeployException, prep_storage_env, ds,
+ ns, virtual=False, tmp_dir='/tmp')
+
+ @patch('apex.overcloud.deploy.generate_ceph_key')
+ @patch('apex.overcloud.deploy.fileinput')
+ @patch('apex.overcloud.deploy.os.path.isfile')
+ @patch('builtins.open', mock_open())
+ def test_prep_sriov_env(self, mock_isfile, mock_fileinput, mock_ceph_key):
+ ds = {'deploy_options':
+ {'sdn_controller': 'opendaylight',
+ 'sriov': 'xxx'}}
+ try:
+ # Swap stdout
+ saved_stdout = sys.stdout
+ out = StringIO()
+ sys.stdout = out
+ # Run tests
+ mock_fileinput.input.return_value = \
+ ['# NovaSchedulerDefaultFilters',
+ '# NovaSchedulerAvailableFilters',
+ '#NeutronPhysicalDevMappings: "datacentre:ens20f2"',
+ '#NeutronSriovNumVFs: \"ens20f2:5\"',
+ '#NovaPCIPassthrough:',
+ '# - devname: \"ens20f2\"',
+ '# physical_network: \"datacentre\"']
+ prep_sriov_env(ds, '/tmp')
+ output = out.getvalue().strip()
+ assert_in('NovaSchedulerDefaultFilters', output)
+ assert_in('NovaSchedulerAvailableFilters', output)
+ assert_in('NeutronPhysicalDevMappings: \"nfv_sriov:xxx\"', output)
+ assert_in('NeutronSriovNumVFs: \"xxx:8\"', output)
+ assert_in('NovaPCIPassthrough:', output)
+ assert_in('- devname: \"xxx\"', output)
+ assert_in('physical_network: \"nfv_sriov\"', output)
+ finally:
+ # put stdout back
+ sys.stdout = saved_stdout
+
+ @patch('apex.overcloud.deploy.os.path.isfile')
+ @patch('builtins.open', mock_open())
+ def test_prep_sriov_env_raises(self, mock_isfile):
+ ds_opts = {'sriov': True}
+ ds = {'deploy_options': MagicMock()}
+ ds['deploy_options'].__getitem__.side_effect = \
+ lambda i: ds_opts.get(i, MagicMock())
+ mock_isfile.return_value = False
+ ds = {'deploy_options': MagicMock()}
+ assert_raises(ApexDeployException, prep_sriov_env, ds, '/tmp')
def test_external_network_cmds(self):
+ ds = {'deploy_options':
+ {'sdn_controller': 'opendaylight',
+ 'dataplane': 'ovs'}}
+
cidr = MagicMock()
cidr.version = 6
ns_dict = {'networks':
@@ -382,13 +819,41 @@ class TestOvercloudDeploy(unittest.TestCase):
ns = MagicMock()
ns.enabled_network_list = ['external']
ns.__getitem__.side_effect = lambda i: ns_dict.get(i, MagicMock())
- cmds = ' '.join(external_network_cmds(ns))
+ cmds = ' '.join(external_network_cmds(ns, ds))
assert_in('--external', cmds)
assert_in('--allocation-pool start=0,end=1', cmds)
assert_in('--gateway gw', cmds)
assert_in('--network external', cmds)
+ assert_in('--provider-physical-network datacentre', cmds)
+
+ def test_external_network_cmds_nosdn_fdio(self):
+ ds = {'deploy_options':
+ {'sdn_controller': False,
+ 'dataplane': 'fdio'}}
+
+ cidr = MagicMock()
+ cidr.version = 6
+ ns_dict = {'networks':
+ {'external': [{'floating_ip_range': (0, 1),
+ 'nic_mapping':
+ {'compute': {'vlan': 'native'}},
+ 'gateway': 'gw',
+ 'cidr': cidr}]}}
+ ns = MagicMock()
+ ns.enabled_network_list = ['external']
+ ns.__getitem__.side_effect = lambda i: ns_dict.get(i, MagicMock())
+ cmds = ' '.join(external_network_cmds(ns, ds))
+ assert_in('--external', cmds)
+ assert_in('--allocation-pool start=0,end=1', cmds)
+ assert_in('--gateway gw', cmds)
+ assert_in('--network external', cmds)
+ assert_in('--provider-physical-network external', cmds)
def test_external_network_cmds_no_ext(self):
+ ds = {'deploy_options':
+ {'sdn_controller': 'opendaylight',
+ 'dataplane': 'ovs'}}
+
cidr = MagicMock()
cidr.version = 6
ns_dict = {'apex':
@@ -402,8 +867,7 @@ class TestOvercloudDeploy(unittest.TestCase):
ns = MagicMock()
ns.enabled_network_list = ['admin']
ns.__getitem__.side_effect = lambda i: ns_dict.get(i, MagicMock())
- external_network_cmds(ns)
- cmds = ' '.join(external_network_cmds(ns))
+ cmds = ' '.join(external_network_cmds(ns, ds))
assert_in('--external', cmds)
assert_in('--allocation-pool start=0,end=1', cmds)
assert_in('--network external', cmds)
@@ -417,3 +881,21 @@ class TestOvercloudDeploy(unittest.TestCase):
def test_create_congress_cmds_raises(self, mock_parsers):
mock_parsers.return_value.__getitem__.side_effect = KeyError()
assert_raises(KeyError, create_congress_cmds, 'overcloud_file')
+
+ def test_get_docker_sdn_files(self):
+ ds_opts = {'ha_enabled': True,
+ 'congress': True,
+ 'tacker': True,
+ 'containers': False,
+ 'barometer': True,
+ 'ceph': False,
+ 'vpn': True,
+ 'sdn_controller': 'opendaylight',
+ 'os_version': 'queens'
+ }
+ output = get_docker_sdn_files(ds_opts)
+ compare = ['/usr/share/openstack-tripleo-heat-templates/'
+ 'environments/services/neutron-opendaylight.yaml',
+ '/usr/share/openstack-tripleo-heat-templates/environments'
+ '/services/neutron-bgpvpn-opendaylight.yaml']
+ self.assertEqual(output, compare)
diff --git a/apex/tests/test_apex_overcloud_node.py b/apex/tests/test_apex_overcloud_node.py
new file mode 100644
index 0000000..4c67b1d
--- /dev/null
+++ b/apex/tests/test_apex_overcloud_node.py
@@ -0,0 +1,191 @@
+##############################################################################
+# Copyright (c) 2018 Tim Rozet (trozet@redhat.com) (Red Hat)
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+from libvirt import libvirtError
+from mock import patch
+from mock import MagicMock
+import os
+import unittest
+import urllib.request
+
+from apex.common import exceptions as exc
+from apex.overcloud.node import OvercloudNode
+from apex.settings.deploy_settings import DeploySettings
+from apex.tests.constants import TEST_DUMMY_CONFIG
+
+DUMMY_SNAP_DIR = '/tmp/dummy_cache'
+
+
+class TestSnapshotDeployment(unittest.TestCase):
+ @classmethod
+ def setup_class(cls):
+ """This method is run once for each class before any tests are run"""
+
+ @classmethod
+ def teardown_class(cls):
+ """This method is run once for each class _after_ all tests are run"""
+
+ def setup(self):
+ """This method is run once before _each_ test method is executed"""
+
+ def teardown(self):
+ """This method is run once after _each_ test method is executed"""
+
+ @patch('apex.overcloud.node.OvercloudNode.create')
+ @patch('apex.overcloud.node.os.path.isfile')
+ @patch('apex.overcloud.node.libvirt.open')
+ def test_init(self, mock_libvirt_open, mock_is_file, mock_node_create):
+ mock_is_file.return_value = True
+ OvercloudNode(role='controller', ip='123.123.123.123',
+ ovs_ctrlrs=None, ovs_mgrs=None,
+ name='dummy-controller-0', node_xml='dummynode.xml',
+ disk_img='dummy.qcow2')
+ mock_node_create.assert_called()
+
+ @patch('apex.overcloud.node.OvercloudNode.create')
+ @patch('apex.overcloud.node.libvirt.open')
+ def test_init_invalid_files(self, mock_libvirt_open, mock_node_create):
+ self.assertRaises(exc.OvercloudNodeException,
+ OvercloudNode, 'controller', '123.123.123',
+ None, None, 'dummy-controller-0', 'dummynode.xml',
+ 'dummy.qcow2')
+
+ @patch('apex.overcloud.node.shutil.copyfile')
+ @patch('apex.overcloud.node.OvercloudNode.create')
+ @patch('apex.overcloud.node.os.path.isfile')
+ @patch('apex.overcloud.node.libvirt.open')
+ def test_configure_disk(self, mock_libvirt_open, mock_is_file,
+ mock_node_create, mock_copy):
+ mock_is_file.return_value = True
+ node = OvercloudNode(role='controller', ip='123.123.123.123',
+ ovs_ctrlrs=None, ovs_mgrs=None,
+ name='dummy-controller-0',
+ node_xml='dummynode.xml',
+ disk_img='dummy.qcow2')
+ conn = mock_libvirt_open.return_value
+ conn.storagePoolLookupByName.return_value.XMLDesc.return_value = """
+ <pool type='dir'>
+ <target>
+ <path>/var/lib/libvirt/images</path>
+ </target>
+ </pool>
+ """
+ node._configure_disk('dummy.qcow2')
+ mock_copy.assert_called()
+ self.assertEqual(node.disk_img, '/var/lib/libvirt/images/dummy.qcow2')
+
+ @patch('apex.overcloud.node.shutil.copyfile')
+ @patch('apex.overcloud.node.OvercloudNode.create')
+ @patch('apex.overcloud.node.os.path.isfile')
+ @patch('apex.overcloud.node.libvirt.open')
+ def test_configure_disk_bad_path(self, mock_libvirt_open, mock_is_file,
+ mock_node_create, mock_copy):
+ mock_is_file.return_value = True
+ node = OvercloudNode(role='controller', ip='123.123.123.123',
+ ovs_ctrlrs=None, ovs_mgrs=None,
+ name='dummy-controller-0',
+ node_xml='dummynode.xml',
+ disk_img='dummy.qcow2')
+ conn = mock_libvirt_open.return_value
+ conn.storagePoolLookupByName.return_value.XMLDesc.return_value = """
+ <pool type='dir'>
+ <target>
+ </target>
+ </pool>
+ """
+ self.assertRaises(exc.OvercloudNodeException,
+ node._configure_disk, 'dummy.qcow2')
+
+ @patch('apex.overcloud.node.shutil.copyfile')
+ @patch('apex.overcloud.node.OvercloudNode.create')
+ @patch('apex.overcloud.node.os.path.isfile')
+ @patch('apex.overcloud.node.libvirt.open')
+ def test_configure_disk_no_pool(self, mock_libvirt_open, mock_is_file,
+ mock_node_create, mock_copy):
+ mock_is_file.return_value = True
+ node = OvercloudNode(role='controller', ip='123.123.123.123',
+ ovs_ctrlrs=None, ovs_mgrs=None,
+ name='dummy-controller-0',
+ node_xml='dummynode.xml',
+ disk_img='dummy.qcow2')
+ conn = mock_libvirt_open.return_value
+ conn.storagePoolLookupByName.return_value = None
+ self.assertRaises(exc.OvercloudNodeException,
+ node._configure_disk, 'dummy.qcow2')
+
+ @patch('apex.overcloud.node.distro.linux_distribution')
+ def test_update_xml(self, mock_linux_distro):
+ mock_linux_distro.return_value = ['Fedora']
+ xml_file = os.path.join(TEST_DUMMY_CONFIG, 'baremetal0.xml')
+ with open(xml_file, 'r') as fh:
+ xml = fh.read()
+ new_xml = OvercloudNode._update_xml(
+ xml=xml, disk_path='/dummy/disk/path/blah.qcow2')
+ self.assertIn('/dummy/disk/path/blah.qcow2', new_xml)
+ self.assertIn('/usr/bin/qemu-kvm', new_xml)
+
+ @patch('apex.overcloud.node.distro.linux_distribution')
+ def test_update_xml_no_disk(self, mock_linux_distro):
+ mock_linux_distro.return_value = ['Fedora']
+ xml_file = os.path.join(TEST_DUMMY_CONFIG, 'baremetal0.xml')
+ with open(xml_file, 'r') as fh:
+ xml = fh.read()
+ new_xml = OvercloudNode._update_xml(xml=xml)
+ self.assertIn('/home/images/baremetal0.qcow2', new_xml)
+ self.assertIn('/usr/bin/qemu-kvm', new_xml)
+
+ @patch('apex.overcloud.node.OvercloudNode._update_xml')
+ @patch('apex.overcloud.node.OvercloudNode._configure_disk')
+ @patch('apex.overcloud.node.libvirt.open')
+ @patch('apex.overcloud.node.os.path.isfile')
+ def test_create(self, mock_isfile, mock_libvirt_conn, mock_configure_disk,
+ mock_update_xml):
+ mock_isfile.return_value = True
+ domain = mock_libvirt_conn.return_value.defineXML.return_value
+ node = OvercloudNode(role='controller', ip='123.123.123.123',
+ ovs_ctrlrs=None, ovs_mgrs=None,
+ name='dummy-controller-0',
+ node_xml=os.path.join(TEST_DUMMY_CONFIG,
+ 'baremetal0.xml'),
+ disk_img='dummy.qcow2')
+ self.assertIs(node.vm, domain)
+
+ @patch('apex.overcloud.node.OvercloudNode._update_xml')
+ @patch('apex.overcloud.node.OvercloudNode._configure_disk')
+ @patch('apex.overcloud.node.libvirt.open')
+ @patch('apex.overcloud.node.os.path.isfile')
+ def test_start(self, mock_isfile, mock_libvirt_conn, mock_configure_disk,
+ mock_update_xml):
+ mock_isfile.return_value = True
+ domain = mock_libvirt_conn.return_value.defineXML.return_value
+ node = OvercloudNode(role='controller', ip='123.123.123.123',
+ ovs_ctrlrs=None, ovs_mgrs=None,
+ name='dummy-controller-0',
+ node_xml=os.path.join(TEST_DUMMY_CONFIG,
+ 'baremetal0.xml'),
+ disk_img='dummy.qcow2')
+ node.start()
+ domain.create.assert_called()
+
+ @patch('apex.overcloud.node.OvercloudNode._update_xml')
+ @patch('apex.overcloud.node.OvercloudNode._configure_disk')
+ @patch('apex.overcloud.node.libvirt.open')
+ @patch('apex.overcloud.node.os.path.isfile')
+ def test_start_fail(self, mock_isfile, mock_libvirt_conn,
+ mock_configure_disk, mock_update_xml):
+ mock_isfile.return_value = True
+ domain = mock_libvirt_conn.return_value.defineXML.return_value
+ domain.create.side_effect = libvirtError('blah')
+ node = OvercloudNode(role='controller', ip='123.123.123.123',
+ ovs_ctrlrs=None, ovs_mgrs=None,
+ name='dummy-controller-0',
+ node_xml=os.path.join(TEST_DUMMY_CONFIG,
+ 'baremetal0.xml'),
+ disk_img='dummy.qcow2')
+ self.assertRaises(exc.OvercloudNodeException, node.start)
diff --git a/apex/tests/test_apex_undercloud.py b/apex/tests/test_apex_undercloud.py
index 9458bf9..1458652 100644
--- a/apex/tests/test_apex_undercloud.py
+++ b/apex/tests/test_apex_undercloud.py
@@ -7,8 +7,10 @@
# http://www.apache.org/licenses/LICENSE-2.0
##############################################################################
+import ipaddress
import libvirt
import os
+import platform
import subprocess
import unittest
@@ -23,6 +25,7 @@ from nose.tools import (
assert_regexp_matches,
assert_raises,
assert_true,
+ assert_false,
assert_equal)
@@ -117,11 +120,111 @@ class TestUndercloud(unittest.TestCase):
@patch.object(Undercloud, 'generate_config', return_value={})
@patch.object(Undercloud, '_get_vm', return_value=None)
@patch.object(Undercloud, 'create')
+ def test_detect_nat_with_external(self, mock_create, mock_get_vm,
+ mock_generate_config, mock_utils):
+ ns = MagicMock()
+ ns.enabled_network_list = ['admin', 'external']
+ ns_dict = {
+ 'apex': MagicMock(),
+ 'dns-domain': 'dns',
+ 'networks': {'admin':
+ {'cidr': ipaddress.ip_network('192.0.2.0/24'),
+ 'installer_vm': {'ip': '192.0.2.1',
+ 'vlan': 'native'},
+ 'dhcp_range': ['192.0.2.15', '192.0.2.30'],
+ 'gateway': '192.1.1.1',
+ },
+ 'external':
+ [{'enabled': True,
+ 'cidr': ipaddress.ip_network('192.168.0.0/24'),
+ 'installer_vm': {'ip': '192.168.0.1',
+ 'vlan': 'native'},
+ 'gateway': '192.168.0.1'
+ }]
+ }
+ }
+ ns.__getitem__.side_effect = ns_dict.__getitem__
+ ns.__contains__.side_effect = ns_dict.__contains__
+
+ uc = Undercloud('img_path', 'tplt_path', external_network=True)
+ assert_true(uc.detect_nat(ns))
+
+ @patch('apex.undercloud.undercloud.utils')
+ @patch.object(Undercloud, 'generate_config', return_value={})
+ @patch.object(Undercloud, '_get_vm', return_value=None)
+ @patch.object(Undercloud, 'create')
+ def test_detect_nat_no_external(self, mock_create, mock_get_vm,
+ mock_generate_config, mock_utils):
+ ns = MagicMock()
+ ns.enabled_network_list = ['admin', 'external']
+ ns_dict = {
+ 'apex': MagicMock(),
+ 'dns-domain': 'dns',
+ 'networks': {'admin':
+ {'cidr': ipaddress.ip_network('192.0.2.0/24'),
+ 'installer_vm': {'ip': '192.0.2.1',
+ 'vlan': 'native'},
+ 'dhcp_range': ['192.0.2.15', '192.0.2.30'],
+ 'gateway': '192.0.2.1',
+ },
+ 'external':
+ [{'enabled': False,
+ 'cidr': ipaddress.ip_network('192.168.0.0/24'),
+ 'installer_vm': {'ip': '192.168.0.1',
+ 'vlan': 'native'},
+ 'gateway': '192.168.1.1'
+ }]
+ }
+ }
+ ns.__getitem__.side_effect = ns_dict.__getitem__
+ ns.__contains__.side_effect = ns_dict.__contains__
+
+ uc = Undercloud('img_path', 'tplt_path', external_network=False)
+ assert_true(uc.detect_nat(ns))
+
+ @patch('apex.undercloud.undercloud.utils')
+ @patch.object(Undercloud, 'generate_config', return_value={})
+ @patch.object(Undercloud, '_get_vm', return_value=None)
+ @patch.object(Undercloud, 'create')
+ def test_detect_no_nat_no_external(self, mock_create, mock_get_vm,
+ mock_generate_config, mock_utils):
+ ns = MagicMock()
+ ns.enabled_network_list = ['admin', 'external']
+ ns_dict = {
+ 'apex': MagicMock(),
+ 'dns-domain': 'dns',
+ 'networks': {'admin':
+ {'cidr': ipaddress.ip_network('192.0.2.0/24'),
+ 'installer_vm': {'ip': '192.0.2.1',
+ 'vlan': 'native'},
+ 'dhcp_range': ['192.0.2.15', '192.0.2.30'],
+ 'gateway': '192.0.2.3',
+ },
+ 'external':
+ [{'enabled': False,
+ 'cidr': ipaddress.ip_network('192.168.0.0/24'),
+ 'installer_vm': {'ip': '192.168.0.1',
+ 'vlan': 'native'},
+ 'gateway': '192.168.1.1'
+ }]
+ }
+ }
+ ns.__getitem__.side_effect = ns_dict.__getitem__
+ ns.__contains__.side_effect = ns_dict.__contains__
+
+ uc = Undercloud('img_path', 'tplt_path', external_network=False)
+ assert_false(uc.detect_nat(ns))
+
+ @patch('apex.undercloud.undercloud.utils')
+ @patch.object(Undercloud, 'generate_config', return_value={})
+ @patch.object(Undercloud, '_get_vm', return_value=None)
+ @patch.object(Undercloud, 'create')
def test_configure(self, mock_create, mock_get_vm,
mock_generate_config, mock_utils):
uc = Undercloud('img_path', 'tplt_path', external_network=True)
ns = MagicMock()
- uc.configure(ns, 'playbook', '/tmp/dir')
+ ds = MagicMock()
+ uc.configure(ns, ds, 'playbook', '/tmp/dir')
@patch('apex.undercloud.undercloud.utils')
@patch.object(Undercloud, 'generate_config', return_value={})
@@ -131,18 +234,22 @@ class TestUndercloud(unittest.TestCase):
mock_generate_config, mock_utils):
uc = Undercloud('img_path', 'tplt_path', external_network=True)
ns = MagicMock()
+ ds = MagicMock()
subps_err = subprocess.CalledProcessError(1, 'cmd')
mock_utils.run_ansible.side_effect = subps_err
assert_raises(ApexUndercloudException,
- uc.configure, ns, 'playbook', '/tmp/dir')
+ uc.configure, ns, ds, 'playbook', '/tmp/dir')
+ @patch('apex.undercloud.undercloud.virt_utils')
+ @patch('apex.undercloud.undercloud.uc_builder')
@patch('apex.undercloud.undercloud.os.remove')
@patch('apex.undercloud.undercloud.os.path')
@patch('apex.undercloud.undercloud.shutil')
@patch.object(Undercloud, '_get_vm', return_value=None)
@patch.object(Undercloud, 'create')
def test_setup_vols(self, mock_get_vm, mock_create,
- mock_shutil, mock_os_path, mock_os_remove):
+ mock_shutil, mock_os_path, mock_os_remove,
+ mock_uc_builder, mock_virt_utils):
uc = Undercloud('img_path', 'tplt_path', external_network=True)
mock_os_path.isfile.return_value = True
mock_os_path.exists.return_value = True
@@ -152,6 +259,9 @@ class TestUndercloud(unittest.TestCase):
src_img = os.path.join(uc.image_path, img_file)
dest_img = os.path.join(constants.LIBVIRT_VOLUME_PATH, img_file)
mock_shutil.copyfile.assert_called_with(src_img, dest_img)
+ if platform.machine() != 'aarch64':
+ mock_uc_builder.expand_disk.assert_called()
+ mock_virt_utils.virt_customize.assert_called()
@patch('apex.undercloud.undercloud.os.path')
@patch.object(Undercloud, '_get_vm', return_value=None)
@@ -173,24 +283,64 @@ class TestUndercloud(unittest.TestCase):
{'--upload':
'/root/.ssh/id_rsa.pub:/root/.ssh/authorized_keys'},
{'--run-command': 'chmod 600 /root/.ssh/authorized_keys'},
- {'--run-command': 'restorecon /root/.ssh/authorized_keys'},
+ {'--run-command': 'restorecon '
+ '-R -v /root/.ssh'},
+ {'--run-command': 'id -u stack || useradd -m stack'},
+ {'--run-command': 'mkdir -p /home/stack/.ssh'},
+ {'--run-command': 'chown stack:stack /home/stack/.ssh'},
{'--run-command':
'cp /root/.ssh/authorized_keys /home/stack/.ssh/'},
{'--run-command':
'chown stack:stack /home/stack/.ssh/authorized_keys'},
{'--run-command':
- 'chmod 600 /home/stack/.ssh/authorized_keys'}]
+ 'chmod 600 /home/stack/.ssh/authorized_keys'},
+ {'--run-command':
+ 'echo "stack ALL = (ALL) NOPASSWD: ALL" >> '
+ '/etc/sudoers'},
+ {'--run-command': 'touch /etc/cloud/cloud-init.disabled'}]
mock_vutils.virt_customize.assert_called_with(test_ops, uc.volume)
@patch.object(Undercloud, '_get_vm', return_value=None)
@patch.object(Undercloud, 'create')
def test_generate_config(self, mock_get_vm, mock_create):
- ns_net = MagicMock()
- ns_net.__getitem__.side_effect = \
- lambda i: '1234/24' if i is 'cidr' else MagicMock()
- ns = {'apex': MagicMock(),
- 'dns-domain': 'dns',
- 'networks': {'admin': ns_net,
- 'external': [ns_net]}}
-
- Undercloud('img_path', 'tplt_path').generate_config(ns)
+ ns = MagicMock()
+ ns.enabled_network_list = ['admin', 'external']
+ ns_dict = {
+ 'apex': MagicMock(),
+ 'dns-domain': 'dns',
+ 'ntp': 'pool.ntp.org',
+ 'networks': {'admin':
+ {'cidr': ipaddress.ip_network('192.0.2.0/24'),
+ 'installer_vm': {'ip': '192.0.2.1',
+ 'vlan': 'native'},
+ 'dhcp_range': ['192.0.2.15', '192.0.2.30']
+ },
+ 'external':
+ [{'enabled': True,
+ 'cidr': ipaddress.ip_network('192.168.0.0/24'),
+ 'installer_vm': {'ip': '192.168.0.1',
+ 'vlan': 'native'}
+ }]
+ }
+ }
+ ns.__getitem__.side_effect = ns_dict.__getitem__
+ ns.__contains__.side_effect = ns_dict.__contains__
+ ds = {'global_params': {},
+ 'deploy_options': {}}
+
+ Undercloud('img_path', 'tplt_path').generate_config(ns, ds)
+
+ @patch.object(Undercloud, '_get_vm', return_value=None)
+ @patch.object(Undercloud, 'create')
+ @patch('apex.undercloud.undercloud.virt_utils')
+ def test_update_delorean(self, mock_vutils, mock_uc_create, mock_get_vm):
+ uc = Undercloud('img_path', 'tmplt_path', external_network=True)
+ uc._update_delorean_repo()
+ download_cmd = (
+ "curl -L -f -o "
+ "/etc/yum.repos.d/deloran.repo "
+ "https://trunk.rdoproject.org/centos7-{}"
+ "/current-tripleo/delorean.repo".format(
+ constants.DEFAULT_OS_VERSION))
+ test_ops = [{'--run-command': download_cmd}]
+ mock_vutils.virt_customize.assert_called_with(test_ops, uc.volume)
diff --git a/apex/tests/test_apex_virtual_utils.py b/apex/tests/test_apex_virtual_utils.py
index 643069f..a9eb78d 100644
--- a/apex/tests/test_apex_virtual_utils.py
+++ b/apex/tests/test_apex_virtual_utils.py
@@ -12,6 +12,7 @@ import unittest
from mock import patch
+from apex.virtual.exceptions import ApexVirtualException
from apex.virtual.utils import DEFAULT_VIRT_IP
from apex.virtual.utils import get_virt_ip
from apex.virtual.utils import generate_inventory
@@ -66,13 +67,30 @@ class TestVirtualUtils(unittest.TestCase):
assert_is_instance(generate_inventory('target_file', ha_enabled=True),
dict)
+ @patch('apex.virtual.utils.get_virt_ip')
+ @patch('apex.virtual.utils.subprocess.check_output')
@patch('apex.virtual.utils.iptc')
@patch('apex.virtual.utils.subprocess.check_call')
@patch('apex.virtual.utils.vbmc_lib')
- def test_host_setup(self, mock_vbmc_lib, mock_subprocess, mock_iptc):
+ def test_host_setup(self, mock_vbmc_lib, mock_subprocess, mock_iptc,
+ mock_check_output, mock_get_virt_ip):
+ mock_get_virt_ip.return_value = '192.168.122.1'
+ mock_check_output.return_value = b'blah |dummy \nstatus | running'
host_setup({'test': 2468})
mock_subprocess.assert_called_with(['vbmc', 'start', 'test'])
+ @patch('apex.virtual.utils.get_virt_ip')
+ @patch('apex.virtual.utils.subprocess.check_output')
+ @patch('apex.virtual.utils.iptc')
+ @patch('apex.virtual.utils.subprocess.check_call')
+ @patch('apex.virtual.utils.vbmc_lib')
+ def test_host_setup_vbmc_fails(self, mock_vbmc_lib, mock_subprocess,
+ mock_iptc, mock_check_output,
+ mock_get_virt_ip):
+ mock_get_virt_ip.return_value = '192.168.122.1'
+ mock_check_output.return_value = b'blah |dummy \nstatus | stopped'
+ assert_raises(ApexVirtualException, host_setup, {'test': 2468})
+
@patch('apex.virtual.utils.iptc')
@patch('apex.virtual.utils.subprocess.check_call')
@patch('apex.virtual.utils.vbmc_lib')
diff --git a/apex/undercloud/undercloud.py b/apex/undercloud/undercloud.py
index 013570d..5ee487c 100644
--- a/apex/undercloud/undercloud.py
+++ b/apex/undercloud/undercloud.py
@@ -15,6 +15,7 @@ import shutil
import subprocess
import time
+from apex.builders import undercloud_builder as uc_builder
from apex.virtual import utils as virt_utils
from apex.virtual import configure_vm as vm_lib
from apex.common import constants
@@ -31,8 +32,10 @@ class Undercloud:
"""
def __init__(self, image_path, template_path,
root_pw=None, external_network=False,
- image_name='undercloud.qcow2'):
+ image_name='undercloud.qcow2',
+ os_version=constants.DEFAULT_OS_VERSION):
self.ip = None
+ self.os_version = os_version
self.root_pw = root_pw
self.external_net = external_network
self.volume = os.path.join(constants.LIBVIRT_VOLUME_PATH,
@@ -61,27 +64,40 @@ class Undercloud:
if self.external_net:
networks.append('external')
console = 'ttyAMA0' if platform.machine() == 'aarch64' else 'ttyS0'
+ root = 'vda2' if platform.machine() == 'aarch64' else 'sda'
self.vm = vm_lib.create_vm(name='undercloud',
image=self.volume,
baremetal_interfaces=networks,
direct_boot='overcloud-full',
kernel_args=['console={}'.format(console),
- 'root=/dev/sda'],
+ 'root=/dev/{}'.format(root)],
default_network=True,
- template_dir=self.template_path)
+ template_dir=self.template_path,
+ memory=10240)
self.setup_volumes()
self.inject_auth()
- def _set_ip(self):
- ip_out = self.vm.interfaceAddresses(
+ @staticmethod
+ def _get_ip(vm):
+ ip_out = vm.interfaceAddresses(
libvirt.VIR_DOMAIN_INTERFACE_ADDRESSES_SRC_LEASE, 0)
if ip_out:
for (name, val) in ip_out.items():
for ipaddr in val['addrs']:
if ipaddr['type'] == libvirt.VIR_IP_ADDR_TYPE_IPV4:
- self.ip = ipaddr['addr']
- return True
+ return ipaddr['addr']
+
+ def _set_ip(self):
+ ip = self._get_ip(self.vm)
+ if ip:
+ self.ip = ip
+ return True
+
+ @staticmethod
+ def get_ip():
+ vm = Undercloud._get_vm()
+ return Undercloud._get_ip(vm)
def start(self):
"""
@@ -96,7 +112,7 @@ class Undercloud:
# give 10 seconds to come up
time.sleep(10)
# set IP
- for x in range(5):
+ for x in range(10):
if self._set_ip():
logging.info("Undercloud started. IP Address: {}".format(
self.ip))
@@ -110,19 +126,37 @@ class Undercloud:
"Unable to find IP for undercloud. Check if VM booted "
"correctly")
- def configure(self, net_settings, playbook, apex_temp_dir):
+ def detect_nat(self, net_settings):
+ if self.external_net:
+ net = net_settings['networks'][constants.EXTERNAL_NETWORK][0]
+ else:
+ net = net_settings['networks'][constants.ADMIN_NETWORK]
+ if net['gateway'] == net['installer_vm']['ip']:
+ return True
+ else:
+ return False
+
+ def configure(self, net_settings, deploy_settings,
+ playbook, apex_temp_dir, virtual_oc=False):
"""
Configures undercloud VM
- :param net_setings: Network settings for deployment
+ :param net_settings: Network settings for deployment
+ :param deploy_settings: Deployment settings for deployment
:param playbook: playbook to use to configure undercloud
:param apex_temp_dir: temporary apex directory to hold configs/logs
+ :param virtual_oc: Boolean to determine if overcloud is virt
:return: None
"""
logging.info("Configuring Undercloud...")
# run ansible
- ansible_vars = Undercloud.generate_config(net_settings)
+ ansible_vars = Undercloud.generate_config(net_settings,
+ deploy_settings)
ansible_vars['apex_temp_dir'] = apex_temp_dir
+
+ ansible_vars['nat'] = self.detect_nat(net_settings)
+ ansible_vars['container_client'] = utils.find_container_client(
+ self.os_version)
try:
utils.run_ansible(ansible_vars, playbook, host=self.ip,
user='stack')
@@ -150,11 +184,19 @@ class Undercloud:
if os.path.exists(dest_img):
os.remove(dest_img)
shutil.copyfile(src_img, dest_img)
+ if img_file == self.image_name and platform.machine() != 'aarch64':
+ uc_builder.expand_disk(dest_img)
+ self.expand_root_fs()
+
shutil.chown(dest_img, user='qemu', group='qemu')
os.chmod(dest_img, 0o0744)
- # TODO(trozet):check if resize needed right now size is 50gb
+
+ def expand_root_fs(self):
# there is a lib called vminspect which has some dependencies and is
# not yet available in pip. Consider switching to this lib later.
+ logging.debug("Expanding root filesystem on /dev/sda partition")
+ virt_ops = [{constants.VIRT_RUN_CMD: 'xfs_growfs /dev/sda'}]
+ virt_utils.virt_customize(virt_ops, self.volume)
def inject_auth(self):
virt_ops = list()
@@ -169,39 +211,59 @@ class Undercloud:
'/root/.ssh/id_rsa.pub:/root/.ssh/authorized_keys'})
run_cmds = [
'chmod 600 /root/.ssh/authorized_keys',
- 'restorecon /root/.ssh/authorized_keys',
+ 'restorecon -R -v /root/.ssh',
+ 'id -u stack || useradd -m stack',
+ 'mkdir -p /home/stack/.ssh',
+ 'chown stack:stack /home/stack/.ssh',
'cp /root/.ssh/authorized_keys /home/stack/.ssh/',
'chown stack:stack /home/stack/.ssh/authorized_keys',
- 'chmod 600 /home/stack/.ssh/authorized_keys'
+ 'chmod 600 /home/stack/.ssh/authorized_keys',
+ 'echo "stack ALL = (ALL) NOPASSWD: ALL" >> /etc/sudoers',
+ 'touch /etc/cloud/cloud-init.disabled'
]
for cmd in run_cmds:
virt_ops.append({constants.VIRT_RUN_CMD: cmd})
virt_utils.virt_customize(virt_ops, self.volume)
@staticmethod
- def generate_config(ns):
+ def generate_config(ns, ds):
"""
Generates a dictionary of settings for configuring undercloud
:param ns: network settings to derive undercloud settings
+ :param ds: deploy settings to derive undercloud settings
:return: dictionary of settings
"""
ns_admin = ns['networks']['admin']
intro_range = ns['apex']['networks']['admin']['introspection_range']
config = dict()
+ # Check if this is an ARM deployment
+ config['aarch64'] = platform.machine() == 'aarch64'
+ # Configuration for undercloud.conf
config['undercloud_config'] = [
"enable_ui false",
"undercloud_update_packages false",
"undercloud_debug false",
"inspection_extras false",
+ "ipxe_enabled {}".format(
+ str(ds['global_params'].get('ipxe', True) and
+ not config['aarch64'])),
"undercloud_hostname undercloud.{}".format(ns['dns-domain']),
"local_ip {}/{}".format(str(ns_admin['installer_vm']['ip']),
str(ns_admin['cidr']).split('/')[1]),
- "network_gateway {}".format(str(ns_admin['installer_vm']['ip'])),
- "network_cidr {}".format(str(ns_admin['cidr'])),
+ "generate_service_certificate false",
+ "undercloud_ntp_servers {}".format(str(ns['ntp'][0])),
+ "container_images_file "
+ "/home/stack/containers-prepare-parameter.yaml",
+ "undercloud_enable_selinux false"
+ ]
+
+ config['undercloud_network_config'] = [
+ "gateway {}".format(str(ns_admin['installer_vm']['ip'])),
+ "cidr {}".format(str(ns_admin['cidr'])),
"dhcp_start {}".format(str(ns_admin['dhcp_range'][0])),
"dhcp_end {}".format(str(ns_admin['dhcp_range'][1])),
- "inspection_iprange {}".format(','.join(intro_range))
+ "inspection_iprange {}".format(','.join(intro_range)),
]
config['ironic_config'] = [
@@ -225,8 +287,35 @@ class Undercloud:
"prefix": str(ns_external['cidr']).split('/')[1],
"enabled": ns_external['enabled']
}
-
- # Check if this is an ARM deployment
- config['aarch64'] = platform.machine() == 'aarch64'
+ # We will NAT external network if it is enabled. If external network
+ # is IPv6, we will NAT admin network in case we need IPv4 connectivity
+ # for things like DNS server.
+ if 'external' in ns.enabled_network_list and \
+ ns_external['cidr'].version == 4:
+ nat_cidr = ns_external['cidr']
+ else:
+ nat_cidr = ns['networks']['admin']['cidr']
+ config['nat_cidr'] = str(nat_cidr)
+ if nat_cidr.version == 6:
+ config['nat_network_ipv6'] = True
+ else:
+ config['nat_network_ipv6'] = False
+ config['http_proxy'] = ns.get('http_proxy', '')
+ config['https_proxy'] = ns.get('https_proxy', '')
return config
+
+ def _update_delorean_repo(self):
+ if utils.internet_connectivity():
+ logging.info('Updating delorean repo on Undercloud')
+ delorean_repo = (
+ "https://trunk.rdoproject.org/centos7-{}"
+ "/current-tripleo/delorean.repo".format(self.os_version))
+ cmd = ("curl -L -f -o "
+ "/etc/yum.repos.d/deloran.repo {}".format(delorean_repo))
+ try:
+ virt_utils.virt_customize([{constants.VIRT_RUN_CMD: cmd}],
+ self.volume)
+ except Exception:
+ logging.warning("Failed to download and update delorean repo "
+ "for Undercloud")
diff --git a/apex/utils.py b/apex/utils.py
new file mode 100644
index 0000000..f791461
--- /dev/null
+++ b/apex/utils.py
@@ -0,0 +1,107 @@
+##############################################################################
+# Copyright (c) 2017 Tim Rozet (trozet@redhat.com) and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+# TODO(trozet) migrate rest of utils.sh here
+
+import argparse
+import datetime
+import logging
+import os
+import sys
+import tempfile
+
+from apex.common import constants
+from apex.common import parsers
+from apex.undercloud import undercloud as uc_lib
+from apex.common import utils
+
+VALID_UTILS = ['fetch_logs']
+START_TIME = datetime.datetime.now().strftime("%Y-%m-%d-%H:%M")
+APEX_TEMP_DIR = tempfile.mkdtemp(prefix="apex-logs-{}-".format(START_TIME))
+
+
+def fetch_logs(args):
+ uc_ip = uc_lib.Undercloud.get_ip()
+ if not uc_ip:
+ raise Exception('No Undercloud IP found')
+ logging.info("Undercloud IP is: {}".format(uc_ip))
+ fetch_vars = dict()
+ fetch_vars['stackrc'] = 'source /home/stack/stackrc'
+ fetch_vars['apex_temp_dir'] = APEX_TEMP_DIR
+ fetch_playbook = os.path.join(args.lib_dir, constants.ANSIBLE_PATH,
+ 'fetch_overcloud_nodes.yml')
+ try:
+ utils.run_ansible(fetch_vars, fetch_playbook, host=uc_ip,
+ user='stack', tmp_dir=APEX_TEMP_DIR)
+ logging.info("Retrieved overcloud nodes info")
+ except Exception:
+ logging.error("Failed to retrieve overcloud nodes. Please check log")
+ raise
+ nova_output = os.path.join(APEX_TEMP_DIR, 'nova_output')
+ fetch_vars['overcloud_nodes'] = parsers.parse_nova_output(nova_output)
+ fetch_vars['SSH_OPTIONS'] = '-o StrictHostKeyChecking=no -o ' \
+ 'GlobalKnownHostsFile=/dev/null -o ' \
+ 'UserKnownHostsFile=/dev/null -o ' \
+ 'LogLevel=error'
+ fetch_playbook = os.path.join(args.lib_dir, constants.ANSIBLE_PATH,
+ 'fetch_overcloud_logs.yml')
+ # Run per overcloud node
+ for node, ip in fetch_vars['overcloud_nodes'].items():
+ logging.info("Executing fetch logs overcloud playbook on "
+ "node {}".format(node))
+ try:
+ utils.run_ansible(fetch_vars, fetch_playbook, host=ip,
+ user='heat-admin', tmp_dir=APEX_TEMP_DIR)
+ logging.info("Logs retrieved for node {}".format(node))
+ except Exception:
+ logging.error("Log retrieval failed "
+ "for node {}. Please check log".format(node))
+ raise
+ logging.info("Log retrieval complete and stored in {}".format(
+ APEX_TEMP_DIR))
+
+
+def execute_actions(args):
+ for action in VALID_UTILS:
+ if hasattr(args, action) and getattr(args, action):
+ util_module = __import__('apex').utils
+ func = getattr(util_module, action)
+ logging.info("Executing action: {}".format(action))
+ func(args)
+
+
+def main():
+ util_parser = argparse.ArgumentParser()
+ util_parser.add_argument('-f', '--fetch-logs',
+ dest='fetch_logs',
+ required=False,
+ default=False,
+ action='store_true',
+ help='Fetch all overcloud logs')
+ util_parser.add_argument('--lib-dir',
+ default='/usr/share/opnfv-apex',
+ help='Directory path for apex ansible '
+ 'and third party libs')
+ args = util_parser.parse_args(sys.argv[1:])
+ os.makedirs(os.path.dirname('./apex_util.log'), exist_ok=True)
+ formatter = '%(asctime)s %(levelname)s: %(message)s'
+ logging.basicConfig(filename='./apex_util.log',
+ format=formatter,
+ datefmt='%m/%d/%Y %I:%M:%S %p',
+ level=logging.DEBUG)
+ console = logging.StreamHandler()
+ console.setLevel(logging.DEBUG)
+ console.setFormatter(logging.Formatter(formatter))
+ logging.getLogger('').addHandler(console)
+
+ execute_actions(args)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/apex/virtual/configure_vm.py b/apex/virtual/configure_vm.py
index 3b2c446..9d47bf0 100755
--- a/apex/virtual/configure_vm.py
+++ b/apex/virtual/configure_vm.py
@@ -102,6 +102,10 @@ def create_vm(name, image, diskbus='sata', baremetal_interfaces=['admin'],
with open(os.path.join(template_dir, 'domain.xml'), 'r') as f:
source_template = f.read()
imagefile = os.path.realpath(image)
+
+ if arch == 'aarch64' and diskbus == 'sata':
+ diskbus = 'virtio'
+
memory = int(memory) * 1024
params = {
'name': name,
@@ -118,9 +122,6 @@ def create_vm(name, image, diskbus='sata', baremetal_interfaces=['admin'],
'user_interface': '',
}
- # assign scsi as default for aarch64
- if arch == 'aarch64' and diskbus == 'sata':
- diskbus = 'scsi'
# Configure the bus type for the target disk device
params['diskbus'] = diskbus
nicparams = {
@@ -171,7 +172,7 @@ def create_vm(name, image, diskbus='sata', baremetal_interfaces=['admin'],
"""
params['user_interface'] = """
<controller type='virtio-serial' index='0'>
- <address type='virtio-mmio'/>
+ <address type='pci'/>
</controller>
<serial type='pty'>
<target port='0'/>
diff --git a/apex/virtual/exceptions.py b/apex/virtual/exceptions.py
new file mode 100644
index 0000000..e3dff51
--- /dev/null
+++ b/apex/virtual/exceptions.py
@@ -0,0 +1,12 @@
+##############################################################################
+# Copyright (c) 2018 Tim Rozet (trozet@redhat.com) and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+
+class ApexVirtualException(Exception):
+ pass
diff --git a/apex/virtual/utils.py b/apex/virtual/utils.py
index 226af1b..8b24bc4 100644
--- a/apex/virtual/utils.py
+++ b/apex/virtual/utils.py
@@ -18,6 +18,8 @@ import xml.etree.ElementTree as ET
from apex.common import utils as common_utils
from apex.virtual import configure_vm as vm_lib
+from apex.virtual import exceptions as exc
+from time import sleep
from virtualbmc import manager as vbmc_lib
DEFAULT_RAM = 8192
@@ -131,11 +133,39 @@ def host_setup(node):
chain.insert_rule(rule)
try:
subprocess.check_call(['vbmc', 'start', name])
- logging.debug("Started vbmc for domain {}".format(name))
+ logging.debug("Started VBMC for domain {}".format(name))
except subprocess.CalledProcessError:
- logging.error("Failed to start vbmc for {}".format(name))
+ logging.error("Failed to start VBMC for {}".format(name))
raise
- logging.debug('vmbcs setup: {}'.format(vbmc_manager.list()))
+
+ logging.info("Checking VBMC {} is up".format(name))
+ is_running = False
+ for x in range(0, 4):
+ logging.debug("Polling to see if VBMC is up, attempt {}".format(x))
+ try:
+ output = subprocess.check_output(['vbmc', 'show', name],
+ stderr=subprocess.STDOUT)
+ except subprocess.CalledProcessError:
+ logging.warning('Unable to issue "vbmc show" cmd')
+ continue
+ for line in output.decode('utf-8').split('\n'):
+ if 'status' in line:
+ if 'running' in line:
+ is_running = True
+ break
+ else:
+ logging.debug('VBMC status is not "running"')
+ break
+ if is_running:
+ break
+ sleep(1)
+ if is_running:
+ logging.info("VBMC {} is up and running".format(name))
+ else:
+ logging.error("Failed to verify VBMC is running")
+ raise exc.ApexVirtualException("Failed to bring up vbmc "
+ "{}".format(name))
+ logging.debug('VBMCs setup: {}'.format(vbmc_manager.list()))
def virt_customize(ops, target):
diff --git a/build/CentOS-Updates.repo b/build/CentOS-Updates.repo
deleted file mode 100644
index 8fc45d8..0000000
--- a/build/CentOS-Updates.repo
+++ /dev/null
@@ -1,5 +0,0 @@
-#released updates
-[updates-old]
-name=CentOS-$releasever - Old Updates
-baseurl=http://mirror.centos.org/centos/7.3.1611/updates/x86_64/
-gpgcheck=0
diff --git a/build/Makefile b/build/Makefile
index 805cf22..a446cc5 100644
--- a/build/Makefile
+++ b/build/Makefile
@@ -8,37 +8,24 @@
##############################################################################
export USE_MASTER = ""
-export CENTDNLD = http://mirrors.cat.pdx.edu/centos/7.4.1708/isos/x86_64/CentOS-7-x86_64-DVD-1708.iso
export RELEASE = "0"
export RPM_DIST = $(shell rpm -E %dist)
-
-export NETVPP_VERS := $(shell grep Version $(shell pwd)/rpm_specs/networking-vpp.spec | head -n 1 | awk '{ print $$2 }')
-export NETVPP_REPO := $(shell awk -F\= '/^netvpp_repo/ {print $$2}' variables.sh )
-export NETVPP_BRANCH := $(shell awk -F\= '/^netvpp_branch/ {print $$2}' variables.sh )
-export NETVPP_COMMIT := $(shell git ls-remote $(NETVPP_REPO) $(NETVPP_BRANCH) | awk '{print substr($$1,1,7)}')
-
-export RELRPMVERS = $(shell grep Version $(shell pwd)/rpm_specs/opnfv-apex-release.spec | head -n 1 | awk '{ print $$2 }')
export RPMVERS = $(shell grep Version $(shell pwd)/rpm_specs/opnfv-apex.spec | head -n 1 | awk '{ print $$2 }')
export BUILD_ROOT = $(shell pwd)
export BUILD_DIR = $(shell dirname $$(pwd))/.build
export CACHE_DIR = $(shell dirname $$(pwd))/.cache
-export PATCHES_DIR = $(BUILD_ROOT)/patches
-export QUAGGA_BUILD_DIR = $(BUILD_DIR)/quagga_build_dir
-export QUAGGA_RPMS_DIR = $(QUAGGA_BUILD_DIR)/rpmbuild
export RPM_DIR_ARGS = -D '_topdir $(BUILD_DIR)' -D '_builddir $(BUILD_DIR)' -D '_sourcedir $(BUILD_DIR)' -D '_rpmdir $(BUILD_DIR)' -D '_specdir $(BUILD_DIR)' -D '_srcrpmdir $(BUILD_DIR)'
-
-export RPMREL = $(BUILD_DIR)/noarch/opnfv-apex-release-$(RPMVERS)-$(shell echo ${RELEASE} | tr -d '_-').noarch.rpm
export RPMCOM = $(BUILD_DIR)/noarch/python34-opnfv-apex-$(RPMVERS)-$(shell echo ${RELEASE} | tr -d '_-').noarch.rpm
-export RPMUDR = $(BUILD_DIR)/noarch/opnfv-apex-undercloud-$(RPMVERS)-$(shell echo ${RELEASE} | tr -d '_-').noarch.rpm
-export RPMODL = $(BUILD_DIR)/noarch/opnfv-apex-$(RPMVERS)-$(shell echo ${RELEASE} | tr -d '_-').noarch.rpm
-export RPMONO = $(BUILD_DIR)/noarch/opnfv-apex-onos-$(RPMVERS)-$(shell echo ${RELEASE} | tr -d '_-').noarch.rpm
-export ISO = $(BUILD_DIR)/release/OPNFV-CentOS-7-x86_64-${RELEASE}.iso
-export CENTISO = $(BUILD_DIR)/$(shell basename $(CENTDNLD))
+
+export NETVPP_VERS := $(shell grep Version $(shell pwd)/rpm_specs/networking-vpp.spec | head -n 1 | awk '{ print $$2 }')
+export NETVPP_REPO := "https://github.com/fepan/networking-vpp"
+export NETVPP_BRANCH := "test-fdio-fix"
+export NETVPP_COMMIT := $(shell git ls-remote $(NETVPP_REPO) $(NETVPP_BRANCH) | awk '{print substr($$1,1,7)}')
.PHONY: all
-all: iso
+all: rpm
.PHONY: clean
clean:
@@ -48,50 +35,46 @@ clean:
clean-cache:
rm -rf $(CACHE_DIR)
-.PHONY: images
-images: undercloud overcloud-full overcloud-opendaylight
-
-.PHONY: rpms
-rpms: images common-rpm undercloud-rpm opendaylight-rpm
+.PHONY: rpm-check
+rpm-check: apex-rpm-check
-.PHONY: rpms-check
-rpms-check: release-rpm-check common-rpm-check undercloud-rpm-check opendaylight-rpm-check
-
-.PHONY: rpms-clean
-rpms-clean:
+.PHONY: rpm-clean
+rpm-clean:
rm -rf $(BUILD_DIR)/noarch
rm -rf $(BUILD_DIR)/BUILDROOT
-$(BUILD_DIR)/opnfv-apex-release.tar.gz:
+$(BUILD_DIR)/opnfv-apex.tar.gz:
mkdir -p $(BUILD_DIR)
- pushd ../ && git archive --format=tar.gz --prefix=opnfv-apex-release-$(RELRPMVERS)/ HEAD > $(BUILD_DIR)/opnfv-apex-release.tar.gz
+ pushd ../ && git archive --format=tar.gz --prefix=opnfv-apex-$(RPMVERS)/ HEAD > $(BUILD_DIR)/opnfv-apex.tar.gz
-.PHONY: release-rpm-check
-release-rpm-check: $(BUILD_DIR)/opnfv-apex-release.tar.gz
- rpmbuild --clean -bi -bl rpm_specs/opnfv-apex-release.spec $(RPM_DIR_ARGS) -D "_release $(shell echo $(RELEASE) | tr -d '_-')"
+.PHONY: apex-rpm-check
+apex-rpm-check: $(BUILD_DIR)/opnfv-apex.tar.gz
+ rpmbuild --clean -bi -bl rpm_specs/opnfv-apex.spec $(RPM_DIR_ARGS) -D "_release $(shell echo $(RELEASE) | tr -d '_-')"
-.PHONY: release-rpm
-release-rpm: $(BUILD_DIR)/opnfv-apex-release.tar.gz $(RPMREL)
+.PHONY: rpm
+rpm: $(BUILD_DIR)/opnfv-apex.tar.gz $(RPMCOM)
-$(RPMREL):
- @echo "Building the Apex Release RPM"
- # build the release RPM
- rpmbuild --clean -ba rpm_specs/opnfv-apex-release.spec $(RPM_DIR_ARGS) -D "_release $(shell echo $(RELEASE) | tr -d '_-')"
+$(RPMCOM):
+ @echo "Building the Apex RPM"
+ # build the Apex RPM
+ rpmbuild --clean -ba rpm_specs/opnfv-apex.spec $(RPM_DIR_ARGS) -D "_release $(shell echo $(RELEASE) | tr -d '_-')"
-$(BUILD_DIR)/opnfv-apex-common.tar.gz:
- pushd ../ && git archive --format=tar.gz --prefix=opnfv-apex-$(RPMVERS)/ HEAD > $(BUILD_DIR)/opnfv-apex-common.tar.gz
-.PHONY: common-rpm-check
-common-rpm-check: $(BUILD_DIR)/opnfv-apex-common.tar.gz
- rpmbuild --clean -bi -bl rpm_specs/opnfv-apex-common.spec $(RPM_DIR_ARGS) -D "_release $(shell echo $(RELEASE) | tr -d '_-')"
+##################
+# NETWORKING-VPP #
+##################
-.PHONY: common-rpm
-common-rpm: $(BUILD_DIR)/opnfv-apex-common.tar.gz $(RPMCOM)
+$(BUILD_DIR)/python-networking-vpp.tar.gz:
+ @echo "Preparing the networking-vpp RPM prerequisites"
+ git clone $(NETVPP_REPO) -b $(NETVPP_BRANCH) $(BUILD_DIR)/python-networking-vpp-$(NETVPP_VERS)
+ tar czf $(BUILD_DIR)/python-networking-vpp.tar.gz -C $(BUILD_DIR) python-networking-vpp-$(NETVPP_VERS)
-$(RPMCOM):
- @echo "Building the Apex Common RPM"
- # build the common RPM
- rpmbuild --clean -ba rpm_specs/opnfv-apex-common.spec $(RPM_DIR_ARGS) -D "_release $(shell echo $(RELEASE) | tr -d '_-')"
+.PHONY: networking-vpp-rpm
+networking-vpp-rpm: $(BUILD_DIR)/noarch/python-networking-vpp-*.noarch.rpm
+
+$(BUILD_DIR)/noarch/python-networking-vpp-*.noarch.rpm: $(BUILD_DIR)/python-networking-vpp.tar.gz
+ @echo "Building the Networking VPP RPM"
+ rpmbuild --clean -ba --target noarch rpm_specs/networking-vpp.spec $(RPM_DIR_ARGS) -D 'git .git$(NETVPP_COMMIT)'
##################
# PYTHON TESTS #
@@ -126,226 +109,3 @@ rpmlint:
@echo "Running rpmlint against all RPM spec files"
rpmlint rpm_specs/*.spec
-##################
-# NETWORKING-VPP #
-##################
-
-$(BUILD_DIR)/python-networking-vpp.tar.gz:
- @echo "Preparing the networking-vpp RPM prerequisites"
- git clone $(NETVPP_REPO) -b $(NETVPP_BRANCH) $(BUILD_DIR)/python-networking-vpp-$(NETVPP_VERS)
- tar czf $(BUILD_DIR)/python-networking-vpp.tar.gz -C $(BUILD_DIR) python-networking-vpp-$(NETVPP_VERS)
-
-.PHONY: networking-vpp-rpm
-networking-vpp-rpm: $(BUILD_DIR)/noarch/python-networking-vpp-*.noarch.rpm
-
-$(BUILD_DIR)/noarch/python-networking-vpp-*.noarch.rpm: $(BUILD_DIR)/python-networking-vpp.tar.gz
- @echo "Building the Networking VPP RPM"
- rpmbuild --clean -ba --target noarch rpm_specs/networking-vpp.spec $(RPM_DIR_ARGS) -D 'git .git$(NETVPP_COMMIT)'
-
-###############
-# UNDERCLOUD #
-###############
-
-.PHONY: undercloud
-undercloud: $(BUILD_DIR)/undercloud.qcow2
-
-$(BUILD_DIR)/undercloud.qcow2:
- @echo "Building the Apex Undercloud Image"
- @./undercloud.sh
-
-$(BUILD_DIR)/opnfv-apex-undercloud.tar.gz: $(BUILD_DIR)/undercloud.qcow2
- @echo "Preparing the Apex Undercloud RPM prerequisites"
- pushd ../ && git archive --format=tar --prefix=opnfv-apex-undercloud-$(RPMVERS)/ HEAD > $(BUILD_DIR)/opnfv-apex-undercloud.tar
- tar -rf $(BUILD_DIR)/opnfv-apex-undercloud.tar \
- --xform="s:.*undercloud.qcow2:opnfv-apex-undercloud-$(RPMVERS)/build/undercloud.qcow2:" $(BUILD_DIR)/undercloud.qcow2
- gzip -f $(BUILD_DIR)/opnfv-apex-undercloud.tar
-
-.PHONY: undercloud-rpm-check
-undercloud-rpm-check: $(BUILD_DIR)/opnfv-apex-undercloud.tar.gz
- rpmbuild --clean -bi -bl rpm_specs/opnfv-apex-undercloud.spec $(RPM_DIR_ARGS) -D "_release $(shell echo $(RELEASE) | tr -d '_-')"
-
-.PHONY: undercloud-rpm
-undercloud-rpm: $(BUILD_DIR)/opnfv-apex-undercloud.tar.gz $(RPMUDR)
-
-$(RPMUDR):
- @echo "Building the Apex Undercloud RPM"
- rpmbuild --clean -ba rpm_specs/opnfv-apex-undercloud.spec $(RPM_DIR_ARGS) -D "_release $(shell echo $(RELEASE) | tr -d '_-')"
-
-###############
-# OVERCLOUD #
-###############
-
-.PHONY: overcloud-full
-overcloud-full: $(BUILD_DIR)/overcloud-full.qcow2
-
-$(BUILD_DIR)/overcloud-full.qcow2: $(BUILD_DIR)/noarch/python-networking-vpp-*.noarch.rpm
- @echo "Building the Apex Base Overcloud Image"
- @./overcloud-full.sh
-
-###############
-# ODL #
-###############
-
-.PHONY: overcloud-opendaylight
-overcloud-opendaylight: $(BUILD_DIR)/overcloud-full-opendaylight.qcow2
-
-$(BUILD_DIR)/overcloud-full-opendaylight.qcow2: $(BUILD_DIR)/overcloud-full.qcow2
- @echo "Building the Apex OpenDaylight Overcloud Image"
- @./overcloud-opendaylight.sh
-
-$(BUILD_DIR)/opnfv-apex.tar.gz: $(BUILD_DIR)/overcloud-full-opendaylight.qcow2
- tar -czf $(BUILD_DIR)/opnfv-apex.tar.gz --xform="s:.*/:opnfv-apex-$(RPMVERS)/build/:" $(BUILD_DIR)/overcloud-full-opendaylight.qcow2 $(BUILD_DIR)/overcloud-full.initrd $(BUILD_DIR)/overcloud-full.vmlinuz
-
-.PHONY: opendaylight-rpm-check
-opendaylight-rpm-check: $(BUILD_DIR)/opnfv-apex.tar.gz
- rpmbuild --clean -bi -bl rpm_specs/opnfv-apex.spec $(RPM_DIR_ARGS) -D "_release $(shell echo $(RELEASE) | tr -d '_-')"
-
-.PHONY: opendaylight-rpm
-opendaylight-rpm: $(BUILD_DIR)/opnfv-apex.tar.gz $(RPMODL)
-
-$(RPMODL):
- @echo "Building the Apex OpenDaylight RPM"
- # build the overcloud RPM
- rpmbuild --clean -ba rpm_specs/opnfv-apex.spec $(RPM_DIR_ARGS) -D "_release $(shell echo $(RELEASE) | tr -d '_-')"
-
-###############
-# ONOS #
-###############
-
-.PHONY: overcloud-onos
-overcloud-onos: $(BUILD_DIR)/overcloud-full-onos.qcow2
-
-$(BUILD_DIR)/overcloud-full-onos.qcow2: $(BUILD_DIR)/overcloud-full.qcow2
- @echo "Building the Apex ONOS Overcloud Image"
- @./overcloud-onos.sh
-
-$(BUILD_DIR)/opnfv-apex-onos.tar.gz: $(BUILD_DIR)/overcloud-full-onos.qcow2
- tar -czf $(BUILD_DIR)/opnfv-apex-onos.tar.gz --xform="s:.*/:opnfv-apex-onos-$(RPMVERS)/build/:" $(BUILD_DIR)/overcloud-full-onos.qcow2
-
-.PHONY: onos-rpm-check
-onos-rpm-check: $(BUILD_DIR)/opnfv-apex-onos.tar.gz
- rpmbuild --clean -bi -bl rpm_specs/opnfv-apex-onos.spec $(RPM_DIR_ARGS) -D "_release $(shell echo $(RELEASE) | tr -d '_-')"
-
-.PHONY: onos-rpm
-onos-rpm: $(BUILD_DIR)/opnfv-apex-onos.tar.gz $(RPMONO)
-
-$(RPMONO):
- @echo "Building the Apex ONOS RPM"
- # build the overcloud RPM
- rpmbuild --clean -ba rpm_specs/opnfv-apex-onos.spec $(RPM_DIR_ARGS) -D "_release $(shell echo $(RELEASE) | tr -d '_-')"
-
-###############
-# ISO #
-###############
-
-$(CENTISO):
- curl $(CENTDNLD) -z $(CENTISO) -o $(CENTISO) --verbose --silent --location
-
-iso-clean:
- @rm -Rf $(BUILD_DIR)/centos
- @rm -Rf $(BUILD_DIR)/release
- @rm -f $(ISO)
-
-.PHONY: mount-centiso umount-centiso
-mount-centiso: $(CENTISO)
- @echo "Mounting CentOS ISO in $(CENTDIR)"
- @mkdir -p $(CENTDIR)
- @fuseiso $(CENTISO) $(CENTDIR)
-
-umount-centiso:
- @set +e
- @echo "Unmounting CentOS ISO from $(CENTDIR)"
- @fusermount -u $(CENTDIR)
- @rmdir $(CENTDIR)
- @set -e
-
-.PHONY: iso
-iso: iso-clean images rpms $(CENTISO)
- @echo "Building the Apex ISO"
- @mkdir $(BUILD_DIR)/centos $(BUILD_DIR)/release
- cd $(BUILD_DIR)/centos && bsdtar -xf ../$(shell basename $(CENTISO))
- # modify the installer iso's contents
- @chmod -R u+w $(BUILD_DIR)/centos
- @cp -f isolinux.cfg $(BUILD_DIR)/centos/isolinux/isolinux.cfg
- @ln $(RPMCOM) $(BUILD_DIR)/centos/Packages
- @ln $(RPMUDR) $(BUILD_DIR)/centos/Packages
- @ln $(RPMODL) $(BUILD_DIR)/centos/Packages
- # add packages to the centos packages
- cd $(BUILD_DIR)/centos/Packages && yumdownloader openvswitch jq python34 python34-libs python34-PyYAML python34-setuptools
- cd $(BUILD_DIR)/centos/Packages && yumdownloader python34-jinja2 python34-markupsafe ansible python34-six python34-cffi
- cd $(BUILD_DIR)/centos/Packages && yumdownloader ipxe-roms-qemu python34-idna python34-pycparser python-crypto python-httplib2
- cd $(BUILD_DIR)/centos/Packages && yumdownloader python-jinja2 python-keyczar python-paramiko sshpass python-ecdsa python34-ply
- cd $(BUILD_DIR)/centos/Packages && yumdownloader libvirt-python python-lxml python-passlib python2-jmespath
- cd $(BUILD_DIR)/centos/Packages && curl -O http://artifacts.opnfv.org/apex/dependencies/python3-ipmi-0.3.0-1.noarch.rpm
- cd $(BUILD_DIR)/centos/Packages && curl -O http://artifacts.opnfv.org/apex/dependencies/python34-asn1crypto-0.22.0-1.el7.centos.noarch.rpm
- cd $(BUILD_DIR)/centos/Packages && curl -O http://artifacts.opnfv.org/apex/dependencies/python34-cryptography-2.0.3-1.el7.centos.x86_64.rpm
- cd $(BUILD_DIR)/centos/Packages && curl -O http://artifacts.opnfv.org/apex/dependencies/python34-iptables-0.12.0-1.el7.centos.x86_64.rpm
- cd $(BUILD_DIR)/centos/Packages && curl -O http://artifacts.opnfv.org/apex/dependencies/python34-libvirt-3.6.0-1.el7.centos.x86_64.rpm
- cd $(BUILD_DIR)/centos/Packages && curl -O http://artifacts.opnfv.org/apex/dependencies/python34-pbr-3.1.1-1.el7.centos.x86_64.rpm
- cd $(BUILD_DIR)/centos/Packages && curl -O http://artifacts.opnfv.org/apex/dependencies/python34-PrettyTable-0.7.2-1.el7.centos.noarch.rpm
- cd $(BUILD_DIR)/centos/Packages && curl -O http://artifacts.opnfv.org/apex/dependencies/python34-pycrypto-2.6.1-1.el7.centos.x86_64.rpm
- cd $(BUILD_DIR)/centos/Packages && curl -O http://artifacts.opnfv.org/apex/dependencies/python34-pyghmi-1.0.22-1.el7.centos.noarch.rpm
- cd $(BUILD_DIR)/centos/Packages && curl -O http://artifacts.opnfv.org/apex/dependencies/python34-virtualbmc-1.2.0-1.el7.centos.noarch.rpm
- # regenerate yum repo data
- @echo "Generating new yum metadata"
- createrepo --update -g $(BUILD_ROOT)/c7-opnfv-x86_64-comps.xml $(BUILD_DIR)/centos
- # build the iso
- @echo "Building OPNFV iso"
- mkisofs -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -V "OPNFV CentOS 7 x86_64" -R -J -v -T -o $(ISO) $(BUILD_DIR)/centos
- isohybrid $(ISO)
- @printf "\n\nISO is built at $(ISO)\n\n"
-
-##################
-# Quagga Clean #
-##################
-.PHONY: quagga-clean
-quagga-clean:
- @rm -rf $(QUAGGA_BUILD_DIR)
- @sudo yum -y remove zrpc* quagga* c-capnproto* thrift*
-
-#################
-# Quagga+ZRPC #
-#################
-.PHONY: quagga-zrpc
-quagga-zrpc: quagga-clean thrift-rpm capnproto-rpm quagga-rpm zrpc-rpm
-
-##########
-# ZRPC #
-##########
-.PHONY: zrpc-rpm
-zrpc-rpm: quagga-rpm $(QUAGGA_RPMS_DIR)/zrpcd-%.x86_64.rpm
-
-$(QUAGGA_RPMS_DIR)/zrpcd-%.x86_64.rpm:
- @echo "Building ZRPC RPM"
- @./build_quagga.sh -a zrpc
-
-############
-# Quagga #
-############
-.PHONY: quagga-rpm
-quagga-rpm: $(QUAGGA_RPMS_DIR)/RPMS/x86_64/quagga-1.1.0_%.el7.centos.x86_64.rpm
-
-$(QUAGGA_RPMS_DIR)/RPMS/x86_64/quagga-1.1.0_%.el7.centos.x86_64.rpm:
- @echo "Building Quagga RPM"
- @./build_quagga.sh -a quagga
-
-###############
-# Capnproto #
-###############
-.PHONY: capnproto-rpm
-capnproto-rpm: $(QUAGGA_RPMS_DIR)/RPMS/x86_64/c-capnproto-%.x86_64.rpm
-
-$(QUAGGA_RPMS_DIR)/RPMS/x86_64/c-capnproto-%.x86_64.rpm:
- @echo "Building capnproto RPMs"
- @./build_quagga.sh -a capnproto
-
-############
-# Thrift #
-############
-
-.PHONY: thrift-rpm
-thrift-rpm: $(QUAGGA_RPMS_DIR)/RPMS/x86_64/thrift-%.x86_64.rpm
-
-$(QUAGGA_RPMS_DIR)/RPMS/x86_64/thrift-%.x86_64.rpm:
- @echo "Building Thrift RPMs"
- @./build_quagga.sh -a thrift
diff --git a/build/ansible.cfg b/build/ansible.cfg
new file mode 100644
index 0000000..a9db58a
--- /dev/null
+++ b/build/ansible.cfg
@@ -0,0 +1,11 @@
+[defaults]
+retry_files_enabled = False
+forks = 25
+timeout = 60
+gather_timeout = 30
+
+[ssh_connection]
+ssh_args = -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o ControlMaster=auto -o ControlPersist=30m -o ServerAliveInterval=5 -o ServerAliveCountMax=5
+retries = 8
+pipelining = True
+
diff --git a/build/barometer-install.sh b/build/barometer-install.sh
deleted file mode 100755
index 15753a4..0000000
--- a/build/barometer-install.sh
+++ /dev/null
@@ -1,152 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright 2017 Intel Corporation.
-#
-# 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.
-
-# Get and install packages needed for Barometer service.
-# These are: collectd rpm's and dependencies, collectd-openstack-plugins,
-# puppet-barometer module.
-source ./variables.sh
-
-# Versions/branches
-COLLECTD_OPENSTACK_PLUGINS_BRANCH="stable/pike"
-
-ARCH="6.el7.centos.x86_64.rpm"
-# don't fail because of missing certificate
-GETFLAG="--no-check-certificate"
-
-# Locations of repos
-ARTIFACTS_BAROM="artifacts.opnfv.org/barometer"
-COLLECTD_OPENSTACK_REPO="https://github.com/openstack/collectd-ceilometer-plugin"
-PUPPET_BAROMETER_REPO="https://github.com/johnhinman/puppet-barometer"
-
-# upload barometer packages tar, extract, and install
-
-function barometer_pkgs {
- OVERCLOUD_IMAGE=$1
-
- # get collectd packages and upload to image
- echo "adding barometer to " $1
- rm -rf barometer
- mkdir barometer
- pushd barometer > /dev/null
-
- # get version of barometer packages to download
- wget $GETFLAG $ARTIFACTS_BAROM/latest.properties
- BAROMETER_VER=$(grep OPNFV_ARTIFACT_VERSION ./latest.properties | cut -d'=' -f2)
- echo "BAROMETER version = $BAROMETER_VER"
-
- # get collectd version from HTML
- wget $GETFLAG $ARTIFACTS_BAROM.html
- COLLECTD_VER=$(grep "$BAROMETER_VER/collectd-debuginfo" ./barometer.html \
- | cut -d'-' -f7)
- SUFFIX=$COLLECTD_VER-$ARCH
-
- # get intel_rdt version
- INTEL_RDT_VER=$(grep "$BAROMETER_VER/intel-cmt-cat-devel" ./barometer.html \
- | cut -d'-' -f9)
- RDT_SUFFIX=$INTEL_RDT_VER-1.el7.centos.x86_64.rpm
-
- wget $GETFLAG $ARTIFACTS_BAROM/$BAROMETER_VER/libcollectdclient-$SUFFIX
- wget $GETFLAG $ARTIFACTS_BAROM/$BAROMETER_VER/libcollectdclient-devel-$SUFFIX
- wget $GETFLAG $ARTIFACTS_BAROM/$BAROMETER_VER/collectd-$SUFFIX
- wget $GETFLAG $ARTIFACTS_BAROM/$BAROMETER_VER/collectd-utils-$SUFFIX
- wget $GETFLAG $ARTIFACTS_BAROM/$BAROMETER_VER/collectd-ovs_events-$SUFFIX
- wget $GETFLAG $ARTIFACTS_BAROM/$BAROMETER_VER/collectd-ovs_stats-$SUFFIX
- wget $GETFLAG $ARTIFACTS_BAROM/$BAROMETER_VER/collectd-virt-$SUFFIX
- wget $GETFLAG $ARTIFACTS_BAROM/$BAROMETER_VER/intel-cmt-cat-$RDT_SUFFIX
- wget $GETFLAG $ARTIFACTS_BAROM/$BAROMETER_VER/intel-cmt-cat-devel-$RDT_SUFFIX
- wget $GETFLAG $ARTIFACTS_BAROM/$BAROMETER_VER/collectd-python-$SUFFIX
- wget $GETFLAG $ARTIFACTS_BAROM/$BAROMETER_VER/collectd-snmp-$SUFFIX
- wget $GETFLAG $ARTIFACTS_BAROM/$BAROMETER_VER/collectd-snmp_agent-$SUFFIX
- wget $GETFLAG $ARTIFACTS_BAROM/$BAROMETER_VER/collectd-intel_rdt-$SUFFIX
- curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
-
- tar cfz collectd.tar.gz *.rpm get-pip.py
- cp collectd.tar.gz ${BUILD_DIR}
- popd > /dev/null
-
- # get collectd-openstack-plugins and tar it
- rm -rf collectd-openstack-plugins
- git clone $COLLECTD_OPENSTACK_REPO collectd-openstack-plugins
- pushd collectd-openstack-plugins
- git checkout $COLLECTD_OPENSTACK_PLUGINS_BRANCH
- git archive --format=tar.gz HEAD > ${BUILD_DIR}/collectd-openstack-plugins.tar.gz
- popd > /dev/null
-
- # get the barometer puppet module and tar it
- rm -rf puppet-barometer
- git clone $PUPPET_BAROMETER_REPO
- pushd puppet-barometer/ > /dev/null
- git archive --format=tar.gz HEAD > ${BUILD_DIR}/puppet-barometer.tar.gz
- popd > /dev/null
-
- # get mibs for the snmp plugin
- rm -rf barometer
- git clone https://gerrit.opnfv.org/gerrit/barometer
- pushd barometer/mibs > /dev/null
- git archive --format=tar.gz HEAD > ${BUILD_DIR}/mibs.tar.gz
- popd > /dev/null
-
- # Upload tar files to image
- # untar collectd packages
- # install dependencies
- LIBGUESTFS_BACKEND=direct $VIRT_CUSTOMIZE \
- --upload ${BUILD_DIR}/collectd.tar.gz:/opt/ \
- --upload ${BUILD_DIR}/collectd-openstack-plugins.tar.gz:/opt/ \
- --upload ${BUILD_DIR}/puppet-barometer.tar.gz:/etc/puppet/modules/ \
- --run-command 'tar xfz /opt/collectd.tar.gz -C /opt' \
- --install libstatgrab,log4cplus,rrdtool,rrdtool-devel \
- --install mcelog,python34,python34-libs,python34-devel \
- --install libvirt,libvirt-devel,gcc \
- -a $OVERCLOUD_IMAGE
-
- LIBGUESTFS_BACKEND=direct $VIRT_CUSTOMIZE \
- --run-command 'python3.4 /opt/get-pip.py' \
- --run-command 'pip3 install requests libvirt-python pbr babel future six' \
- -a $OVERCLOUD_IMAGE
-
- LIBGUESTFS_BACKEND=direct $VIRT_CUSTOMIZE \
- --run-command "yum install -y \
- /opt/libcollectdclient-${SUFFIX} \
- /opt/libcollectdclient-devel-${SUFFIX} \
- /opt/collectd-${SUFFIX} \
- /opt/collectd-utils-${SUFFIX} \
- /opt/collectd-python-${SUFFIX} \
- /opt/collectd-ovs_events-${SUFFIX} \
- /opt/collectd-ovs_stats-${SUFFIX} \
- /opt/intel-cmt-cat-${RDT_SUFFIX} \
- /opt/intel-cmt-cat-devel-${RDT_SUFFIX} \
- /opt/collectd-intel_rdt-${SUFFIX} \
- /opt/collectd-snmp-${SUFFIX} \
- /opt/collectd-snmp_agent-${SUFFIX} \
- /opt/collectd-virt-${SUFFIX}" \
- -a $OVERCLOUD_IMAGE
-
- # install collectd-openstack-plugins
- # install puppet-barometer module
- # make directories for config files and mibs
- LIBGUESTFS_BACKEND=direct $VIRT_CUSTOMIZE \
- --run-command 'mkdir /opt/stack/collectd-openstack' \
- --run-command "tar xfz /opt/collectd-openstack-plugins.tar.gz -C /opt/stack/collectd-openstack" \
- --run-command "cd /etc/puppet/modules/ && mkdir barometer && \
- tar xzf puppet-barometer.tar.gz -C barometer" \
- --run-command 'mkdir /usr/share/mibs/' \
- --upload ${BUILD_DIR}/mibs.tar.gz:/usr/share/snmp/mibs/ \
- --run-command 'tar xfz /usr/share/snmp/mibs/mibs.tar.gz -C /usr/share/snmp/mibs/' \
- --run-command 'ln -s /usr/share/snmp/mibs/ /usr/share/mibs/ietf' \
- --run-command 'mkdir -p /etc/collectd/collectd.conf.d' \
- -a $OVERCLOUD_IMAGE
-}
-
diff --git a/build/build_ovs_nsh.sh b/build/build_ovs_nsh.sh
new file mode 100644
index 0000000..4e15c36
--- /dev/null
+++ b/build/build_ovs_nsh.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+##############################################################################
+# Copyright (c) 2016 Tim Rozet (Red Hat) and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+set -e
+
+./boot.sh
+libtoolize --force
+aclocal
+autoheader
+automake --force-missing --add-missing
+autoconf
+./configure
+make rpm-fedora RPMBUILD_OPT="\"-D kversion `rpm -q kernel | rpmdev-sort | tail -n -1 | sed 's/^kernel-//'`\" --without check"
+make rpm-fedora-kmod RPMBUILD_OPT="\"-D kversion `rpm -q kernel | rpmdev-sort | tail -n -1 | sed 's/^kernel-//'`\"" \ No newline at end of file
diff --git a/build/build_quagga.sh b/build/build_quagga.sh
deleted file mode 100755
index e33cd27..0000000
--- a/build/build_quagga.sh
+++ /dev/null
@@ -1,251 +0,0 @@
-#!/usr/bin/env bash
-##############################################################################
-# Copyright (c) 2017 Tim Rozet (Red Hat) and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-set -xe
-
-ARTIFACT=None
-
-# Builds Quagga, Zebra and other dependency RPMs for CentOS 7
-# Install package dependencies
-install_quagga_build_deps() {
- sudo yum -y install automake bison flex libtool make readline-devel \
- texinfo texi2html rpm-build libcap-devel groff net-snmp-devel pam-devel glib2 glib2-devel epel-release spectool \
- wget git gcc-c++ openssl-devel boost-devel boost-static gtest zeromq-4.1.4 zeromq-devel-4.1.4 \
- capnproto-devel capnproto-libs capnproto
- sudo yum -y groupinstall "Development Tools"
-}
-
-display_usage ()
-{
-cat << EOF
-$0 Builds Quagga/ZRPC and Dependency RPMs
-
-usage: $0 [ [-a | --artifact] artifact ]
-
-OPTIONS:
- -a artifact to build (thrift, capnproto, quagga, zrpc). Default: All artifacts.
- -c clean all build directories
- -h help, prints this help text
-
-Example:
-build_quagga.sh -a thrift
-EOF
-}
-
-parse_cmdline() {
- while [ "${1:0:1}" = "-" ]
- do
- case "$1" in
- -h|--help)
- display_usage
- exit 0
- ;;
- -a|--artifact)
- ARTIFACT=${2}
- shift 2
- ;;
- -c|--clean)
- CLEAN="True"
- shift 1
- ;;
- *)
- display_usage
- exit 1
- ;;
- esac
- done
-
-}
-
-# Removes build directory folder and re-creates RPM DIRs to use
-function quagga_clean(){
- rm -rf ${QUAGGA_BUILD_DIR}
- sudo yum remove -y zrpc* quagga* thrift* c-capnproto*
-}
-
-# Build Thrift RPM
-function build_thrift(){
- rm -rf thrift
- git clone https://git-wip-us.apache.org/repos/asf/thrift.git
- pushd thrift
- git checkout 0.10.0
- wget https://issues.apache.org/jira/secure/attachment/12840511/0002-THRIFT-3986-using-autoreconf-i-fails-because-of-miss.patch
- wget https://issues.apache.org/jira/secure/attachment/12840512/0001-THRIFT-3987-externalise-declaration-of-thrift-server.patch
- patch -p1 < 0002-THRIFT-3986-using-autoreconf-i-fails-because-of-miss.patch
- patch -p1 < 0001-THRIFT-3987-externalise-declaration-of-thrift-server.patch
- autoreconf -i
- ./configure --without-qt4 --without-qt5 --without-csharp --without-java \
- --without-erlang --without-nodejs --without-perl --without-python \
- --without-php --without-php_extension --without-dart --without-ruby \
- --without-haskell --without-go --without-haxe --without-d
- # Hack somehow the testing file of php is not there
- # We will disable php anyhow later on.
- touch lib/php/src/ext/thrift_protocol/run-tests.php
- make dist
- pushd contrib/
- spectool -g -R thrift.spec
- mv ../thrift-*.tar.gz $rpmbuild/SOURCES/
- rpmbuild --define "_topdir $rpmbuild" -ba thrift.spec --define "without_ruby 1" --define "without-php 1"
- popd > /dev/null
- popd > /dev/null
-}
-
-# c-capnproto RPM
-# This is a library for capnproto in C. Not to be confused with
-# the capnproto provided by the repos
-function build_capnproto(){
- rm -rf c-capnproto
- git clone https://github.com/opensourcerouting/c-capnproto
- pushd c-capnproto
- git checkout 332076e52257
- autoreconf -i
- ./configure --without-gtest
- make dist
-
- cp ${BUILD_ROOT}/rpm_specs/c_capnproto.spec $rpmbuild/SPECS/
- cp c-capnproto-*.tar.gz $rpmbuild/SOURCES/
- rpmbuild --define "_topdir $rpmbuild" -ba $rpmbuild/SPECS/c_capnproto.spec
- popd > /dev/null
-}
-
-build_quagga(){
- # Build Quagga
- rm -rf quagga
- sudo yum -y install $rpmbuild/RPMS/x86_64/*.rpm
- git clone https://github.com/6WIND/quagga.git
- pushd quagga > /dev/null
- # checkout the parent of the bellow patch.
- # Once the issue addressed by the patch is fixed
- # these two lines can be removed.
- git checkout 95bb0f4a
- patch -p1 < ${PATCHES_DIR}/fix_quagga_make_dist.patch
- autoreconf -i
- ./configure --with-zeromq --with-ccapnproto --enable-user=quagga \
- --enable-group=quagga --enable-vty-group=quagga \
- --disable-doc --enable-multipath=64
-
- # Quagga RPM
- make dist
- cp ${BUILD_ROOT}/rpm_specs/quagga.spec $rpmbuild/SPECS/
- cp quagga*.tar.gz $rpmbuild/SOURCES/
- cat > $rpmbuild/SOURCES/bgpd.conf <<EOF
-hostname bgpd
-password sdncbgpc
-service advanced-vty
-log stdout
-line vty
- exec-timeout 0 0
-debug bgp
-debug bgp updates
-debug bgp events
-debug bgp fsm
-EOF
- rpmbuild --define "_topdir $rpmbuild" -ba $rpmbuild/SPECS/quagga.spec
- popd > /dev/null
-}
-
-# Build ZPRC
-build_zrpc(){
- sudo yum -y install $rpmbuild/RPMS/x86_64/*.rpm
- rm -rf zrpcd
- git clone https://github.com/6WIND/zrpcd.git
- pushd zrpcd > /dev/null
- touch NEWS README
- export QUAGGA_CFLAGS='-I/usr/include/quagga/'
- # checkout the parent of the bellow patch.
- # Once the issue addressed by the patch is fixed
- # these two lines can be removed.
- git checkout 9bd1ee8e
- patch -p1 < ${PATCHES_DIR}/fix_zrpcd_make_dist.patch
- patch -p1 < ${PATCHES_DIR}/zrpcd_hardcoded_paths.patch
- autoreconf -i
-
- # ZRPC RPM
- ./configure --enable-zrpcd \
- --enable-user=quagga --enable-group=quagga \
- --enable-vty-group=quagga --with-thrift-version=4
- make dist
-
- cat > $rpmbuild/SOURCES/zrpcd.service <<EOF
-[Unit]
-Description=ZRPC daemon for quagga
-After=network.service
-
-[Service]
-ExecStart=/usr/sbin/zrpcd
-Type=simple
-ExecStartPre=-/usr/bin/mkdir /var/run/quagga/
-ExecStartPre=/usr/bin/chown -R quagga:quagga /var/run/quagga/
-PIDFile=/var/run/zrpcd.pid
-
-[Install]
-WantedBy=default.target
-EOF
- cp zrpcd-*.tar.gz $rpmbuild/SOURCES/
- cp ${BUILD_ROOT}/rpm_specs/zrpc.spec $rpmbuild/SPECS/
- rpmbuild --define "_topdir $rpmbuild" -ba $rpmbuild/SPECS/zrpc.spec
-}
-
-# Main
-parse_cmdline "$@"
-
-# Check env vars
-if [ -z "$QUAGGA_BUILD_DIR" ]; then
- echo "ERROR: You must set QUAGGA_BUILD_DIR env variable as the location to build!"
- exit 1
-elif [ -z "$QUAGGA_RPMS_DIR" ]; then
- echo "WARN: QUAGGA_RPMS_DIR env var is not set, will default to QUAGGA_BUILD_DIR/rpmbuild"
- rpmbuild=${QUAGGA_BUILD_DIR}/rpmbuild
-else
- rpmbuild=${QUAGGA_RPMS_DIR}
-fi
-
-if [ -z "$BUILD_ROOT" ]; then
- echo "WARN: BUILD_ROOT env var not set, will default to $(pwd)"
- BUILD_ROOT=$(pwd)
-fi
-
-if [ -z "$PATCHES_DIR" ]; then
- echo "WARN: PATCHES_DIR env var not set, will default to ${BUILD_ROOT}/patches"
- PATCHES_DIR=${BUILD_ROOT}/patches
-fi
-
-if [ -n "$CLEAN" ]; then
- quagga_clean
-fi
-
-install_quagga_build_deps
-
-mkdir -p ${QUAGGA_BUILD_DIR}
-mkdir -p $rpmbuild $rpmbuild/SOURCES $rpmbuild/SPECS $rpmbuild/RPMS
-pushd $QUAGGA_BUILD_DIR > /dev/null
-
-case "$ARTIFACT" in
- thrift)
- build_thrift
- ;;
- capnproto)
- build_capnproto
- ;;
- quagga)
- build_quagga
- ;;
- zrpc)
- build_zrpc
- ;;
- *)
- build_thrift
- build_capnproto
- build_quagga
- build_zprc
- ;;
-esac
-
-popd > /dev/null
diff --git a/build/c7-opnfv-x86_64-comps.xml b/build/c7-opnfv-x86_64-comps.xml
deleted file mode 100644
index b76143d..0000000
--- a/build/c7-opnfv-x86_64-comps.xml
+++ /dev/null
@@ -1,7995 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE comps PUBLIC "-//CentOS//DTD Comps info//EN" "comps.dtd">
-<comps>
- <group>
- <id>apex-opendaylight</id>
- <name>OPNFV Apex OpenDaylight Support</name>
- <description>Disk images and configuration files used to launch an Apex OpenDaylight deployment.</description>
- <default>false</default>
- <uservisible>false</uservisible>
- <packagelist>
- <packagereq type="mandatory">opnfv-apex</packagereq>
- <packagereq type="mandatory">opnfv-common</packagereq>
- <packagereq type="mandatory">opnfv-undercloud</packagereq>
- </packagelist>
- </group>
- <group>
- <id>apex-onos</id>
- <name>OPNFV Apex ONOS Support</name>
- <description>Disk images and configuration files used to launch an Apex ONOS deployment.</description>
- <default>false</default>
- <uservisible>false</uservisible>
- <packagelist>
- <packagereq type="mandatory">opnfv-apex-onos</packagereq>
- <packagereq type="mandatory">opnfv-common</packagereq>
- <packagereq type="mandatory">opnfv-undercloud</packagereq>
- </packagelist>
- </group>
- <group>
- <id>additional-devel</id>
- <name>Additional Development</name>
- <name xml:lang="as">অতিৰিক্ত উন্নয়ন</name>
- <name xml:lang="bn">অতিরিক্ত ডিভেলপমেন্ট</name>
- <name xml:lang="bn_IN">অতিরিক্ত ডিভেলপমেন্ট</name>
- <name xml:lang="cs">Doplňky pro vývoj</name>
- <name xml:lang="de">Zusätzliche Entwicklung</name>
- <name xml:lang="es">Desarrollo adicional</name>
- <name xml:lang="fr">Développement supplémentaire</name>
- <name xml:lang="gu">વધારાનાં વિકાસ</name>
- <name xml:lang="hi">अतिरिक्त विकास</name>
- <name xml:lang="ia">Disveloppamento additional</name>
- <name xml:lang="it">Sviluppo aggiuntivo</name>
- <name xml:lang="ja">その他の開発</name>
- <name xml:lang="kn">ಹೆಚ್ಚುವರಿ ವಿಕಸನೆ</name>
- <name xml:lang="ko">추가 개발</name>
- <name xml:lang="ml">അധികമായ ഡവലപ്പ്മെന്റ്</name>
- <name xml:lang="mr">अगाऊ डेव्हलपमेंट</name>
- <name xml:lang="or">ଅତିରିକ୍ତ ସର୍ଭର ବିକାଶ</name>
- <name xml:lang="pa">ਵਧੀਕ ਵਿਕਾਸ</name>
- <name xml:lang="pl">Dodatkowe programowanie</name>
- <name xml:lang="pt_BR">Desenvolvimento adicional</name>
- <name xml:lang="ru">Дополнительные средства разработки</name>
- <name xml:lang="sv">Ytterligare utveckling</name>
- <name xml:lang="ta">கூடுதல் உருவாக்கம்</name>
- <name xml:lang="te">అదనపు అభివృద్ది</name>
- <name xml:lang="uk">Додаткові інструменти розробки</name>
- <name xml:lang="zh_CN">附加开发</name>
- <name xml:lang="zh_TW">額外開發</name>
- <description>Additional development headers and libraries for building open-source applications.</description>
- <description xml:lang="cs">Doplňkové knihovny a hlavičkové soubory pro sestavování aplikací.</description>
- <description xml:lang="de">Zusätzliche Entwicklungs-Header und -Bibliotheken zur Entwicklung von Open-Source-Applikationen.</description>
- <description xml:lang="es">Encabezados adicionales y bibliotecas para compilar aplicaciones de código abierto.</description>
- <description xml:lang="fr">En-têtes et bibliothèques de développement supplémentaires pour créer des applications open source.</description>
- <description xml:lang="gu">ઓપન-સોર્સ કાર્યક્રમો બાંધવા માટેની વધારાની વિકાસ હેડરો અને લાઇબ્રેરીઓ.</description>
- <description xml:lang="hi">मुक्त स्रोत अनुप्रयोगों के विकास के लिए अतिरिक्त विकास शीर्षिका और लाइब्रेरी.</description>
- <description xml:lang="it">Librerie e intestazioni per uno sviluppo aggiuntivo per la compilazione di applicazioni open-source.</description>
- <description xml:lang="ja">オープンソースアプリケーション構築用のその他開発ヘッダーとライブラリです。</description>
- <description xml:lang="kn">ಮುಕ್ತ-ತಂತ್ರಾಂಶ ಅನ್ವಯಗಳನ್ನು ನಿರ್ಮಿಸಲು ಹೆಚ್ಚುವರಿ ವಿಕಸನಾ ಹೆಡರುಗಳು ಹಾಗು ಲೈಬ್ರರಿಗಳು.</description>
- <description xml:lang="ko">오픈 소스 애플리케이션 구축을 위한 기타 개발 헤더 및 라이브러리입니다.</description>
- <description xml:lang="ml">ഓപ്പണ്‍-സോഴ്സ് പ്രയോഗങ്ങള്‍ തയ്യാറാക്കുന്നതിനുള്ള അധികമായ വികസന ഹെഡറുകളും ലൈബ്രറികളും.</description>
- <description xml:lang="mr">ओपन-सोअर्स ॲप्लिकेशन्सच्या बांधणीकरिता अगाऊ डेव्हलपमेंट हेडर्स.</description>
- <description xml:lang="or">ଅତିରିକ୍ତ ବିକାଶ ଶୀର୍ଷକ ଏବଂ ମୁକ୍ତ ଉତ୍ସ ପ୍ରୟୋଗଗୁଡ଼ିକର ନିର୍ମାଣ ପାଇଁ ଗ୍ରନ୍ଥାଳୟ।</description>
- <description xml:lang="pa">ਓਪਨ-ਸਰੋਤ ਐਪਲੀਕੇਸ਼ਨਾਂ ਦੀ ਉਸਾਰੀ ਲਈ ਵਧੀਕ ਵਿਕਾਸ ਹੈਡਰ ਅਤੇ ਲਾਇਬਰੇਰੀਆਂ।</description>
- <description xml:lang="pl">Dodatkowe nagłówki i biblioteki do rozwijania aplikacji open source.</description>
- <description xml:lang="pt_BR">Cabeçalhos de desenvolvimento adiiconal e bibliotecas para construir aplicativos de fonte aberta.</description>
- <description xml:lang="ru">Дополнительные библиотеки и файлы заголовков для разработки приложений с открытым кодом.</description>
- <description xml:lang="ta">திற மூல பயன்பாடுகளை உருவாக்குவதற்காக கூடுதல் உருவாக்க தலைப்புகள் மற்றும் தரவகங்கள்.</description>
- <description xml:lang="te">ఓపెన్-సోర్స్ అనువర్తనాలను నిర్మించుటకు అదనపు అభివృద్ది పీఠికలు మరియు లైబ్రరీలు.</description>
- <description xml:lang="uk">Додаткові пакунки з заголовками та бібліотеками для розробки програмного забезпечення з відкритим кодом.</description>
- <description xml:lang="zh_CN">用于构建开源应用程序的附加开发标头及程序可。</description>
- <description xml:lang="zh_TW">用來建置開放式原始碼應用程式的應用程式開發表頭與函式庫。</description>
- <default>false</default>
- <uservisible>false</uservisible>
- <packagelist>
- <packagereq type="mandatory">alsa-lib-devel</packagereq>
- <packagereq type="mandatory">audit-libs-devel</packagereq>
- <packagereq type="mandatory">binutils-devel</packagereq>
- <packagereq type="mandatory">boost-devel</packagereq>
- <packagereq type="mandatory">bzip2-devel</packagereq>
- <packagereq type="mandatory">c-ares-devel</packagereq>
- <packagereq type="mandatory">cups-devel</packagereq>
- <packagereq type="mandatory">cyrus-sasl-devel</packagereq>
- <packagereq type="mandatory">dbus-glib-devel</packagereq>
- <packagereq type="mandatory">e2fsprogs-devel</packagereq>
- <packagereq type="mandatory">elfutils-devel</packagereq>
- <packagereq type="mandatory">elfutils-libelf-devel</packagereq>
- <packagereq type="mandatory">evolution-data-server-devel</packagereq>
- <packagereq type="mandatory">expat-devel</packagereq>
- <packagereq type="mandatory">freeglut-devel</packagereq>
- <packagereq type="mandatory">fuse-devel</packagereq>
- <packagereq type="mandatory">gmp-devel</packagereq>
- <packagereq type="mandatory">gnome-desktop3-devel</packagereq>
- <packagereq type="mandatory">gnutls-devel</packagereq>
- <packagereq type="mandatory">gstreamer1-devel</packagereq>
- <packagereq type="mandatory">gstreamer1-plugins-base-devel</packagereq>
- <packagereq type="mandatory">gvfs-devel</packagereq>
- <packagereq type="mandatory">hmaccalc</packagereq>
- <packagereq type="mandatory">httpd-devel</packagereq>
- <packagereq type="mandatory">hunspell-devel</packagereq>
- <packagereq type="mandatory">iptables-devel</packagereq>
- <packagereq type="mandatory">java-1.6.0-openjdk-devel</packagereq>
- <packagereq type="mandatory">java-1.7.0-openjdk-devel</packagereq>
- <packagereq type="mandatory">java-1.8.0-openjdk-devel</packagereq>
- <packagereq type="mandatory">junit</packagereq>
- <packagereq type="mandatory">kde-workspace-devel</packagereq>
- <packagereq type="mandatory">kdegraphics-devel</packagereq>
- <packagereq type="mandatory">kdelibs-devel</packagereq>
- <packagereq type="mandatory">kdenetwork-devel</packagereq>
- <packagereq type="mandatory">kdepim-devel</packagereq>
- <packagereq type="mandatory">kdepimlibs-devel</packagereq>
- <packagereq type="mandatory">kdesdk-devel</packagereq>
- <packagereq type="mandatory">libacl-devel</packagereq>
- <packagereq type="mandatory">libaio-devel</packagereq>
- <packagereq type="mandatory">libatomic-static</packagereq>
- <packagereq type="mandatory">libattr-devel</packagereq>
- <packagereq type="mandatory">libblkid-devel</packagereq>
- <packagereq type="mandatory">libcanberra-devel</packagereq>
- <packagereq type="mandatory">libcap-devel</packagereq>
- <packagereq type="mandatory">libcap-ng-devel</packagereq>
- <packagereq type="mandatory">libcurl-devel</packagereq>
- <packagereq type="mandatory">libdrm-devel</packagereq>
- <packagereq type="mandatory">libgcrypt-devel</packagereq>
- <packagereq type="mandatory">libgnome-keyring-devel</packagereq>
- <packagereq type="mandatory">libgudev1-devel</packagereq>
- <packagereq type="mandatory">libhugetlbfs-devel</packagereq>
- <packagereq type="mandatory">libitm-devel</packagereq>
- <packagereq type="mandatory">libnl-devel</packagereq>
- <packagereq type="mandatory">libnotify-devel</packagereq>
- <packagereq type="mandatory">libpfm-devel</packagereq>
- <packagereq type="mandatory">librsvg2-devel</packagereq>
- <packagereq type="mandatory">libselinux-devel</packagereq>
- <packagereq type="mandatory">libsoup-devel</packagereq>
- <packagereq type="mandatory">libtiff-devel</packagereq>
- <packagereq type="mandatory">libusbx-devel</packagereq>
- <packagereq type="mandatory">libuuid-devel</packagereq>
- <packagereq type="mandatory">libXau-devel</packagereq>
- <packagereq type="mandatory">libXaw-devel</packagereq>
- <packagereq type="mandatory">libXinerama-devel</packagereq>
- <packagereq type="mandatory">libXmu-devel</packagereq>
- <packagereq type="mandatory">libXpm-devel</packagereq>
- <packagereq type="mandatory">libXrandr-devel</packagereq>
- <packagereq type="mandatory">libxslt-devel</packagereq>
- <packagereq type="mandatory">mariadb-devel</packagereq>
- <packagereq type="mandatory">motif-devel</packagereq>
- <packagereq type="mandatory">mpfr-devel</packagereq>
- <packagereq type="mandatory">net-snmp-devel</packagereq>
- <packagereq type="mandatory">numactl-devel</packagereq>
- <packagereq type="mandatory">openlmi-providers-devel</packagereq>
- <packagereq type="mandatory">papi-devel</packagereq>
- <packagereq type="mandatory">pcre-devel</packagereq>
- <packagereq type="mandatory">perl-App-cpanminus</packagereq>
- <packagereq type="mandatory">perl-devel</packagereq>
- <packagereq type="mandatory">perl-ExtUtils-MakeMaker</packagereq>
- <packagereq type="mandatory">perl-homedir</packagereq>
- <packagereq type="mandatory">perl-Test-Pod</packagereq>
- <packagereq type="mandatory">perl-Test-Pod-Coverage</packagereq>
- <packagereq type="mandatory">polkit-devel</packagereq>
- <packagereq type="mandatory">popt-devel</packagereq>
- <packagereq type="mandatory">postgresql-devel</packagereq>
- <packagereq type="mandatory">pulseaudio-libs-devel</packagereq>
- <packagereq type="mandatory">pygobject3-devel</packagereq>
- <packagereq type="mandatory">PyQt4-devel</packagereq>
- <packagereq type="mandatory">python-devel</packagereq>
- <packagereq type="mandatory">python-setuptools</packagereq>
- <packagereq type="mandatory">qt-mysql</packagereq>
- <packagereq type="mandatory">qt-odbc</packagereq>
- <packagereq type="mandatory">qt-postgresql</packagereq>
- <packagereq type="mandatory">qt3-MySQL</packagereq>
- <packagereq type="mandatory">qt3-ODBC</packagereq>
- <packagereq type="mandatory">qt3-PostgreSQL</packagereq>
- <packagereq type="mandatory">rdma-core-devel</packagereq>
- <packagereq type="mandatory">readline-devel</packagereq>
- <packagereq type="mandatory">sane-backends-devel</packagereq>
- <packagereq type="mandatory">SDL-devel</packagereq>
- <packagereq type="mandatory">sqlite-devel</packagereq>
- <packagereq type="mandatory">startup-notification-devel</packagereq>
- <packagereq type="mandatory">systemd-devel</packagereq>
- <packagereq type="mandatory">tbb-devel</packagereq>
- <packagereq type="mandatory">tcl-devel</packagereq>
- <packagereq type="mandatory">tcp_wrappers-devel</packagereq>
- <packagereq type="mandatory">tk-devel</packagereq>
- <packagereq type="mandatory">unique3-devel</packagereq>
- <packagereq type="mandatory">unixODBC-devel</packagereq>
- <packagereq type="mandatory">xorg-x11-proto-devel</packagereq>
- <packagereq type="mandatory">xz-devel</packagereq>
- <packagereq type="optional">flatpak</packagereq>
- <packagereq type="optional">subversion-gnome</packagereq>
- </packagelist>
- </group>
- <group>
- <id>anaconda-tools</id>
- <name>Anaconda Tools</name>
- <name xml:lang="as">Anaconda সঁজুলিসমূহ</name>
- <name xml:lang="bn_IN">Anaconda সরঞ্জাম</name>
- <name xml:lang="cs">Nástroje instalátoru Anaconda</name>
- <name xml:lang="de">Anaconda-Werkzeuge</name>
- <name xml:lang="es">Herramientas de Anaconda</name>
- <name xml:lang="fr">Outils Anaconda</name>
- <name xml:lang="gu">એનાકોન્ડા સાધનો</name>
- <name xml:lang="hi">एनाकोंडा औज़ार</name>
- <name xml:lang="it">Strumenti di Anaconda</name>
- <name xml:lang="ja">Anaconda ツール</name>
- <name xml:lang="kn">Anaconda ಉಪಕರಣಗಳು</name>
- <name xml:lang="ko">Anaconda 도구</name>
- <name xml:lang="ml">അനക്കോണ്ട പ്രയോഗങ്ങള്‍</name>
- <name xml:lang="mr">ॲनाकाँडा साधने</name>
- <name xml:lang="or">Anaconda ସାଧନଗୁଡ଼ିକ</name>
- <name xml:lang="pa">ਐਨਾਕੋਂਡਾ ਸੰਦ</name>
- <name xml:lang="pl">Narzędzia dla instalatora Anaconda</name>
- <name xml:lang="pt_BR">Ferramentas do Anaconda</name>
- <name xml:lang="ru">Инструменты Anaconda.</name>
- <name xml:lang="ta">Anaconda கருவிகள்</name>
- <name xml:lang="te">అనకొండ సాధనాలు</name>
- <name xml:lang="uk">Інструменти Anaconda</name>
- <name xml:lang="zh_CN">Anaconda 工具</name>
- <name xml:lang="zh_TW">Anaconda 工具</name>
- <description/>
- <default>false</default>
- <uservisible>false</uservisible>
- <packagelist>
- <packagereq type="mandatory">authconfig</packagereq>
- <packagereq type="mandatory">btrfs-progs</packagereq>
- <packagereq type="mandatory">chkconfig</packagereq>
- <packagereq type="mandatory">chrony</packagereq>
- <packagereq type="mandatory">cryptsetup</packagereq>
- <packagereq type="mandatory">device-mapper-multipath</packagereq>
- <packagereq type="mandatory">dmraid</packagereq>
- <packagereq type="mandatory">dosfstools</packagereq>
- <packagereq type="mandatory">dracut-network</packagereq>
- <packagereq type="mandatory">e2fsprogs</packagereq>
- <packagereq type="mandatory">efibootmgr</packagereq>
- <packagereq type="mandatory">fcoe-utils</packagereq>
- <packagereq type="mandatory">firewalld</packagereq>
- <packagereq type="mandatory">gfs2-utils</packagereq>
- <packagereq type="mandatory">iscsi-initiator-utils</packagereq>
- <packagereq type="mandatory">lvm2</packagereq>
- <packagereq type="mandatory">mdadm</packagereq>
- <packagereq type="mandatory">system-config-firewall-base</packagereq>
- <packagereq type="mandatory">tboot</packagereq>
- <packagereq type="mandatory">tmux</packagereq>
- <packagereq type="mandatory">xfsprogs</packagereq>
- <packagereq type="default">grub2</packagereq>
- <packagereq type="default">shim-x64</packagereq>
- <packagereq type="optional">dbxtool</packagereq>
- <packagereq type="optional">grub2-efi-ia32</packagereq>
- <packagereq type="optional">grub2-efi-ia32-modules</packagereq>
- <packagereq type="optional">grub2-efi-x64</packagereq>
- <packagereq type="optional">grub2-efi-x64-modules</packagereq>
- <packagereq type="optional">grub2-pc</packagereq>
- <packagereq type="optional">oscap-anaconda-addon</packagereq>
- <packagereq type="optional">shim-ia32</packagereq>
- <packagereq type="optional">shim-unsigned-ia32</packagereq>
- <packagereq type="optional">shim-unsigned-x64</packagereq>
- </packagelist>
- </group>
- <group>
- <id>backup-client</id>
- <name>Backup Client</name>
- <name xml:lang="as">বেক-আপ ক্লাএন্ট</name>
- <name xml:lang="bn">ব্যাক-আপ ক্লায়েন্ট</name>
- <name xml:lang="bn_IN">ব্যাক-আপ ক্লায়েন্ট</name>
- <name xml:lang="cs">Zálohovací klient</name>
- <name xml:lang="de">Backup-Client</name>
- <name xml:lang="es">Cliente de respaldo</name>
- <name xml:lang="eu">Babeskopia-bezeroa</name>
- <name xml:lang="fr">Client de sauvegarde</name>
- <name xml:lang="gu">બેકઅપ ક્લાયન્ટ</name>
- <name xml:lang="hi">बैकअप क्लाइंट</name>
- <name xml:lang="ia">Cliente de retrocopiage</name>
- <name xml:lang="it">Client di backup</name>
- <name xml:lang="ja">バックアップクライアント</name>
- <name xml:lang="kn">ಬ್ಯಾಕ್ಅಪ್ ಕ್ಲೈಂಟ್</name>
- <name xml:lang="ko">백업 클라이언트</name>
- <name xml:lang="ml">ബാക്കപ്പ് ക്ലയന്റ്</name>
- <name xml:lang="mr">बॅकअप क्लाएंट</name>
- <name xml:lang="or">ନକଲ ସଂରକ୍ଷଣ କ୍ଲାଏଣ୍ଟ</name>
- <name xml:lang="pa">ਬੈਕਅੱਪ ਕਲਾਂਈਟ</name>
- <name xml:lang="pl">Klient kopii zapasowych</name>
- <name xml:lang="pt_BR">Cliente Backup</name>
- <name xml:lang="ru">Резервный клиент</name>
- <name xml:lang="sv">Säkerhetskopieringsklient</name>
- <name xml:lang="ta">பின்சேமிப்பு வாடிக்கையாளர்</name>
- <name xml:lang="te">బ్యాకప్ క్లైంట్</name>
- <name xml:lang="uk">Клієнт резервного копіювання</name>
- <name xml:lang="zh_CN">备份客户端</name>
- <name xml:lang="zh_TW">備份客戶端</name>
- <description>Client tools for connecting to a backup server and doing backups.</description>
- <description xml:lang="as">বেক-আপ চাৰ্ভাৰৰ সৈতে সংযোগ স্থাপন কৰি বেক-আপ কৰাৰ বাবে ক্লাএন্ট সঁজুলিসমূহ।</description>
- <description xml:lang="bn">ব্যাক-আপ সার্ভারের সাথে সংযোগ স্থাপন করে ব্যাক-আপ করার জন্য ব্যবহারযোগ্য ক্লায়েন্ট প্রান্তের সরঞ্জাম।</description>
- <description xml:lang="bn_IN">ব্যাক-আপ সার্ভারের সাথে সংযোগ স্থাপন করে ব্যাক-আপ করার জন্য ব্যবহারযোগ্য ক্লায়েন্ট প্রান্তের সরঞ্জাম।</description>
- <description xml:lang="cs">Klientské nástroje pro přístup na zálohovací servery a provádění záloh.</description>
- <description xml:lang="de">Client-Tools zur Verbindung mit einem Backup-Server und zur Durchführung von Backups.</description>
- <description xml:lang="es">Herramientas de cliente para conectarse a un servidor de respaldo y hacer copias de seguridad.</description>
- <description xml:lang="fr">Outils client pour connecter à un serveur de sauvegarde et faire des copies de sauvegarde.</description>
- <description xml:lang="gu">બેકઅપ સર્વર સાથે જોડાવવા માટે ક્લાયન્ટ સાધન અને બેકઅપ લઇ રહ્યા છે.</description>
- <description xml:lang="hi">किसी बैकअप सर्वर से कनेक्ट करने और बैकअप लेने के लिए क्लाइंट.</description>
- <description xml:lang="ia">Utensiles pro connecter al servitor de retrocopias e exequer salvamento de datos.</description>
- <description xml:lang="it">Tool del client per il collegamento ad un server di backup ed esecuzione di backup.</description>
- <description xml:lang="ja">バックアップサーバーに接続しバックアップを実行するためのクライアントツール</description>
- <description xml:lang="kn">ಬ್ಯಾಕ್ಅಪ್ ಪೂರೈಕೆಗಣಕದೊಂದಿಗೆ ಸಂಪರ್ಕಸಾಧಿಸಲು ಹಾಗು ಬ್ಯಾಕ್ಅಪ್ ಅನ್ನು ನಿರ್ವಹಿಸಲು ಬಳಸಲಾಗುವ ಬ್ಯಾಕ್ಅಪ್ ಉಪಕರಣಗಳು.</description>
- <description xml:lang="ko">백업 서버에 접속하고 백업을 수행하기 위한 클라이언트 도구</description>
- <description xml:lang="ml">ബാക്കപ്പ് സര്‍വറിലേക്ക് കണക്ട് ചെയ്തു് ബാക്കപ്പുകള്‍ എടുക്കുന്നതിനുള്ള ക്ലയന്റ് ഉപകരണങ്ങള്‍.</description>
- <description xml:lang="mr">बॅकअप सर्व्हरशी जोडणी करण्यासाठी व बॅकअप्स् करीता क्लाएंट साधने.</description>
- <description xml:lang="or">ନକଲ ସଂରକ୍ଷଣ ସର୍ଭର ସହିତ ସଂଯୋଗ କରି ନକଲ ସଂରକ୍ଷଣ କରିବା ପାଇଁ କ୍ଲାଏଣ୍ଟ ସାଧନଗୁଡ଼ିକ।</description>
- <description xml:lang="pa">ਬੈਕਅੱਪ ਸਰਵਰ ਨਾਲ ਜੁੜਨ ਅਤੇ ਬੈਕਅੱਪ ਲੈਣ ਲਈ ਕਲਾਂਈਟ ਟੂਲ।</description>
- <description xml:lang="pl">Narzędzia klienckie do łączenia się z serwerem kopii zapasowych i wykonywanie kopii zapasowych.</description>
- <description xml:lang="pt_BR">Ferramentas de cliente para conectar ao servidor de backup e para fazer backups.</description>
- <description xml:lang="ru">Инструменты клиента для подключения к резервному серверу и создания резервных копий.</description>
- <description xml:lang="sv">Klientverktyg för att ansluta till en säkerhetskopieringsserver och göra säkerhetskopior.</description>
- <description xml:lang="ta">ஒரு பின்சேமிப்பு சேவையகம் மற்றும் பின்சேமிப்புகளை செய்தலை இணைப்பற்கான வாடிக்கையாளர் கருவிகள்.</description>
- <description xml:lang="te">బ్యాకప్ సర్వర్‌కు అనుసంధానమగుటకు మరియు బ్యాకప్స్ తీయుటకు క్లైంట్ సాధనములు.</description>
- <description xml:lang="uk">Клієнтські програми для встановлення з’єднання з сервером резервного копіювання та створення резервних копій.</description>
- <description xml:lang="zh_CN">用来连接到备份服务器并进行备份的客户端工具。</description>
- <description xml:lang="zh_TW">用來連至備份伺服器並進行備份的客戶端工具。</description>
- <default>false</default>
- <uservisible>false</uservisible>
- <packagelist>
- <packagereq type="mandatory">amanda-client</packagereq>
- <packagereq type="optional">bacula-client</packagereq>
- <packagereq type="optional">rear</packagereq>
- </packagelist>
- </group>
- <group>
- <id>backup-server</id>
- <name>Backup Server</name>
- <name xml:lang="as">বেক-আপ চাৰ্ভাৰ</name>
- <name xml:lang="bn">ব্যাক-আপ সার্ভার</name>
- <name xml:lang="bn_IN">ব্যাক-আপ সার্ভার</name>
- <name xml:lang="cs">Zálohovací server</name>
- <name xml:lang="de">Backup-Server</name>
- <name xml:lang="es">Servidor de respaldo</name>
- <name xml:lang="eu">Babeskopia-zerbitzaria</name>
- <name xml:lang="fr">Serveur de sauvegarde</name>
- <name xml:lang="gu">બેકઅપ સર્વર</name>
- <name xml:lang="hi">बैकअप सर्वर</name>
- <name xml:lang="ia">Servitor de retrocopias</name>
- <name xml:lang="it">Server di backup</name>
- <name xml:lang="ja">バックアップサーバー</name>
- <name xml:lang="kn">ಬ್ಯಾಕ್ಅಪ್ ಪೂರೈಕೆಗಣಕ</name>
- <name xml:lang="ko">백업 서버</name>
- <name xml:lang="ml">ബാക്കപ്പ് സര്‍വര്‍</name>
- <name xml:lang="mr">बॅकअप सर्व्हर</name>
- <name xml:lang="or">ନକଲ ସଂରକ୍ଷଣ ସର୍ଭର</name>
- <name xml:lang="pa">ਬੈਕਅੱਪ ਸਰਵਰ</name>
- <name xml:lang="pl">Serwer kopii zapasowych</name>
- <name xml:lang="pt_BR">Servidor de backup</name>
- <name xml:lang="ru">Резервный сервер</name>
- <name xml:lang="sv">Säkerhetskopieringsserver</name>
- <name xml:lang="ta">பின்சேமிப்பு சேவையகம்</name>
- <name xml:lang="te">బ్యాకప్ సర్వర్</name>
- <name xml:lang="uk">Сервер резервування</name>
- <name xml:lang="zh_CN">备份服务器</name>
- <name xml:lang="zh_TW">備份伺服器</name>
- <description>Software to centralize your infrastructure's backups.</description>
- <description xml:lang="as">আন্তঃগাথনীত বেক-আপ কেন্দ্ৰস্থিত কৰাৰ বাবে ব্যৱহাৰযোগ্য চফ্টৱেৰ।</description>
- <description xml:lang="bn">পরিকাঠামোর মধ্যে ব্যাক-আপ কেন্দ্রস্থিত করার জন্য ব্যবহারযোগ্য সফ্টওয়্যার।</description>
- <description xml:lang="bn_IN">পরিকাঠামোর মধ্যে ব্যাক-আপ কেন্দ্রস্থিত করার জন্য ব্যবহারযোগ্য সফ্টওয়্যার।</description>
- <description xml:lang="cs">Software centralizující zálohy vaší infrastruktury.</description>
- <description xml:lang="de">Software zur Zentralisierung Ihrer Infrastruktur-Datensicherungen.</description>
- <description xml:lang="es">Software para centralizar sus respaldos de infraestructura.</description>
- <description xml:lang="fr">Logiciel pour la centralisation des copies de sauvegarde de votre infrastructure.</description>
- <description xml:lang="gu">તમારા ઇન્ફ્રાસ્ટ્રક્ચરનાં બેકઅપને કેન્દ્રિત કરવા માટે સોફ્ટવેર.</description>
- <description xml:lang="hi">आपके बुनियादी ढाँचा के बैकअप के केंद्रीकरण के लिए सॉफ्टवेयर.</description>
- <description xml:lang="ia">Software pro centralisar le infrastructura de retrocopiage.</description>
- <description xml:lang="it">Software per la centralizzazione dei backup della tua infrastruttura.</description>
- <description xml:lang="ja">インフラストラクチャのバックアップを集中化するソフトウェアです。</description>
- <description xml:lang="kn">ನಿಮ್ಮ ಮೂಲಭೂತ ವ್ಯವಸ್ಥೆಯ ಬ್ಯಾಕ್ಅಪ್‌ಗಳನ್ನು ಕೇಂದ್ರ ವ್ಯವಸ್ಥೆಯನ್ನು ಕೇಂದ್ರೀಕರಣ ವ್ಯವಸ್ಥೆಯಾಗಿಸುವ ತಂತ್ರಾಂಶ.</description>
- <description xml:lang="ko">인프라스트럭쳐 백업을 중앙 집중화 하기 위한 소프트웨어.</description>
- <description xml:lang="ml">നിങ്ങളുടെ ഇന്‍ഫ്രാസ്ട്രക്ചറിനുള്ള ബാക്കപ്പ് കേന്ദ്രീകരിക്കുന്നതിനുള്ള സോഫ്റ്റ്‌വെയര്‍.</description>
- <description xml:lang="mr">इंफ्रास्ट्रक्चरचे बॅकअप सेंट्रलाइज करण्यासाठी सॉफ्टवेअर.</description>
- <description xml:lang="or">ଆପଣଙ୍କର ଅବସଂରଚନାର ନକଲ ସଂରକ୍ଷଣକୁ କ୍ରେନ୍ଦ୍ରିତ କରିବା ପାଇଁ ସଫ୍ଟୱେର।</description>
- <description xml:lang="pa">ਤੁਹਾਡੇਂ ਢਾਂਚੇ ਦੇ ਬੈਕਅੱਪ ਨੂੰ ਕੇਂਦਰੀ ਬਣਾਉਣ ਲਈ ਸਾਫਟਵੇਅਰ।</description>
- <description xml:lang="pl">Oprogramowanie do centralizacji kopii zapasowych infrastruktury.</description>
- <description xml:lang="pt_BR">Software para centralizar seus backups de infraestrutura.</description>
- <description xml:lang="ru">Программы для централизованного создания резервных копий.</description>
- <description xml:lang="sv">Program för att centralisera din infrastrukturs säkerhetskopior.</description>
- <description xml:lang="ta">உங்கள் தனிப்பட்ட பின்சேமிப்புகளை சீராக்குவதற்கான மென்பொருள்.</description>
- <description xml:lang="te">మీ అవస్థాపన(ఇన్ఫ్రాస్ట్రక్చర్) యొక్క బ్యాకప్సును కేంద్రీకరించుటకు సాఫ్టువేరు.</description>
- <description xml:lang="uk">Програми для централізованого керування вашою інфраструктурою резервних копій.</description>
- <description xml:lang="zh_CN">集中管理基础设施备份的软件。</description>
- <description xml:lang="zh_TW">用來中央化您架構備份的軟體。</description>
- <default>false</default>
- <uservisible>false</uservisible>
- <packagelist>
- <packagereq type="mandatory">amanda-server</packagereq>
- <packagereq type="mandatory">mt-st</packagereq>
- <packagereq type="mandatory">mtx</packagereq>
- </packagelist>
- </group>
- <group>
- <id>base</id>
- <name>Base</name>
- <name xml:lang="af">Basis</name>
- <name xml:lang="am">መሠረት</name>
- <name xml:lang="ar">أساسيّة</name>
- <name xml:lang="as">ভিত্তি</name>
- <name xml:lang="bal">اساس</name>
- <name xml:lang="be">Падмурак</name>
- <name xml:lang="bg">Основа</name>
- <name xml:lang="bn">ভিত্তি (Base)</name>
- <name xml:lang="bn_IN">ভিত্তি (Base)</name>
- <name xml:lang="bs">Osnova</name>
- <name xml:lang="ca">Bàsic</name>
- <name xml:lang="cs">Základ</name>
- <name xml:lang="cy">Sail</name>
- <name xml:lang="da">Base</name>
- <name xml:lang="de">Basis</name>
- <name xml:lang="el">Βάση</name>
- <name xml:lang="en_GB">Base</name>
- <name xml:lang="es">Base</name>
- <name xml:lang="et">Baas</name>
- <name xml:lang="fa">پایه</name>
- <name xml:lang="fi">Peruspaketit</name>
- <name xml:lang="fr">Base</name>
- <name xml:lang="gu">આધાર</name>
- <name xml:lang="he">בסיס</name>
- <name xml:lang="hi">आधार</name>
- <name xml:lang="hr">Osnova</name>
- <name xml:lang="hu">Alap</name>
- <name xml:lang="hy">բազա</name>
- <name xml:lang="ia">Base</name>
- <name xml:lang="id">Dasar</name>
- <name xml:lang="is">Grunnur</name>
- <name xml:lang="it">Base</name>
- <name xml:lang="ja">ベース</name>
- <name xml:lang="ka">ძირითადი</name>
- <name xml:lang="kn">ಮೂಲ</name>
- <name xml:lang="ko">기본</name>
- <name xml:lang="lv">Pamatsistēma</name>
- <name xml:lang="mai">आधार</name>
- <name xml:lang="mk">Основни</name>
- <name xml:lang="ml">ബെയ്സ്</name>
- <name xml:lang="mr">आधार</name>
- <name xml:lang="ms">Asas</name>
- <name xml:lang="nb">Grunnpakker</name>
- <name xml:lang="ne">आधार</name>
- <name xml:lang="nl">Basis</name>
- <name xml:lang="no">Grunnpakker</name>
- <name xml:lang="nso">Motheo</name>
- <name xml:lang="or">ଆଧାର</name>
- <name xml:lang="pa">ਮੂਲ</name>
- <name xml:lang="pl">Część podstawowa</name>
- <name xml:lang="pt">Base</name>
- <name xml:lang="pt_BR">Base</name>
- <name xml:lang="ro">Bază</name>
- <name xml:lang="ru">Основные</name>
- <name xml:lang="si">පාදම</name>
- <name xml:lang="sk">Základ</name>
- <name xml:lang="sl">Osnovno</name>
- <name xml:lang="sq">Bazë</name>
- <name xml:lang="sr">Основа</name>
- <name xml:lang="sr@latin">Osnova</name>
- <name xml:lang="sr@Latn">Osnova</name>
- <name xml:lang="sv">Bas</name>
- <name xml:lang="ta">அடிப்படை</name>
- <name xml:lang="te">ఆధారం</name>
- <name xml:lang="tg">Асосҳо</name>
- <name xml:lang="th">พื้นฐาน</name>
- <name xml:lang="tr">Temel</name>
- <name xml:lang="uk">Основа</name>
- <name xml:lang="ur">مرکز</name>
- <name xml:lang="vi">Cở sở</name>
- <name xml:lang="zh_CN">基本</name>
- <name xml:lang="zh_TW">基礎</name>
- <name xml:lang="zu">Isiqu</name>
- <description>The basic installation of CentOS Linux.</description>
- <description xml:lang="as">CentOS Linux ৰ মৌলিক ইনস্টল।</description>
- <description xml:lang="bn">CentOS Linux-র মৌলিক ইনস্টলেশন।</description>
- <description xml:lang="bn_IN">CentOS Linux-র মৌলিক ইনস্টলেশন।</description>
- <description xml:lang="cs">Základní instalace systému CentOS Linux.</description>
- <description xml:lang="de">Die Basis-Installation von CentOS Linux.</description>
- <description xml:lang="es">Instalación básica de CentOS Linux.</description>
- <description xml:lang="fr">Installation de base de CentOS Linux.</description>
- <description xml:lang="gu">CentOS Linux નું આધાર સ્થાપન.</description>
- <description xml:lang="hi">CentOS Linux का मौलिक संस्थापन.</description>
- <description xml:lang="it">Installazione di base di CentOS Linux.</description>
- <description xml:lang="ja">CentOS Linux の基本インストール</description>
- <description xml:lang="kn">CentOS Linuxನ ಮೂಲಭೂತ ಅನುಸ್ಥಾಪನೆ.</description>
- <description xml:lang="ko">CentOS Linux 기본 설치.</description>
- <description xml:lang="ml">CentOS Linux-ന്റെ അടിസ്ഥാന ഇന്‍സ്റ്റലേഷന്‍.</description>
- <description xml:lang="mr">CentOS Linux चे मुळ प्रतिष्ठापन.</description>
- <description xml:lang="or">CentOS Linux ର ମୌଳିକ ସ୍ଥାପନା।</description>
- <description xml:lang="pa">CentOS Linux ਦੀ ਮੁਢਲੀ ਇੰਸਟਾਲੇਸ਼ਨ।</description>
- <description xml:lang="pl">Podstawowa instalacja systemu CentOS Linux.</description>
- <description xml:lang="pt_BR">A instalação básica do CentOS Linux</description>
- <description xml:lang="ru">Стандартная установка CentOS Linux.</description>
- <description xml:lang="sv">Grundinstallationen av CentOS Linux.</description>
- <description xml:lang="ta">CentOS Linuxன் அடிப்படை நிறுவல்.</description>
- <description xml:lang="te">CentOS Linux యొక్క ప్రాధమిక సంస్థాపన.</description>
- <description xml:lang="uk">Стандартне встановлення CentOS Linux.</description>
- <description xml:lang="zh_CN">红帽企业版 Linux 基本安装。</description>
- <description xml:lang="zh_TW">CentOS Linux 的基本安裝。</description>
- <default>false</default>
- <uservisible>false</uservisible>
- <packagelist>
- <packagereq type="mandatory">acl</packagereq>
- <packagereq type="mandatory">at</packagereq>
- <packagereq type="mandatory">attr</packagereq>
- <packagereq type="mandatory">authconfig</packagereq>
- <packagereq type="mandatory">bc</packagereq>
- <packagereq type="mandatory">bind-utils</packagereq>
- <packagereq type="mandatory">centos-indexhtml</packagereq>
- <packagereq type="mandatory">cpio</packagereq>
- <packagereq type="mandatory">crda</packagereq>
- <packagereq type="mandatory">crontabs</packagereq>
- <packagereq type="mandatory">cyrus-sasl-plain</packagereq>
- <packagereq type="mandatory">dbus</packagereq>
- <packagereq type="mandatory">ed</packagereq>
- <packagereq type="mandatory">file</packagereq>
- <packagereq type="mandatory">logrotate</packagereq>
- <packagereq type="mandatory">lsof</packagereq>
- <packagereq type="mandatory">man-db</packagereq>
- <packagereq type="mandatory">net-tools</packagereq>
- <packagereq type="mandatory">ntsysv</packagereq>
- <packagereq type="mandatory">pciutils</packagereq>
- <packagereq type="mandatory">psacct</packagereq>
- <packagereq type="mandatory">quota</packagereq>
- <packagereq type="mandatory">setserial</packagereq>
- <packagereq type="mandatory">traceroute</packagereq>
- <packagereq type="mandatory">usb_modeswitch</packagereq>
- <packagereq type="conditional" requires="ruby">rubygem-abrt</packagereq>
- <packagereq type="default">abrt-addon-ccpp</packagereq>
- <packagereq type="default">abrt-addon-python</packagereq>
- <packagereq type="default">abrt-cli</packagereq>
- <packagereq type="default">abrt-console-notification</packagereq>
- <packagereq type="default">bash-completion</packagereq>
- <packagereq type="default">blktrace</packagereq>
- <packagereq type="default">bridge-utils</packagereq>
- <packagereq type="default">bzip2</packagereq>
- <packagereq type="default">chrony</packagereq>
- <packagereq type="default">cryptsetup</packagereq>
- <packagereq type="default">dmraid</packagereq>
- <packagereq type="default">dosfstools</packagereq>
- <packagereq type="default">ethtool</packagereq>
- <packagereq type="default">fprintd-pam</packagereq>
- <packagereq type="default">gnupg2</packagereq>
- <packagereq type="default">hunspell</packagereq>
- <packagereq type="default">hunspell-en</packagereq>
- <packagereq type="default">kpatch</packagereq>
- <packagereq type="default">ledmon</packagereq>
- <packagereq type="default">libaio</packagereq>
- <packagereq type="default">libreport-plugin-mailx</packagereq>
- <packagereq type="default">libstoragemgmt</packagereq>
- <packagereq type="default">lvm2</packagereq>
- <packagereq type="default">man-pages</packagereq>
- <packagereq type="default">man-pages-overrides</packagereq>
- <packagereq type="default">mdadm</packagereq>
- <packagereq type="default">mlocate</packagereq>
- <packagereq type="default">mtr</packagereq>
- <packagereq type="default">nano</packagereq>
- <packagereq type="default">ntpdate</packagereq>
- <packagereq type="default">pinfo</packagereq>
- <packagereq type="default">plymouth</packagereq>
- <packagereq type="default">pm-utils</packagereq>
- <packagereq type="default">rdate</packagereq>
- <packagereq type="default">rfkill</packagereq>
- <packagereq type="default">rng-tools</packagereq>
- <packagereq type="default">rsync</packagereq>
- <packagereq type="default">scl-utils</packagereq>
- <packagereq type="default">setuptool</packagereq>
- <packagereq type="default">smartmontools</packagereq>
- <packagereq type="default">sos</packagereq>
- <packagereq type="default">sssd-client</packagereq>
- <packagereq type="default">strace</packagereq>
- <packagereq type="default">sysstat</packagereq>
- <packagereq type="default">systemtap-runtime</packagereq>
- <packagereq type="default">tcpdump</packagereq>
- <packagereq type="default">tcsh</packagereq>
- <packagereq type="default">teamd</packagereq>
- <packagereq type="default">time</packagereq>
- <packagereq type="default">unzip</packagereq>
- <packagereq type="default">usbutils</packagereq>
- <packagereq type="default">vim-enhanced</packagereq>
- <packagereq type="default">virt-what</packagereq>
- <packagereq type="default">wget</packagereq>
- <packagereq type="default">which</packagereq>
- <packagereq type="default">words</packagereq>
- <packagereq type="default">xfsdump</packagereq>
- <packagereq type="default">xz</packagereq>
- <packagereq type="default">yum-langpacks</packagereq>
- <packagereq type="default">yum-utils</packagereq>
- <packagereq type="default">zip</packagereq>
- <packagereq type="optional">acpid</packagereq>
- <packagereq type="optional">audispd-plugins</packagereq>
- <packagereq type="optional">augeas</packagereq>
- <packagereq type="optional">brltty</packagereq>
- <packagereq type="optional">ceph-common</packagereq>
- <packagereq type="optional">cryptsetup-reencrypt</packagereq>
- <packagereq type="optional">device-mapper-persistent-data</packagereq>
- <packagereq type="optional">dos2unix</packagereq>
- <packagereq type="optional">dumpet</packagereq>
- <packagereq type="optional">fwupd</packagereq>
- <packagereq type="optional">fwupdate</packagereq>
- <packagereq type="optional">genisoimage</packagereq>
- <packagereq type="optional">gpm</packagereq>
- <packagereq type="optional">i2c-tools</packagereq>
- <packagereq type="optional">kabi-yum-plugins</packagereq>
- <packagereq type="optional">libatomic</packagereq>
- <packagereq type="optional">libcgroup</packagereq>
- <packagereq type="optional">libcgroup-tools</packagereq>
- <packagereq type="optional">libitm</packagereq>
- <packagereq type="optional">libstoragemgmt-netapp-plugin</packagereq>
- <packagereq type="optional">libstoragemgmt-nstor-plugin</packagereq>
- <packagereq type="optional">libstoragemgmt-smis-plugin</packagereq>
- <packagereq type="optional">libstoragemgmt-targetd-plugin</packagereq>
- <packagereq type="optional">libstoragemgmt-udev</packagereq>
- <packagereq type="optional">linuxptp</packagereq>
- <packagereq type="optional">logwatch</packagereq>
- <packagereq type="optional">mkbootdisk</packagereq>
- <packagereq type="optional">mtools</packagereq>
- <packagereq type="optional">ncurses-term</packagereq>
- <packagereq type="optional">ntp</packagereq>
- <packagereq type="optional">nvmetcli</packagereq>
- <packagereq type="optional">oddjob</packagereq>
- <packagereq type="optional">pax</packagereq>
- <packagereq type="optional">prelink</packagereq>
- <packagereq type="optional">PyPAM</packagereq>
- <packagereq type="optional">python-volume_key</packagereq>
- <packagereq type="optional">redhat-lsb-core</packagereq>
- <packagereq type="optional">redhat-upgrade-dracut</packagereq>
- <packagereq type="optional">redhat-upgrade-tool</packagereq>
- <packagereq type="optional">rsyslog-gnutls</packagereq>
- <packagereq type="optional">rsyslog-gssapi</packagereq>
- <packagereq type="optional">rsyslog-relp</packagereq>
- <packagereq type="optional">sgpio</packagereq>
- <packagereq type="optional">sox</packagereq>
- <packagereq type="optional">squashfs-tools</packagereq>
- <packagereq type="optional">star</packagereq>
- <packagereq type="optional">tmpwatch</packagereq>
- <packagereq type="optional">udftools</packagereq>
- <packagereq type="optional">usbguard</packagereq>
- <packagereq type="optional">uuidd</packagereq>
- <packagereq type="optional">volume_key</packagereq>
- <packagereq type="optional">wodim</packagereq>
- <packagereq type="optional">x86info</packagereq>
- <packagereq type="optional">yum-plugin-aliases</packagereq>
- <packagereq type="optional">yum-plugin-changelog</packagereq>
- <packagereq type="optional">yum-plugin-tmprepo</packagereq>
- <packagereq type="optional">yum-plugin-verify</packagereq>
- <packagereq type="optional">yum-plugin-versionlock</packagereq>
- <packagereq type="optional">zsh</packagereq>
- </packagelist>
- </group>
- <group>
- <id>compat-libraries</id>
- <name>Compatibility Libraries</name>
- <name xml:lang="as">সংগতি লাইব্ৰেৰীসমূহ</name>
- <name xml:lang="bn_IN">সুসংগততা লাইব্রেরি</name>
- <name xml:lang="cs">Knihovny zpětné kompatibility</name>
- <name xml:lang="de">Kompatibilitätsbibliotheken</name>
- <name xml:lang="es">Bibliotecas compatibles</name>
- <name xml:lang="fr">Bibliothèques de compatibilité</name>
- <name xml:lang="gu">સુસંગતતા લાઇબ્રેરીઓ</name>
- <name xml:lang="hi">सुसंगतता लाइब्रेरी</name>
- <name xml:lang="it">Libreria di compatibilità</name>
- <name xml:lang="ja">互換性ライブラリ</name>
- <name xml:lang="kn">ಹೊಂದಿಕೊಳ್ಳುವ ಲೈಬ್ರರಿಗಳು</name>
- <name xml:lang="ko">호환성 라이브러리</name>
- <name xml:lang="ml">പൊരുത്തപ്പെടലിനുള്ള ലൈബ്രറികള്‍</name>
- <name xml:lang="mr">सहत्वता लाइब्ररिज</name>
- <name xml:lang="or">ସୁସଂଗତତା ଲାଇବ୍ରେରୀଗୁଡ଼ିକ</name>
- <name xml:lang="pa">ਅਨੁਕੂਲਤਾ ਲਾਇਬਰੇਰੀਆਂ</name>
- <name xml:lang="pl">Biblioteki zgodności</name>
- <name xml:lang="pt_BR">Bibliotecas de compatibilidade</name>
- <name xml:lang="ru">Библиотеки совместимости</name>
- <name xml:lang="ta">இணக்கத்தன்மை தரவகங்கள்</name>
- <name xml:lang="te">సారూప్యతా లైబ్రరీలు</name>
- <name xml:lang="uk">Бібліотеки для забезпечення сумісності</name>
- <name xml:lang="zh_CN">兼容性程序库</name>
- <name xml:lang="zh_TW">相容性函式庫</name>
- <description>Compatibility libraries for applications built on previous versions of CentOS Linux.</description>
- <description xml:lang="as">CentOS Linux ৰ পূৰ্ববৰ্তী সংস্কৰণত নিৰ্মিত এপ্লিকেচনৰ সৈতে সংগতিৰ বাবে লাইব্ৰেৰী।</description>
- <description xml:lang="bn">CentOS Linux-র পূর্ববর্তী সংস্করণের মধ্যে নির্মিত অ্যাপ্লিকেশনের সাথে সুসংগতির জন্য লাইব্রেরি।</description>
- <description xml:lang="bn_IN">CentOS Linux-র পূর্ববর্তী সংস্করণের মধ্যে নির্মিত অ্যাপ্লিকেশনের সাথে সুসংগতির জন্য লাইব্রেরি।</description>
- <description xml:lang="cs">Balíčky s knihovnami pro podporu kompatibility s předchozími verzemi systému CentOS Linux.</description>
- <description xml:lang="de">Kompatibilitätsbibliotheken für Applikationen, die auf früheren Versionen von CentOS Linux erstellt wurden.</description>
- <description xml:lang="es">Bibliotecas de compatibilidad para aplicaciones creadas en versiones anteriores de CentOS Linux.</description>
- <description xml:lang="fr">Biblitohèques de compatibilité pour application construites sur des versions précédentes de CentOS Linux.</description>
- <description xml:lang="gu">CentOS Linux ની પહેલાંની આવૃત્તિઓ પર બિસ્ટ કાર્યક્રમો માટે સુસંગત લાઇબ્રેરીઓ.</description>
- <description xml:lang="hi">CentOS Linux के पहले संस्करण पर निर्मित अनुप्रयोग के लिए सुसंगतता लाइब्रेरी.</description>
- <description xml:lang="it">Librerie di compatibilità per le applicazioni compilate su versioni precedenti di CentOS Linux.</description>
- <description xml:lang="ja">旧バージョンの CentOS Linux によって構築されたアプリケーションに対する互換性ライブラリ</description>
- <description xml:lang="kn">ಹಿಂದಿನ CentOS Linuxನ ಆವೃತ್ತಿಯಲ್ಲಿ ನಿರ್ಮಿಸಲಾದ ಅನ್ವಯಗಳಿಗಾಗಿನ ಸಹರ್ತನೀಯ ಲೈಬ್ರರಿಗಳು.</description>
- <description xml:lang="ko">예전 버전의 CentOS Linux에서 빌드된 프로그램을 위한 호환성 라이브러리</description>
- <description xml:lang="ml">CentOS Linux-ന്റെ മുമ്പുള്ള പതിപ്പുകളില്‍ തയ്യാറാക്കിയിട്ടുള്ള പ്രയോഗങ്ങള്‍ക്കു് പൊരുത്തപ്പെടുന്ന ലൈബ്രറികള്‍.</description>
- <description xml:lang="mr">CentOS Linux च्या मागील आवृत्तींवर बिल्ट केलेल्या ऍप्लिकेशन्स् करीता सहत्वता लाइब्ररीज्.</description>
- <description xml:lang="or">CentOS Linux ର ପୂର୍ବ ସଂସ୍କରଣରେ ନିର୍ମିତ ପ୍ରୟୋଗଗୁଡ଼ିକ ପାଇଁ ସୁସଙ୍ଗତତା ଲାଇବ୍ରେରୀ।</description>
- <description xml:lang="pa">CentOS Linux ਦੇ ਪਿਛਲੇ ਵਰਜਨ ਉੱਪਰ ਬਣੀਆਂ ਐਪਲੀਕੇਸ਼ਨਾਂ ਲਈ ਅਨੁਕੂਲਤਾ ਲਾਇਬਰੇਰੀਆਂ।</description>
- <description xml:lang="pl">Biblioteki zgodności dla aplikacji zbudowanych w poprzednich wersjach systemu CentOS Linux.</description>
- <description xml:lang="pt_BR">As bibliotecas de compatibilidades para aplicativos construídos em versões anteriores do CentOS Linux.</description>
- <description xml:lang="ru">Библиотеки совместимости для приложений, созданных в предыдущих версиях CentOS Linux.</description>
- <description xml:lang="sv">Kompatibilitetsbibliotek för program byggda på tidigare versioner av CentOS Linux</description>
- <description xml:lang="ta">CentOS Linuxன் முந்தைய பதிப்புகளில் பயன்பாடுகளை கட்டுவதற்கான ஒத்தியல்பு நூலகங்கள்.</description>
- <description xml:lang="te">CentOS Linux యొక్క గత వర్షన్లపై నిర్మితమైన అనువర్తనముల కొరకు కంపాటిబిలిటి లైబ్రరీలు.</description>
- <description xml:lang="uk">Бібліотеки сумісності для програм, створених у попередніх версіях CentOS Linux.</description>
- <description xml:lang="zh_CN">用于在红帽企业版 Linux 的之前版本中构建的应用程序的兼容程序库。</description>
- <description xml:lang="zh_TW">建置於先前版本的 CentOS Linux 上的應用程式的相容性函式庫。</description>
- <default>false</default>
- <uservisible>true</uservisible>
- <packagelist>
- <packagereq type="mandatory">compat-db47</packagereq>
- <packagereq type="mandatory">compat-glibc</packagereq>
- <packagereq type="mandatory">compat-libcap1</packagereq>
- <packagereq type="mandatory">compat-libf2c-34</packagereq>
- <packagereq type="mandatory">compat-libgfortran-41</packagereq>
- <packagereq type="mandatory">compat-libtiff3</packagereq>
- <packagereq type="mandatory">compat-openldap</packagereq>
- <packagereq type="mandatory">libpng12</packagereq>
- <packagereq type="mandatory">openssl098e</packagereq>
- </packagelist>
- </group>
- <group>
- <id>conflicts-client</id>
- <name>Conflicts (Client)</name>
- <name xml:lang="as">দন্দসমূহ (ক্লাএন্ট)</name>
- <name xml:lang="bn">Conflicts (Client)</name>
- <name xml:lang="bn_IN">Conflicts (Client)</name>
- <name xml:lang="cs">Konflikty (klient)</name>
- <name xml:lang="de">Konflikte (Client)</name>
- <name xml:lang="es">Conflictos (Cliente)</name>
- <name xml:lang="eu">Gatazkak (bezeroa)</name>
- <name xml:lang="fr">Conflits (Client)</name>
- <name xml:lang="gu">અથડામણો (ક્લાઇન્ટ)</name>
- <name xml:lang="hi">परस्पर विरोध (क्लाइंट)</name>
- <name xml:lang="it">Conflitti (Client)</name>
- <name xml:lang="ja">競合 (Client)</name>
- <name xml:lang="kn">ಅಸಮಂಜಸತೆ (ಕ್ಲೈಂಟ್‌)</name>
- <name xml:lang="ko">충돌(클라이언트)</name>
- <name xml:lang="ml">പൊരുത്തക്കേടുകള്‍ (ക്ലയന്റ്)</name>
- <name xml:lang="mr">मतभेद (क्लाएंट)</name>
- <name xml:lang="or">ଦ୍ୱନ୍ଦ (କ୍ଲାଏଣ୍ଟ)</name>
- <name xml:lang="pa">ਪ੍ਰਤੀਰੋਧ (ਕਲਾਂਈਟ)</name>
- <name xml:lang="pl">Konflikty (klient)</name>
- <name xml:lang="pt_BR">Conflitos (Cliente)</name>
- <name xml:lang="ru">Конфликты (Client)</name>
- <name xml:lang="ta">முரண்பாடுகள் (கிளையன்)</name>
- <name xml:lang="te">విభేదాలు (క్లైంట్)</name>
- <name xml:lang="uk">Суперечності (Клієнт)</name>
- <name xml:lang="zh_CN">冲突(客户端)</name>
- <name xml:lang="zh_TW">衝突(客戶端)</name>
- <description>This group includes packages conflicting with @everything installation on the Client variant.</description>
- <description xml:lang="as">এই দলে ক্লাএন্ট অপৰত থকা @everything ইনস্টলৰ লগত দন্দ কৰা পেকেইজসমূহ অন্তৰ্ভুক্ত কৰে।</description>
- <description xml:lang="bn">Client-র জন্য @everything ইনস্টলেশনের ক্ষেত্রে দ্বন্দ্ব সৃষ্টিকারী প্যাকেজগুলি এই সংকলনের মধ্যে উপস্থিত রয়েছে।</description>
- <description xml:lang="bn_IN">Client-র জন্য @everything ইনস্টলেশনের ক্ষেত্রে দ্বন্দ্ব সৃষ্টিকারী প্যাকেজগুলি এই সংকলনের মধ্যে উপস্থিত রয়েছে।</description>
- <description xml:lang="cs">Skupina balíčků, které kolidují při instalaci všech balíčků ve variantě Klient.</description>
- <description xml:lang="de">Diese Paketgruppe umfasst Pakete, die mit der @everything-Installation bei der Client-Variante in Konflikt stehen.</description>
- <description xml:lang="es">Este grupo incluye paquetes en conflicto con instalación @everything en la variante Client.</description>
- <description xml:lang="fr">Ce groupe comprend des paquetages en conflit avec l'installation @everything sur la variante Client.</description>
- <description xml:lang="gu">આ જૂથ ક્લાઇન્ટ વિવિધતા પર @બધા જ સ્થાપન સાથે અથડામણ થતા પેકેજોને સમાવે છે.</description>
- <description xml:lang="hi">यह समूह संस्थापन से जुड़े हर चीज से विरोध में क्लाइंट चर के साथ संकुल समाहित करता है.</description>
- <description xml:lang="it">Questo gruppo contiene pacchetti in conflitto con l'installazione @everything sulla variante del client.</description>
- <description xml:lang="ja">このグループには クライアントの機種にある @everything インストールと競合するパッケージが 含まれています。</description>
- <description xml:lang="kn">ಈ ಸಮೂಹವು ಕ್ಲೈಂಟ್ ವೇರಿಯಂಟ್‌ನೊಂದಿಗೆ @everything ಅನುಸ್ಥಾಪನೆಯೊಂದಿಗೆ ಅಸಮಂಜಸತೆಯನ್ನು ಉಂಟುಮಾಡುವ ಪ್ಯಾಕೇಜ್ ಅನ್ನು ಹೊಂದಿದೆ.</description>
- <description xml:lang="ko">이 그룹에는 클라이언트 유형의 @everything 설치와 충돌하는 패키지가 포함되어 있습니다.</description>
- <description xml:lang="ml">ക്ലയന്റ് വേരിയന്റില്‍ @everything ഇന്‍സ്റ്റലേഷനില്‍ തകരാറുണ്ടാക്കുന്ന പാക്കേജുകള്‍ ഈ ഗ്രൂപ്പില്‍ ഉള്‍പ്പെടുന്നു.</description>
- <description xml:lang="mr">या गटामध्ये क्लाएंट वेरिएंटवरील @everything प्रतिष्ठापनसह मतभेद निर्माण करणारे संकुले समाविष्टीत आहे.</description>
- <description xml:lang="or">ଏହି ଶ୍ରେଣୀରେ ପ୍ଯାକେଜଗୁଡ଼ିକ କ୍ଲାଏଣ୍ଟ ଭିନ୍ନତା ସହିତ @everything ସ୍ଥାପନ ସହିତ ଦ୍ୱନ୍ଦକୁ ଅନ୍ତର୍ଭୁକ୍ତ କରିଥାଏ।</description>
- <description xml:lang="pa">ਇਸ ਗਰੁੱਪ ਵਿੱਚ ਉਹ ਪੈਕੇਜ ਹਨ ਜੋ ਕਲਾਂਈਟ ਵੇਰੀਏਂਟਾ ਉੱਪਰ @everything ਇੰਸਟਾਲੇਸ਼ਨ ਨਾਲ ਪ੍ਰਤੀਰੋਧੀ ਹਨ।</description>
- <description xml:lang="pl">Ta grupa zawiera pakiety będące w konflikcie z instalacją typu @everything dla wariantu klienta.</description>
- <description xml:lang="pt_BR">Este grupo inclui pacotes conflitantes com a instalação do @everything na variante do Cliente.</description>
- <description xml:lang="ru">Эта группа содержит пакеты, создающие конфликт при установке @everything в CentOS Linux Client.</description>
- <description xml:lang="ta">இந்தக் குழுவானது கிளையன் மாறுபாட்டின் தொகுப்புகளின் முரண்பாடு @everything நிறுவலையும் சேர்க்கிறது.</description>
- <description xml:lang="te">ఈ సమూహం క్లైంట్ వేరియంట్‌పై @everything సంస్థాపనతో విభేదిస్తున్న ప్యాకేజీలను కలిగివుంటుంది.</description>
- <description xml:lang="uk">Ця група містить пакунки, що створюють конфлікт при встановленні @everything на CentOS Linux Client.</description>
- <description xml:lang="zh_CN">这个组群包含与 @everything 客户端变体安装冲突的软件包。</description>
- <description xml:lang="zh_TW">此群組包含了與客戶端上 @everything 安裝含有衝突的套件。</description>
- <default>false</default>
- <uservisible>false</uservisible>
- <packagelist/>
- </group>
- <group>
- <id>conflicts-computenode</id>
- <name>Conflicts (ComputeNode)</name>
- <name xml:lang="as">দন্দসমূহ (ComputeNode)</name>
- <name xml:lang="bn">Conflicts (ComputeNode)</name>
- <name xml:lang="bn_IN">Conflicts (ComputeNode)</name>
- <name xml:lang="cs">Konflikty (ComputeNode)</name>
- <name xml:lang="de">Konflikte (Rechenknoten)</name>
- <name xml:lang="es">Conflictos (ComputeNode)</name>
- <name xml:lang="fr">Conflits (ComputeNode)</name>
- <name xml:lang="gu">અથડામણો (ComputeNode)</name>
- <name xml:lang="hi">परस्पर विरोध (ComputeNode)</name>
- <name xml:lang="it">Conflitti (ComputeNode)</name>
- <name xml:lang="ja">競合 (ComputeNode)</name>
- <name xml:lang="kn">ಅಸಮಂಜಸತೆ (ಕಂಪ್ಯೂಟ್‌ನೋಡ್)</name>
- <name xml:lang="ko">충돌(ComputeNode)</name>
- <name xml:lang="ml">പൊരുത്തക്കേടുകള്‍ (കമ്പ്യൂട്ട്നോഡ്)</name>
- <name xml:lang="mr">मतभेद (कम्प्युटनोड)</name>
- <name xml:lang="or">ଦ୍ୱନ୍ଦ (ComputeNode)</name>
- <name xml:lang="pa">ਪ੍ਰਤੀਰੋਧ (ਕੰਪਿਊਟਨੋਡ)</name>
- <name xml:lang="pl">Konflikty (węzeł obliczeniowy)</name>
- <name xml:lang="pt_BR">Conflitos (ComputeNode)</name>
- <name xml:lang="ru">Конфликты (ComputeNode)</name>
- <name xml:lang="ta">முரண்பாடுகள் (ComputeNode)</name>
- <name xml:lang="te">విభేదాలు (కంప్యూట్‌నోడ్)</name>
- <name xml:lang="uk">Суперечності (Обчислювальний вузол)</name>
- <name xml:lang="zh_CN">冲突(计算节点)</name>
- <name xml:lang="zh_TW">衝突(ComputeNode)</name>
- <description>This group includes packages conflicting with @everything installation on the ComputeNode variant.</description>
- <description xml:lang="as">এই দলে ComputeNode অপৰত থকা @everything ইনস্টলৰ লগত দন্দ কৰা পেকেইজসমূহ অন্তৰ্ভুক্ত কৰে।</description>
- <description xml:lang="bn">ComputeNode-র জন্য @everything ইনস্টলেশনের ক্ষেত্রে দ্বন্দ্ব সৃষ্টিকারী প্যাকেজগুলি এই সংকলনের মধ্যে উপস্থিত রয়েছে।</description>
- <description xml:lang="bn_IN">ComputeNode-র জন্য @everything ইনস্টলেশনের ক্ষেত্রে দ্বন্দ্ব সৃষ্টিকারী প্যাকেজগুলি এই সংকলনের মধ্যে উপস্থিত রয়েছে।</description>
- <description xml:lang="cs">Skupina balíčků, které kolidují při instalaci všech balíčků ve variantě ComputeNode.</description>
- <description xml:lang="de">Diese Paketgruppe umfasst Pakete, die mit der @everything-Installation bei der Rechenknoten-Variante in Konflikt stehen.</description>
- <description xml:lang="es">Este grupo incluye paquetes en conflicto con instalación @everything en la variante de ComputeNode.</description>
- <description xml:lang="fr">Ce groupe comprend des paquetages en conflit avec l'installation @everything sur la variante ComputeNode.</description>
- <description xml:lang="gu">આ જૂથ ComputeNode વિવિધતા પર @બધા જ સ્થાપન સાથે અથડામણ થતા પેકેજોને સમાવે છે.</description>
- <description xml:lang="hi">यह समूह संस्थापन से जुड़े हर चीज से विरोध में ComputeNode चर के साथ संकुल समाहित करता है.</description>
- <description xml:lang="it">Questo gruppo contiene pacchetti in conflitto con l'installazione @everything sulla variante ComputeNode.</description>
- <description xml:lang="ja">このグループには ComputeNode の機種にある @everything インストールと競合するパッケージが 含まれています。</description>
- <description xml:lang="kn">ಈ ಸಮೂಹವು ಕಂಪ್ಯೂಟ್‌ನೋಡ್ ವೇರಿಯಂಟ್‌ನಲ್ಲಿ @everything ಅನುಸ್ಥಾಪನೆಯೊಂದಿಗೆ ಅಸಮಂಜಸತೆಯನ್ನು ಉಂಟುಮಾಡುವ ಪ್ಯಾಕೇಜ್ ಅನ್ನು ಹೊಂದಿದೆ.</description>
- <description xml:lang="ko">이 그룹에는 ComputeNode유형의 @everything 설치와 충돌하는 패키지가 포함되어 있습니다.</description>
- <description xml:lang="ml">കമ്പ്യൂട്ട്നോഡ് വേരിയന്റില്‍ @everything ഇന്‍സ്റ്റലേഷനില്‍ തകരാറുണ്ടാക്കുന്ന പാക്കേജുകള്‍ ഈ ഗ്രൂപ്പില്‍ ഉള്‍പ്പെടുന്നു.</description>
- <description xml:lang="mr">या गटामध्ये कम्प्युटनोड वेरिएंटवरील @everything प्रतिष्ठापनसह मतभेद निर्माण करणारे संकुले समाविष्टीत आहे.</description>
- <description xml:lang="or">ଏହି ଶ୍ରେଣୀରେ ପ୍ଯାକେଜଗୁଡ଼ିକ ComputeNode ଭିନ୍ନତା ସହିତ @everything ସ୍ଥାପନ ସହିତ ଦ୍ୱନ୍ଦକୁ ଅନ୍ତର୍ଭୁକ୍ତ କରିଥାଏ।</description>
- <description xml:lang="pa">ਇਸ ਗਰੁੱਪ ਵਿੱਚ ਉਹ ਪੈਕੇਜ ਹਨ ਜੋ ਕੰਪਿਊਟਨੋਡ ਵੇਰੀਏਂਟਾਂ ਉੱਪਰ @everything ਇੰਸਟਾਲੇਸ਼ਨ ਨਾਲ ਪ੍ਰਤੀਰੋਧੀ ਹਨ।</description>
- <description xml:lang="pl">Ta grupa zawiera pakiety będące w konflikcie z instalacją typu @everything dla wariantu węzła obliczeniowego.</description>
- <description xml:lang="pt_BR">Este grupo inclui pacotes conflitantes com a instalação do @everything na variante do ComputeNode.</description>
- <description xml:lang="ru">Эта группа содержит пакеты, создающие конфликт при установке @everything в ComputeNode.</description>
- <description xml:lang="ta">இந்தக் குழுவானது ComputeNode மாறுபாட்டின் தொகுப்புகளின் முரண்பாடு @everything நிறுவலையும் சேர்க்கிறது.</description>
- <description xml:lang="te">ఈ సమూహం కంప్యూట్‌నోడ్ వేరియంట్ పై @everything సంస్థాపనతో విభేదిస్తున్న ప్యాకేజీలను కలిగివుంటుంది.</description>
- <description xml:lang="uk">Ця група містить пакунки, що створюють конфлікт при встановленні @everything на обчислювальний вузол.</description>
- <description xml:lang="zh_CN">这个组群包含与 @everything 计算节点变体安装冲突的软件包。</description>
- <description xml:lang="zh_TW">此群組包含了與 ComputeNode 上 @everything 安裝含有衝突的套件。</description>
- <default>false</default>
- <uservisible>false</uservisible>
- <packagelist/>
- </group>
- <group>
- <id>conflicts-server</id>
- <name>Conflicts (Server)</name>
- <name xml:lang="as">দন্দসমূহ (চাৰ্ভাৰ)</name>
- <name xml:lang="bn">Conflicts (Server)</name>
- <name xml:lang="bn_IN">Conflicts (Server)</name>
- <name xml:lang="cs">Konflikty (server)</name>
- <name xml:lang="de">Konflikte (Server)</name>
- <name xml:lang="es">Conflictos (Servidor)</name>
- <name xml:lang="eu">Gatazkak (zerbitzaria)</name>
- <name xml:lang="fr">Conflits (Serveur)</name>
- <name xml:lang="gu">અથડામણો (સર્વર)</name>
- <name xml:lang="hi">परस्पर विरोध (सर्वर)</name>
- <name xml:lang="it">Conflitti (Server)</name>
- <name xml:lang="ja">競合 (Server)</name>
- <name xml:lang="kn">ಅಸಮಂಜಸತೆ (ಪೂರೈಕೆಗಣಕ)</name>
- <name xml:lang="ko">충돌(서버)</name>
- <name xml:lang="ml">പൊരുത്തക്കേടുകള്‍ (സര്‍വര്‍)</name>
- <name xml:lang="mr">मतभेद (सर्व्हर)</name>
- <name xml:lang="or">ଦ୍ୱନ୍ଦ (ସର୍ଭର)</name>
- <name xml:lang="pa">ਪ੍ਰਤੀਰੋਧ (ਸਰਵਰ)</name>
- <name xml:lang="pl">Konflikty (serwer)</name>
- <name xml:lang="pt_BR">Conflitos (Servidor)</name>
- <name xml:lang="ru">Конфликты (Server)</name>
- <name xml:lang="ta">முரண்பாடுகள் (Server)</name>
- <name xml:lang="te">విభేదాలు (సర్వర్)</name>
- <name xml:lang="uk">Суперечності (Сервер)</name>
- <name xml:lang="zh_CN">冲突(服务器)</name>
- <name xml:lang="zh_TW">衝突(伺服器)</name>
- <description>This group includes packages conflicting with @everything installation on the Server variant.</description>
- <description xml:lang="as">এই দলে চাৰ্ভাৰ অপৰত থকা @everything ইনস্টলৰ লগত দন্দ কৰা পেকেইজসমূহ অন্তৰ্ভুক্ত কৰে।</description>
- <description xml:lang="bn">Server-র জন্য @everything ইনস্টলেশনের ক্ষেত্রে দ্বন্দ্ব সৃষ্টিকারী প্যাকেজগুলি এই সংকলনের মধ্যে উপস্থিত রয়েছে।</description>
- <description xml:lang="bn_IN">Server-র জন্য @everything ইনস্টলেশনের ক্ষেত্রে দ্বন্দ্ব সৃষ্টিকারী প্যাকেজগুলি এই সংকলনের মধ্যে উপস্থিত রয়েছে।</description>
- <description xml:lang="cs">Skupina balíčků, které kolidují při instalaci všech balíčků ve variantě Server.</description>
- <description xml:lang="de">Diese Paketgruppe umfasst Pakete, die mit der @everything-Installation bei der Server-Variante in Konflikt stehen.</description>
- <description xml:lang="es">Este grupo incluye paquetes en conflicto con la instalación @everything en la variante Server.</description>
- <description xml:lang="fr">Ce groupe comprend des paquetages en conflit avec l'installation @everything sur la variante Serveur.</description>
- <description xml:lang="gu">આ જૂથ સર્વર વિવિધતા પર @બધા જ સ્થાપન સાથે અથડામણ થતા પેકેજોને સમાવે છે.</description>
- <description xml:lang="hi">यह समूह संस्थापन से जुड़े हर चीज से विरोध में सर्वर चर के साथ संकुल समाहित करता है.</description>
- <description xml:lang="it">Questo gruppo contiene pacchetti in conflitto con l'installazione @everything sulla variante del server.</description>
- <description xml:lang="ja">このグループには サーバーの機種にある @everything インストールと競合するパッケージが 含まれています。</description>
- <description xml:lang="kn">ಈ ಸಮೂಹವು ಪೂರೈಕೆಗಣಕ ವೇರಿಯಂಟ್‌ನೊಂದಿಗೆ @everything ಅನುಸ್ಥಾಪನೆಯೊಂದಿಗೆ ಅಸಮಂಜಸತೆಯನ್ನು ಉಂಟುಮಾಡುವ ಪ್ಯಾಕೇಜ್ ಅನ್ನು ಹೊಂದಿದೆ.</description>
- <description xml:lang="ko">이 그룹에는 서버 유형의 @everything 설치와 충돌하는 패키지가 포함되어 있습니다.</description>
- <description xml:lang="ml">സര്‍വര്‍ വേരിയന്റില്‍ @everything ഇന്‍സ്റ്റലേഷനില്‍ തകരാറുണ്ടാക്കുന്ന പാക്കേജുകള്‍ ഈ ഗ്രൂപ്പില്‍ ഉള്‍പ്പെടുന്നു.</description>
- <description xml:lang="mr">या गटामध्ये सर्व्हर वेरिएंटवरील @everything प्रतिष्ठापनसह मतभेद निर्माण करणारे संकुले समाविष्टीत आहे.</description>
- <description xml:lang="or">ଏହି ଶ୍ରେଣୀରେ ପ୍ଯାକେଜଗୁଡ଼ିକ ସର୍ଭର ଭିନ୍ନତା ସହିତ @everything ସ୍ଥାପନ ସହିତ ଦ୍ୱନ୍ଦକୁ ଅନ୍ତର୍ଭୁକ୍ତ କରିଥାଏ।</description>
- <description xml:lang="pa">ਇਸ ਗਰੁੱਪ ਵਿੱਚ ਉਹ ਪੈਕੇਜ ਹਨ ਜੋ ਸਰਵਰ ਵੇਰੀਏਂਟਾਂ ਉੱਪਰ @everything ਇੰਸਟਾਲੇਸ਼ਨ ਨਾਲ ਪ੍ਰਤੀਰੋਧੀ ਹਨ।</description>
- <description xml:lang="pl">Ta grupa zawiera pakiety będące w konflikcie z instalacją typu @everything dla wariantu serwerowego.</description>
- <description xml:lang="pt_BR">Este grupo inclui pacotes conflitantes com a instalação do @everything em variante de Servidor.</description>
- <description xml:lang="ru">Эта группа содержит пакеты, создающие конфликт при установке @everything в CentOS Linux Server.</description>
- <description xml:lang="ta">இந்தக் குழுவானது சேவையக மாறுபாட்டின் தொகுப்புகளின் முரண்பாடு @everything நிறுவலையும் சேர்க்கிறது.</description>
- <description xml:lang="te">ఈ సమూహం సర్వర్ వేరియంట్ పై @everything సంస్థాపనతో విభేదిస్తున్న ప్యాకేజీలను కలిగివుంటుంది.</description>
- <description xml:lang="uk">Ця група містить пакунки, що створюють конфлікт при встановленні @everything на CentOS Linux Server.</description>
- <description xml:lang="zh_CN">这个组群包含与 @everything 服务器变体安装冲突的软件包。</description>
- <description xml:lang="zh_TW">此群組包含了與伺服器上 @everything 安裝含有衝突的套件。</description>
- <default>false</default>
- <uservisible>false</uservisible>
- <packagelist>
- <packagereq type="mandatory">libcmpiCppImpl0</packagereq>
- </packagelist>
- </group>
- <group>
- <id>conflicts-workstation</id>
- <name>Conflicts (Workstation)</name>
- <name xml:lang="as">দন্দসমূহ (ৱাৰ্কস্টেশন)</name>
- <name xml:lang="bn">Conflicts (Workstation)</name>
- <name xml:lang="bn_IN">Conflicts (Workstation)</name>
- <name xml:lang="cs">Konflikty (pracovní stanice)</name>
- <name xml:lang="de">Konflikte (Workstation)</name>
- <name xml:lang="es">Conflictos (Workstation)</name>
- <name xml:lang="fr">Conflits (station de travail)</name>
- <name xml:lang="gu">અથડામણો (વર્કસ્ટેશન)</name>
- <name xml:lang="hi">परस्पर विरोध (वर्कस्टेशन)</name>
- <name xml:lang="it">Conflitti (Workstation)</name>
- <name xml:lang="ja">競合 (Workstation)</name>
- <name xml:lang="kn">ಅಸಮಂಜಸತೆ (ಕಾರ್ಯಕ್ಷೇತ್ರ)</name>
- <name xml:lang="ko">충돌(워크스테이션)</name>
- <name xml:lang="ml">പൊരുത്തക്കേടുകള്‍ (വര്‍ക്ക്സ്റ്റേഷന്‍)</name>
- <name xml:lang="mr">मतभेद (वर्कस्टेशन)</name>
- <name xml:lang="or">ଦ୍ୱନ୍ଦ (କାର୍ଯ୍ୟକ୍ଷେତ୍ର)</name>
- <name xml:lang="pa">ਪ੍ਰਤੀਰੋਧ (ਵਰਕਸਟੇਸ਼ਨ)</name>
- <name xml:lang="pl">Konflikty (stacja robocza)</name>
- <name xml:lang="pt_BR">Conflitos (Estação de Trabalho)</name>
- <name xml:lang="ru">Конфликты (Workstation)</name>
- <name xml:lang="ta">முரண்பாடுகள் (பணிக்கணினி)</name>
- <name xml:lang="te">విభేదాలు (వర్కుస్టేషన్)</name>
- <name xml:lang="uk">Суперечності (Робоча станція)</name>
- <name xml:lang="zh_CN">冲突(工作站)</name>
- <name xml:lang="zh_TW">衝突(工作站)</name>
- <description>This group includes packages conflicting with @everything installation on the Workstation variant.</description>
- <description xml:lang="as">এই দলে ৱাৰ্কস্টেশন অপৰত থকা @everything ইনস্টলৰ লগত দন্দ কৰা পেকেইজসমূহ অন্তৰ্ভুক্ত কৰে।</description>
- <description xml:lang="bn">Workstation-র জন্য @everything ইনস্টলেশনের ক্ষেত্রে দ্বন্দ্ব সৃষ্টিকারী প্যাকেজগুলি এই সংকলনের মধ্যে উপস্থিত রয়েছে।</description>
- <description xml:lang="bn_IN">Workstation-র জন্য @everything ইনস্টলেশনের ক্ষেত্রে দ্বন্দ্ব সৃষ্টিকারী প্যাকেজগুলি এই সংকলনের মধ্যে উপস্থিত রয়েছে।</description>
- <description xml:lang="cs">Skupina balíčků, které kolidují při instalaci všech balíčků ve variantě Pracovní stanice.</description>
- <description xml:lang="de">Diese Paketgruppe umfasst Pakete, die mit der @everything-Installation bei der Workstation-Variante in Konflikt stehen.</description>
- <description xml:lang="es">Este grupo incluye paquetes en conflicto con instalación @everything en la variante Workstation.</description>
- <description xml:lang="fr">Ce groupe comprend des paquetages en conflit avec l'installation @everything sur la variante Station de travail.</description>
- <description xml:lang="gu">આ જૂથ વર્કસ્ટેશન વિવિધતા પર @બધા જ સ્થાપન સાથે અથડામણ થતા પેકેજોને સમાવે છે.</description>
- <description xml:lang="hi">यह समूह संस्थापन से जुड़े हर चीज से विरोध में वर्कस्टेशन चर के साथ संकुल समाहित करता है.</description>
- <description xml:lang="it">Questo gruppo contiene pacchetti in conflitto con l'installazione @everything sulla variante Workstation.</description>
- <description xml:lang="ja">このグループには ワークステーションの機種にある @everything インストールと競合するパッケージが 含まれています。</description>
- <description xml:lang="kn">ಈ ಸಮೂಹವು ಕಾರ್ಯಕ್ಷೇತ್ರ ವೇರಿಯಂಟ್‌ನೊಂದಿಗೆ @everything ಅನುಸ್ಥಾಪನೆಯೊಂದಿಗೆ ಅಸಮಂಜಸತೆಯನ್ನು ಉಂಟುಮಾಡುವ ಪ್ಯಾಕೇಜ್ ಅನ್ನು ಹೊಂದಿದೆ.</description>
- <description xml:lang="ko">이 그룹에는 워크스테이션 유형의 @everything 설치와 충돌하는 패키지가 포함되어 있습니다.</description>
- <description xml:lang="ml">വര്‍ക്ക്സ്റ്റേഷന്‍ ന്റ് വേരിയന്റില്‍ @everything ഇന്‍സ്റ്റലേഷനില്‍ തകരാറുണ്ടാക്കുന്ന പാക്കേജുകള്‍ ഈ ഗ്രൂപ്പില്‍ ഉള്‍പ്പെടുന്നു.</description>
- <description xml:lang="mr">या गटामध्ये वर्कस्टेशन वेरिएंटवरील @everything प्रतिष्ठापनसह मतभेद निर्माण करणारे संकुले समाविष्टीत आहे.</description>
- <description xml:lang="or">ଏହି ଶ୍ରେଣୀରେ ପ୍ଯାକେଜଗୁଡ଼ିକ କାର୍ଯ୍ୟକ୍ଷେତ୍ର ଭିନ୍ନତା ସହିତ @everything ସ୍ଥାପନ ସହିତ ଦ୍ୱନ୍ଦକୁ ଅନ୍ତର୍ଭୁକ୍ତ କରିଥାଏ।</description>
- <description xml:lang="pa">ਇਸ ਗਰੁੱਪ ਵਿੱਚ ਉਹ ਪੈਕੇਜ ਹਨ ਜੋ ਵਰਕਸਟੇਸ਼ਨ ਵੇਰੀਏਂਟਾ ਉੱਪਰ @everything ਇੰਸਟਾਲੇਸ਼ਨ ਨਾਲ ਪ੍ਰਤੀਰੋਧੀ ਹਨ।</description>
- <description xml:lang="pl">Ta grupa zawiera pakiety będące w konflikcie z instalacją typu @everything dla wariantu dla stacji roboczej.</description>
- <description xml:lang="pt_BR">Este grupo inclui pacotes conflitantes com a instalação do @everything na variante do Workstation.</description>
- <description xml:lang="ru">Эта группа содержит пакеты, создающие конфликт при установке @everything в CentOS Linux Workstation.</description>
- <description xml:lang="ta">இந்தக் குழுவானது பணிக்கணினி மாறுபாட்டின் தொகுப்புகளின் முரண்பாடு @everything நிறுவலையும் சேர்க்கிறது.</description>
- <description xml:lang="te">ఈ సమూహం వర్కుస్టేషన్ వేరియంట్ @everything సంస్థాపనతో విభేదిస్తున్న ప్యాకేజీలను కలిగివుంటుంది.</description>
- <description xml:lang="uk">Ця група містить пакунки, що створюють конфлікт при встановленні @everything на робочу станцію.</description>
- <description xml:lang="zh_CN">这个组群包含与 @everything 工作站变体安装冲突的软件包。</description>
- <description xml:lang="zh_TW">此群組包含了與工作站上 @everything 安裝含有衝突的套件。</description>
- <default>false</default>
- <uservisible>false</uservisible>
- <packagelist>
- <packagereq type="mandatory">libcmpiCppImpl0</packagereq>
- </packagelist>
- </group>
- <group>
- <id>console-internet</id>
- <name>Console Internet Tools</name>
- <name xml:lang="as">কনচৌল ইন্টাৰনেট সঁজুলি</name>
- <name xml:lang="bn_IN">কনসোল ইন্টারনেট সরঞ্জাম</name>
- <name xml:lang="cs">Konzolové nástroje pro přístup k internetu</name>
- <name xml:lang="de">Internet-Tools für die Konsole</name>
- <name xml:lang="es">Herramientas para consola de Internet.</name>
- <name xml:lang="fr">Outils internet de la console</name>
- <name xml:lang="gu">કન્સોલ ઇન્ટરનેટ સાધનો</name>
- <name xml:lang="hi">कंसोल इंटरनेट औज़ार</name>
- <name xml:lang="it">Strumenti internet della console</name>
- <name xml:lang="ja">コンソールインターネットツール</name>
- <name xml:lang="kn">ಕನ್ಸೋಲ್ ಅಂತರಜಾಲ ಉಪಕರಣಗಳು</name>
- <name xml:lang="ko">콘솔 인터넷 도구</name>
- <name xml:lang="ml">കണ്‍സോളിനുള്ള ഇന്റര്‍നെറ്റ് പ്രയോഗങ്ങള്‍</name>
- <name xml:lang="mr">कंसोल इंटरनेट साधने</name>
- <name xml:lang="or">କୋନସୋଲ ଇଣ୍ଟରନେଟ ସାଧନଗୁଡ଼ିକ</name>
- <name xml:lang="pa">ਕੰਸੋਲ ਇੰਟਰਨੈੱਟ ਸੰਦ</name>
- <name xml:lang="pl">Narzędzia dostępu do Internetu w konsoli</name>
- <name xml:lang="pt_BR">Ferramentas de Internet de Console</name>
- <name xml:lang="ru">Консольные средства Интернета</name>
- <name xml:lang="ta">பணியக இணைய கருவிகள்</name>
- <name xml:lang="te">కన్సోల్ ఇంటర్నెట్ సాధనాలు</name>
- <name xml:lang="uk">Консольні інтернет-програми</name>
- <name xml:lang="zh_CN">控制台互联网工具</name>
- <name xml:lang="zh_TW">主控台網際網路工具</name>
- <description>Console internet access tools, often used by administrators.</description>
- <description xml:lang="as">কনচৌলৰ মাধ্যমে ইন্টাৰনেট ব্যৱহাৰৰ সঁজুলিসমূহ, সাধাৰণত প্ৰশাসকৰ দ্বাৰা ব্যৱহৃত।</description>
- <description xml:lang="bn">কনসোলের মাধ্যমে ইন্টারনেট ব্যবহারের সামগ্রী, সাধারণত অ্যাডমিনিস্ট্রেটরদের দ্বারা ব্যবহৃত।</description>
- <description xml:lang="bn_IN">কনসোলের মাধ্যমে ইন্টারনেট ব্যবহারের সামগ্রী, সাধারণত অ্যাডমিনিস্ট্রেটরদের দ্বারা ব্যবহৃত।</description>
- <description xml:lang="cs">Konzolové nástroje pro přístup k internetu; často využívané správci systému.</description>
- <description xml:lang="de">Oft von Administratoren verwendete Tools für den Zugriff auf das Internet via Konsole.</description>
- <description xml:lang="es">Herramientas de consola para acceso a Internet, utilizados por administradores.</description>
- <description xml:lang="fr">Outils d'accès internet console, souvent utilisés par des administrateurs.</description>
- <description xml:lang="gu">કન્સોલ ઇન્ટરનેટ પ્રવેશ સાધનો, વારંવાર વહીવટકર્તાઓ દ્દારા વપરાયેલ છે.</description>
- <description xml:lang="hi">कंसोल इंटरनेट पहुँच औज़ार, प्रायः प्रशासक के द्वारा प्रयुक्त.</description>
- <description xml:lang="ia">Utensiles de accesso a rete per le consola, sovente usate per administratores.</description>
- <description xml:lang="it">Tool di accesso ad internet della console spesso usati dagli amministratori.</description>
- <description xml:lang="ja">管理者によって頻繁に使用されるコンソールインターネットアクセスツール</description>
- <description xml:lang="kn">ವ್ಯವಸ್ಥಾಪಕರಿಂದ ಸಾಮಾನ್ಯವಾಗಿ ಬಳಸಲಾಗುವ ಕನ್ಸೋಲ್ ಅಂತರಜಾಲ ಉಪಕರಣಗಳು.</description>
- <description xml:lang="ko">관리자가 자주 사용하곤 하는, 콘솔 인터넷 억세스 도구들.</description>
- <description xml:lang="ml">കണ്‍സോള്‍ ഇന്റര്‍നെറ്റ് പ്രയോഗങ്ങള്‍, അഡ്മിനിസ്ട്രേറ്റര്‍ ഉപയോഗിക്കുന്നവ.</description>
- <description xml:lang="mr">कंसोल इंटरनेट प्रवेश साधने, सहसा प्रशासकांद्वारे वापरले जाते.</description>
- <description xml:lang="or">କୋନସୋଲ ଇଣ୍ଟରନେଟ ଅଭିଗମ୍ୟତା ସାଧନଗୁଡ଼ିକ, ପ୍ରାୟତଃ ପ୍ରଶାସକଙ୍କ ଦ୍ୱାରା ବ୍ୟବହୃତ ହୋଇଥାଏ।</description>
- <description xml:lang="pa">ਕੰਸੋਲ ਇੰਟਰਨੈੱਟ ਪਹੁੰਚ ਟੂਲ. ਜੋ ਪਰਬੰਧਕਾਂ ਦੁਆਰਾ ਵਰਤੇ ਜਾਂਦੇ ਹਨ।</description>
- <description xml:lang="pl">Narzędzia dostępu do Internetu w konsoli, często używane przez administratorów</description>
- <description xml:lang="pt_BR">Ferramentas de acesso à internet console, geralmente usada por administrdores.</description>
- <description xml:lang="ru">Консольные средства доступа к Интернету, обычно используемые администраторами.</description>
- <description xml:lang="sv">Verktyg för åtkomst av internet från konseolen, ofta använda av administratörer.</description>
- <description xml:lang="ta">பணியக இணையத்தள அணுகல் கருவிகள், நிர்வாகிகளால் அடிக்கடி பயன்படுத்தப்படுகின்றன.</description>
- <description xml:lang="te">కన్సోల్ యింటర్నెట్ యాక్సెస్ సాధనములు, తరచుగా నిర్వహణాధికారుల చేత వుపయోగించబడును.</description>
- <description xml:lang="uk">Програми для доступу до інтернету з консолі, часто використовуються адміністраторами.</description>
- <description xml:lang="zh_CN">控制台互联网访问工具,通常由管理员使用。</description>
- <description xml:lang="zh_TW">主控台網際網路存取工具,一般由系統管理員所使用。</description>
- <default>false</default>
- <uservisible>true</uservisible>
- <packagelist>
- <packagereq type="optional">elinks</packagereq>
- <packagereq type="optional">fetchmail</packagereq>
- <packagereq type="optional">ftp</packagereq>
- <packagereq type="optional">irssi</packagereq>
- <packagereq type="optional">lftp</packagereq>
- <packagereq type="optional">mutt</packagereq>
- <packagereq type="optional">whois</packagereq>
- </packagelist>
- </group>
- <group>
- <id>core</id>
- <name>Core</name>
- <name xml:lang="af">Kern</name>
- <name xml:lang="am">ማዕከላዊ ቦታ</name>
- <name xml:lang="ar">اللبّ</name>
- <name xml:lang="as">ভিত্তি</name>
- <name xml:lang="bal">هستگ</name>
- <name xml:lang="be">Падмурак</name>
- <name xml:lang="bg">Основа</name>
- <name xml:lang="bn">কোর</name>
- <name xml:lang="bn_IN">কোর</name>
- <name xml:lang="bs">Jezgra</name>
- <name xml:lang="ca">Nucli</name>
- <name xml:lang="cs">Úplný základ</name>
- <name xml:lang="cy">Craidd</name>
- <name xml:lang="da">Grundlæggende</name>
- <name xml:lang="de">Kern</name>
- <name xml:lang="el">Πυρήνας</name>
- <name xml:lang="en_GB">Core</name>
- <name xml:lang="es">Núcleo</name>
- <name xml:lang="et">Tuum</name>
- <name xml:lang="fa">اصل</name>
- <name xml:lang="fi">Keskeiset</name>
- <name xml:lang="fr">Core</name>
- <name xml:lang="gl">Núcleo</name>
- <name xml:lang="gu">મૂળ</name>
- <name xml:lang="he">ליבה</name>
- <name xml:lang="hi">कोर</name>
- <name xml:lang="hr">Jezgra</name>
- <name xml:lang="hu">Mag</name>
- <name xml:lang="hy">Հիմք</name>
- <name xml:lang="ia">Nucleo</name>
- <name xml:lang="id">Inti</name>
- <name xml:lang="ilo">Bugas</name>
- <name xml:lang="is">Lágmarkskerfi</name>
- <name xml:lang="it">Principale</name>
- <name xml:lang="ja">コア</name>
- <name xml:lang="ka">ბირთვი</name>
- <name xml:lang="kn">ಅಂತಸ್ಸಾರ</name>
- <name xml:lang="ko">핵심</name>
- <name xml:lang="lv">Pamatsistēma</name>
- <name xml:lang="mai">कोर</name>
- <name xml:lang="mk">Основни</name>
- <name xml:lang="ml">കോറ്‍</name>
- <name xml:lang="mr">कोर</name>
- <name xml:lang="ms">Teras</name>
- <name xml:lang="nb">Kjerne</name>
- <name xml:lang="ne">कोर</name>
- <name xml:lang="nl">Kern</name>
- <name xml:lang="no">Kjerne</name>
- <name xml:lang="nso">Bogare</name>
- <name xml:lang="or">ପ୍ରମୂଖ</name>
- <name xml:lang="pa">ਮੂਲ</name>
- <name xml:lang="pl">Rdzeń</name>
- <name xml:lang="pt">Núcleo</name>
- <name xml:lang="pt_BR">Núcleo</name>
- <name xml:lang="ro">Nucleu</name>
- <name xml:lang="ru">Основа</name>
- <name xml:lang="si">න්‍යෂ්ඨිය</name>
- <name xml:lang="sk">Jadro</name>
- <name xml:lang="sl">Jedro</name>
- <name xml:lang="sq">Bërthama</name>
- <name xml:lang="sr">Срж</name>
- <name xml:lang="sr@latin">Srž</name>
- <name xml:lang="sr@Latn">Srž</name>
- <name xml:lang="sv">Grund</name>
- <name xml:lang="ta">கோர்</name>
- <name xml:lang="te">అంతర్భాగం</name>
- <name xml:lang="tg">Система</name>
- <name xml:lang="th">แกนหลัก</name>
- <name xml:lang="tr">Çekirdek</name>
- <name xml:lang="uk">Основа</name>
- <name xml:lang="ur">مرکز</name>
- <name xml:lang="vi">Lõi</name>
- <name xml:lang="zh_CN">核心</name>
- <name xml:lang="zh_TW">核心</name>
- <name xml:lang="zu">Okuyikhona</name>
- <description>Smallest possible installation.</description>
- <description xml:lang="as">ন্যূনতম ইনস্টল।</description>
- <description xml:lang="bn">ন্যূনতম ইনস্টলেশন।</description>
- <description xml:lang="bn_IN">ন্যূনতম ইনস্টলেশন।</description>
- <description xml:lang="cs">Nejmenší možná instalace.</description>
- <description xml:lang="de">Kleinstmögliche Installation.</description>
- <description xml:lang="es">La instalación más pequeña posible.</description>
- <description xml:lang="fr">Plus petite installation possible.</description>
- <description xml:lang="gu">નાનામાં નાના શક્ય સ્થાપન.</description>
- <description xml:lang="hi">लघुतम संभावित संस्थापन.</description>
- <description xml:lang="ia">Le minime possibile installation.</description>
- <description xml:lang="it">Minima installazione possibile.</description>
- <description xml:lang="ja">最小限のインストール</description>
- <description xml:lang="kn">ಅತ್ಯಲ್ಪಸಾಧ್ಯ ಅನುಸ್ಥಾಪನೆ.</description>
- <description xml:lang="ko">가능한 최소 설치</description>
- <description xml:lang="ml">സാധ്യമായ ഏറ്റവും ചെറിയ ഇന്‍സ്റ്റലേഷന്‍.</description>
- <description xml:lang="mr">शक्यतया सर्वात लहान प्रतिष्ठापन.</description>
- <description xml:lang="or">କ୍ଷୁଦ୍ରତମ ସମ୍ଭାବ୍ଯ ସ୍ଥାପନା।</description>
- <description xml:lang="pa">ਘੱਟੋ-ਘੱਟ ਸੰਭਵ ਇੰਸਟਾਲੇਸ਼ਨ।</description>
- <description xml:lang="pl">Najmniejsza możliwa instalacja.</description>
- <description xml:lang="pt_BR">Menor instalação possível</description>
- <description xml:lang="ru">Минимально возможная установка</description>
- <description xml:lang="sv">Minsta möjliga installation</description>
- <description xml:lang="ta">மிகச் சிறிய செயல்படுத்தக்கூடிய நிறுவல்.</description>
- <description xml:lang="te">సాధ్యమగు అతిచిన్న సంస్థాపన.</description>
- <description xml:lang="uk">Мінімально можливе встановлення.</description>
- <description xml:lang="zh_CN">最小可能安装。</description>
- <description xml:lang="zh_TW">最小型安裝。</description>
- <default>false</default>
- <uservisible>false</uservisible>
- <packagelist>
- <packagereq type="mandatory">audit</packagereq>
- <packagereq type="mandatory">basesystem</packagereq>
- <packagereq type="mandatory">bash</packagereq>
- <packagereq type="mandatory">btrfs-progs</packagereq>
- <packagereq type="mandatory">coreutils</packagereq>
- <packagereq type="mandatory">cronie</packagereq>
- <packagereq type="mandatory">curl</packagereq>
- <packagereq type="mandatory">dhclient</packagereq>
- <packagereq type="mandatory">e2fsprogs</packagereq>
- <packagereq type="mandatory">filesystem</packagereq>
- <packagereq type="mandatory">firewalld</packagereq>
- <packagereq type="mandatory">glibc</packagereq>
- <packagereq type="mandatory">hostname</packagereq>
- <packagereq type="mandatory">initscripts</packagereq>
- <packagereq type="mandatory">iproute</packagereq>
- <packagereq type="mandatory">iprutils</packagereq>
- <packagereq type="mandatory">iptables</packagereq>
- <packagereq type="mandatory">iputils</packagereq>
- <packagereq type="mandatory">irqbalance</packagereq>
- <packagereq type="mandatory">kbd</packagereq>
- <packagereq type="mandatory">kexec-tools</packagereq>
- <packagereq type="mandatory">less</packagereq>
- <packagereq type="mandatory">man-db</packagereq>
- <packagereq type="mandatory">ncurses</packagereq>
- <packagereq type="mandatory">openssh-clients</packagereq>
- <packagereq type="mandatory">openssh-server</packagereq>
- <packagereq type="mandatory">parted</packagereq>
- <packagereq type="mandatory">passwd</packagereq>
- <packagereq type="mandatory">plymouth</packagereq>
- <packagereq type="mandatory">policycoreutils</packagereq>
- <packagereq type="mandatory">procps-ng</packagereq>
- <packagereq type="mandatory">rootfiles</packagereq>
- <packagereq type="mandatory">rpm</packagereq>
- <packagereq type="mandatory">rsyslog</packagereq>
- <packagereq type="mandatory">selinux-policy-targeted</packagereq>
- <packagereq type="mandatory">setup</packagereq>
- <packagereq type="mandatory">shadow-utils</packagereq>
- <packagereq type="mandatory">sudo</packagereq>
- <packagereq type="mandatory">systemd</packagereq>
- <packagereq type="mandatory">tar</packagereq>
- <packagereq type="mandatory">tuned</packagereq>
- <packagereq type="mandatory">util-linux</packagereq>
- <packagereq type="mandatory">vim-minimal</packagereq>
- <packagereq type="mandatory">xfsprogs</packagereq>
- <packagereq type="mandatory">yum</packagereq>
- <packagereq type="default">aic94xx-firmware</packagereq>
- <packagereq type="default">alsa-firmware</packagereq>
- <packagereq type="default">biosdevname</packagereq>
- <packagereq type="default">dracut-config-rescue</packagereq>
- <packagereq type="default">ivtv-firmware</packagereq>
- <packagereq type="default">iwl100-firmware</packagereq>
- <packagereq type="default">iwl1000-firmware</packagereq>
- <packagereq type="default">iwl105-firmware</packagereq>
- <packagereq type="default">iwl135-firmware</packagereq>
- <packagereq type="default">iwl2000-firmware</packagereq>
- <packagereq type="default">iwl2030-firmware</packagereq>
- <packagereq type="default">iwl3160-firmware</packagereq>
- <packagereq type="default">iwl3945-firmware</packagereq>
- <packagereq type="default">iwl4965-firmware</packagereq>
- <packagereq type="default">iwl5000-firmware</packagereq>
- <packagereq type="default">iwl5150-firmware</packagereq>
- <packagereq type="default">iwl6000-firmware</packagereq>
- <packagereq type="default">iwl6000g2a-firmware</packagereq>
- <packagereq type="default">iwl6000g2b-firmware</packagereq>
- <packagereq type="default">iwl6050-firmware</packagereq>
- <packagereq type="default">iwl7260-firmware</packagereq>
- <packagereq type="default">iwl7265-firmware</packagereq>
- <packagereq type="default">kernel-tools</packagereq>
- <packagereq type="default">libsysfs</packagereq>
- <packagereq type="default">linux-firmware</packagereq>
- <packagereq type="default">microcode_ctl</packagereq>
- <packagereq type="default">NetworkManager</packagereq>
- <packagereq type="default">NetworkManager-team</packagereq>
- <packagereq type="default">NetworkManager-tui</packagereq>
- <packagereq type="default">NetworkManager-wifi</packagereq>
- <packagereq type="default">postfix</packagereq>
- <packagereq type="optional">dracut-config-generic</packagereq>
- <packagereq type="optional">dracut-fips</packagereq>
- <packagereq type="optional">dracut-fips-aesni</packagereq>
- <packagereq type="optional">dracut-network</packagereq>
- <packagereq type="optional">initial-setup</packagereq>
- <packagereq type="optional">openssh-keycat</packagereq>
- <packagereq type="optional">rdma-core</packagereq>
- <packagereq type="optional">selinux-policy-mls</packagereq>
- <packagereq type="optional">tboot</packagereq>
- </packagelist>
- </group>
- <group>
- <id>debugging</id>
- <name>Debugging Tools</name>
- <name xml:lang="as">ডিবাগ কৰা সঁজুলিসমূহ</name>
- <name xml:lang="bn">ডিবাগ করতে ব্যবহৃত সরঞ্জাম</name>
- <name xml:lang="bn_IN">ডিবাগ করতে ব্যবহৃত সরঞ্জাম</name>
- <name xml:lang="cs">Nástroje pro ladění</name>
- <name xml:lang="de">Debugging-Tools</name>
- <name xml:lang="es">Herramientas de depuración</name>
- <name xml:lang="fr">Outils de débogage</name>
- <name xml:lang="gu">ડિબગીંગ સાધનો</name>
- <name xml:lang="hi">डिबगिंग औज़ार</name>
- <name xml:lang="ia">Instrumentos de depuration</name>
- <name xml:lang="it">Tool per il debug</name>
- <name xml:lang="ja">デバッグツール</name>
- <name xml:lang="kn">ದೋಷನಿವಾರಣಾ ಉಪಕರಣಗಳು</name>
- <name xml:lang="ko">디버깅 도구</name>
- <name xml:lang="ml">ഡീബഗ്ഗിങ് ഉപകരണങ്ങള്‍</name>
- <name xml:lang="mr">डिबगींग साधने</name>
- <name xml:lang="or">ତ୍ରୁଟି ନିବାରଣ ସାଧନଗୁଡ଼ିକ</name>
- <name xml:lang="pa">ਡੀਬੱਗਿੰਗ ਸੰਦ</name>
- <name xml:lang="pl">Narzędzia debugowania</name>
- <name xml:lang="pt_BR">Ferramentas de depuração</name>
- <name xml:lang="ru">Средства отладки</name>
- <name xml:lang="sv">Felsökningsverktyg</name>
- <name xml:lang="ta">பிழைதிருத்த கருவிகள்</name>
- <name xml:lang="te">డీబగ్గింగ్ సాధనములు</name>
- <name xml:lang="uk">Інструменти для зневаджування</name>
- <name xml:lang="zh_CN">调试工具</name>
- <name xml:lang="zh_TW">除錯工具</name>
- <description>Tools for debugging misbehaving applications and diagnosing performance problems.</description>
- <description xml:lang="as">বিশৃঙ্খল এপ্লিকেচন ডিবাগ কৰাৰ বাবে আৰু কাৰ্য্যক্ষমতাৰ সমস্যাৰ কাৰণ নিৰ্ণয় কৰাৰ বাবে বিভিন্ন সঁজুলিসমূহ।</description>
- <description xml:lang="bn">বিশৃঙ্খল অ্যাপ্লিকেশন ডিবাগ করার জন্য ও কর্মক্ষমতার সমস্যার কারণনির্ণয় করার জন্য বিভিন্ন সরঞ্জাম।</description>
- <description xml:lang="bn_IN">বিশৃঙ্খল অ্যাপ্লিকেশন ডিবাগ করার জন্য ও কর্মক্ষমতার সমস্যার কারণনির্ণয় করার জন্য বিভিন্ন সরঞ্জাম।</description>
- <description xml:lang="cs">Nástroje pro ladění nesprávně běžících aplikací a diagnostiku potíží s výkonem.</description>
- <description xml:lang="de">Tools für das Debuggen von fehlerhaften Anwendungen und zur Diagnose von Performanzproblemen.</description>
- <description xml:lang="es">Herramientas para depuración de aplicaciones que se comportan mal y diagnosis de problemas de rendimiento.</description>
- <description xml:lang="fr">Outils pour déboguer les applications ayant un mauvais comportement et diagnostiquer les problèmes de performance.</description>
- <description xml:lang="gu">ખરાબ વર્ણતૂકવાળા કાર્યક્રમોનું ડિબગીંગ અને પ્રભાવની સમસ્યાઓનું નિદાન કરવા માટેનાં સાધનો.</description>
- <description xml:lang="hi">बुरे अनुप्रयोगों और प्रदर्शन समस्या के निदान के लिए औजार.</description>
- <description xml:lang="ia">Utensiles pro depurar applicationes que non es functionante correctemente, e pro diagnosticar problemas in le rendimento.</description>
- <description xml:lang="it">Tool per il debug di applicazioni errate e per la diagnosi dei problemi sulle prestazioni.</description>
- <description xml:lang="ja">正しく動作しないアプリケーションをデバッグし、パフォーマンスの問題を分析するツールです。</description>
- <description xml:lang="kn">ತಪ್ಪಾಗಿ ವರ್ತಿಸುವ ಅನ್ವಯಗಳ ದೋಷನಿವಾರಣೆ ಹಾಗು ಕಾರ್ಯನಿರ್ವಹಣೆಯಲ್ಲಿನ ತೊಂದರೆಗಳನ್ನು ನಿವಾರಿಸುವ ಉಪಕರಣಗಳು.</description>
- <description xml:lang="ko">잘 못 동작하는 어플리케이션의 디버깅과 성능 문제 진단을 위한 도구.</description>
- <description xml:lang="ml">തകരാറുള്ള പ്രയോഗങ്ങളും പ്രവര്‍ത്തന പിശകുകളും ഡീബഗ്ഗ് ചെയ്യുന്നതിനുള്ള പ്രയോഗങ്ങള്‍.</description>
- <description xml:lang="mr">अयोग्य ऍप्लिकेशन्सच्या डिबगींग व क्षमता विश्लेषण संबंधीत अडचणींकरीता साधने.</description>
- <description xml:lang="or">ଖରାପ ଆଚରଣ କରୁଥିବା ପ୍ରୟୋଗର ତ୍ରୁଟି ନିବାରଣ ଏବଂ କାର୍ଯ୍ୟକ୍ଷମତା ସମସ୍ୟାର ବିଶ୍ଳେଷଣ କରିବା ପାଇଁ ସାଧନଗୁଡ଼ିକ।</description>
- <description xml:lang="pa">ਗਲਤ ਵਰਤਾਓ ਵਾਲੀਆਂ ਐਪਲੀਕੇਸ਼ਨਾਂ ਦੀ ਡੀਬੱਗਿੰਗ ਅਤੇ ਕਾਰਜਕੁਸ਼ਲਤਾ ਸਮੱਸਿਆਵਾਂ ਦੀ ਪੜਤਾਲ ਲਈ ਟੂਲ।</description>
- <description xml:lang="pl">Narzędzia do debugowania błędnie zachowujących się aplikacji i diagnozowania problemów z wydajnością.</description>
- <description xml:lang="pt_BR">Ferramentas para depurar aplicativos mal comportados e diagnosticar problemas de desempenho.</description>
- <description xml:lang="ru">Средства отладки приложений и проблем производительности.</description>
- <description xml:lang="sv">Verktyg för felsökning av program som beter sig felaktigt, och diagnostik av prestandaproblem.</description>
- <description xml:lang="ta">மோசமான பயன்பாடுகளின் பிழைதிருத்த மற்றும் செயற்படுத்தல் சிக்கல்களுக்கான கருவிகள்.</description>
- <description xml:lang="te">సరిగాప్రవర్తించని అనువర్తనముల మరియు పనితనపు సమస్యల విశ్లేషణా డీబగ్గింగ్ కొరకు సాధనములు.</description>
- <description xml:lang="uk">Програми для діагностики помилкової поведінки програми та проблем з швидкодією.</description>
- <description xml:lang="zh_CN">调试行为异常程序以及诊断性能问题的工具。</description>
- <description xml:lang="zh_TW">用來為執行不正常的應用程式除錯並為效能問題進行診斷的工具。</description>
- <default>false</default>
- <uservisible>false</uservisible>
- <packagelist>
- <packagereq type="mandatory">gdb</packagereq>
- <packagereq type="mandatory">kexec-tools</packagereq>
- <packagereq type="mandatory">latrace</packagereq>
- <packagereq type="mandatory">libreport-cli</packagereq>
- <packagereq type="mandatory">strace</packagereq>
- <packagereq type="mandatory">systemtap-runtime</packagereq>
- <packagereq type="default">abrt-addon-ccpp</packagereq>
- <packagereq type="default">abrt-addon-python</packagereq>
- <packagereq type="default">abrt-cli</packagereq>
- <packagereq type="default">crash</packagereq>
- <packagereq type="default">crash-gcore-command</packagereq>
- <packagereq type="default">crash-ptdump-command</packagereq>
- <packagereq type="default">crash-trace-command</packagereq>
- <packagereq type="default">elfutils</packagereq>
- <packagereq type="default">kernel-tools</packagereq>
- <packagereq type="default">libreport-plugin-mailx</packagereq>
- <packagereq type="default">ltrace</packagereq>
- <packagereq type="default">memstomp</packagereq>
- <packagereq type="default">ps_mem</packagereq>
- <packagereq type="default">trace-cmd</packagereq>
- <packagereq type="default">valgrind</packagereq>
- <packagereq type="optional">abrt-java-connector</packagereq>
- <packagereq type="optional">gdb-gdbserver</packagereq>
- <packagereq type="optional">glibc-utils</packagereq>
- <packagereq type="optional">memtest86+</packagereq>
- <packagereq type="optional">systemtap-client</packagereq>
- <packagereq type="optional">systemtap-initscript</packagereq>
- </packagelist>
- </group>
- <group>
- <id>desktop-debugging</id>
- <name>Desktop Debugging and Performance Tools</name>
- <name xml:lang="as">ডেস্কটপ ডিবাগ আৰু কাৰ্য্যক্ষমতাৰ সম্বন্ধীয় সঁজুলিসমূহ</name>
- <name xml:lang="bn">ডেস্কটপ ডিবাগ ও কর্মক্ষমতার সম্বন্ধীয় সামগ্রী</name>
- <name xml:lang="bn_IN">ডেস্কটপ ডিবাগ ও কর্মক্ষমতার সম্বন্ধীয় সামগ্রী</name>
- <name xml:lang="cs">Nástroje pro ladění pracovního prostředí a sledování výkonu</name>
- <name xml:lang="de">Debugging- und Performance-Tools für den Desktop</name>
- <name xml:lang="es">Depuración de escritorio y herramientas de rendimiento</name>
- <name xml:lang="fr">Outils de débogage et performance du bureau</name>
- <name xml:lang="gu">ડેસ્કટોપ ડિબગીંગ અને પ્રભાવ સાધનો</name>
- <name xml:lang="hi">डेस्कटॉप डिबगिंग और प्रदर्शन औज़ार</name>
- <name xml:lang="ia">Instrumentos de scriptorio pro depuration e rendimento</name>
- <name xml:lang="it">Tool per le prestazioni e di debug del desktop</name>
- <name xml:lang="ja">デスクトップのデバッグとパフォーマンスツール</name>
- <name xml:lang="kn">ಗಣಕತೆರೆ ದೋಷನಿವಾರಣೆ ಹಾಗು ಕಾರ್ಯನಿರ್ವಹಣಾ ಉಪಕರಣಗಳು</name>
- <name xml:lang="ko">데스크탑 디버깅과 성능 도구</name>
- <name xml:lang="ml">ഡസ്ക്ടോപ്പ് ഡീബഗ്ഗിങും പ്രവര്‍ത്തനത്തിനുമുള്ള ഉപകരണങ്ങള്‍</name>
- <name xml:lang="mr">डेस्कटॉप डिबगींग व क्षमता साधने</name>
- <name xml:lang="or">ଡେସ୍କଟପ ତ୍ରୁଟିନିବାରଣ ଏବଂ କାର୍ଯ୍ୟକ୍ଷମତା ସାଧନଗୁଡ଼ିକ</name>
- <name xml:lang="pa">ਡੈਸਕਟਾਪ ਡੀਬੱਗਿੰਗ ਅਤੇ ਕਾਰਜਕੁਸ਼ਲਤਾ ਸੰਦ</name>
- <name xml:lang="pl">Narzędzia debugowania i obliczania wydajności środowisk graficznych</name>
- <name xml:lang="pt_BR">Depuração de Desktop e Ferramentas de Desempenho</name>
- <name xml:lang="ru">Средства отладки и поддержки производительности рабочего стола.</name>
- <name xml:lang="sv">Skrivbordsfelsöknings- och prestandaverktyg</name>
- <name xml:lang="ta">பணிமேடை பிழைதிருத்தி மற்றும் செயற்படுத்தல் கருவிகள்</name>
- <name xml:lang="te">డెస్కుటాప్ డీబగ్గింగ్ మరియు పనితనం సాధనములు</name>
- <name xml:lang="uk">Програми для діагностики та перевірки швидкодії робочої станції</name>
- <name xml:lang="zh_CN">桌面调试和运行工具</name>
- <name xml:lang="zh_TW">桌面環境除錯與效能工具</name>
- <description>GUI tools for debugging applications and performance.</description>
- <description xml:lang="as">এপ্লিকেচন ডিবাগ কৰিবলৈ আৰু কাৰ্য্যক্ষমতা সম্বন্ধীয় GUI সঁজুলিসমূহ।</description>
- <description xml:lang="bn">অ্যাপ্লিকেশন ডিবাগ করতে ও কর্মক্ষমতা সম্বন্ধীয় GUI সরঞ্জাম।</description>
- <description xml:lang="bn_IN">অ্যাপ্লিকেশন ডিবাগ করতে ও কর্মক্ষমতা সম্বন্ধীয় GUI সরঞ্জাম।</description>
- <description xml:lang="cs">Grafické nástroje pro ladění aplikací a výkonu.</description>
- <description xml:lang="de">GUI-Tools für das Debuggen von Applikationen und deren Performanz.</description>
- <description xml:lang="es">Herramientas GUI para aplicaciones de depuración y rendimiento.</description>
- <description xml:lang="fr">Outils de GUI pour le débogage et la performance d'applications.</description>
- <description xml:lang="gu">ડિબગીંગ કાર્યક્રમો અને પ્રભાવ માટે GUI સાધનો.</description>
- <description xml:lang="hi">अनुप्रयोग डबगिंग और प्रदर्शन के लिए GUI औजार.</description>
- <description xml:lang="ia">Utensiles graphic pro depuration e rendimento de applicationes.</description>
- <description xml:lang="it">Tool della GUI per prestazioni ed il debug delle applicazioni.</description>
- <description xml:lang="ja">アプリケーションやパフォーマンスのデバッグを行うための GUI ツール</description>
- <description xml:lang="kn">ದೋಷನಿವಾರಣೆ ಹಾಗು ಕಾರ್ಯನಿರ್ವಹಣೆಗಾಗಿನ GUI ಉಪಕರಣಗಳು.</description>
- <description xml:lang="ko">프로그램 디버깅과 성능 향상을 위한 GUI 도구</description>
- <description xml:lang="ml">പ്രയോഗങ്ങളും പ്രവര്‍ത്തനവും ഡീബഗ്ഗ് ചെയ്യുന്നതിനുള്ള GUI പ്രയോഗങ്ങള്‍.</description>
- <description xml:lang="mr">ऍप्लिकेशन्स् व क्षमता डिबग करण्यासाठी GUI साधने.</description>
- <description xml:lang="or">ପ୍ରୟୋଗଗୁଡ଼ିକର ତ୍ରୁଟି ନିବାରଣ ଏବଂ କାର୍ଯ୍ୟକ୍ଷମତା ପାଇଁ GUI ସାଧନଗୁଡ଼ିକ।</description>
- <description xml:lang="pa">ਐਪਲੀਕੇਸ਼ਨ ਅਤੇ ਕਾਰਜਕੁਸ਼ਲਤਾ ਡੀਬੱਗਿੰਗ ਲਈ GUI ਸੰਦ।</description>
- <description xml:lang="pl">Narzędzia graficzne do debugowania aplikacji i mierzenia wydajności.</description>
- <description xml:lang="pt_BR">Ferramentas GUI para depurar aplicativos e desempenho.</description>
- <description xml:lang="ru">Графические инструменты отладки приложений и контроля производительности.</description>
- <description xml:lang="sv">Grafiska verktyg för felsökning av program och prestanda.</description>
- <description xml:lang="ta">பிழைதிருத்த பயன்பாடுகள் மற்றும் செயற்படுதலுக்கான GUI கருவிகள்.</description>
- <description xml:lang="te">అనువర్తనముల మరియు పనితనం డీబగ్గింగ్‌కు GUI సాధనములు.</description>
- <description xml:lang="uk">Графічні інструмент для діагностики програм та визначення джерел проблем зі швидкодією.</description>
- <description xml:lang="zh_CN">调试应用程序和性能的 GUI 工具。</description>
- <description xml:lang="zh_TW">用來為應用程式和效能進行除錯的 GUI 工具。</description>
- <default>false</default>
- <uservisible>false</uservisible>
- <packagelist>
- <packagereq type="default">abrt-desktop</packagereq>
- <packagereq type="default">crash</packagereq>
- <packagereq type="default">libreport-gtk</packagereq>
- <packagereq type="optional">abrt-gui</packagereq>
- <packagereq type="optional">bltk</packagereq>
- <packagereq type="optional">oprofile-gui</packagereq>
- <packagereq type="optional">pcp-gui</packagereq>
- <packagereq type="optional">tuna</packagereq>
- <packagereq type="optional">xrestop</packagereq>
- </packagelist>
- </group>
- <group>
- <id>development</id>
- <name>Development Tools</name>
- <name xml:lang="af">Ontwikkelingsnutsgoed</name>
- <name xml:lang="am">ማሳደጊያ መሣሪያዎች</name>
- <name xml:lang="ar">أدوات التطوير</name>
- <name xml:lang="as">উন্নয়ন সঁজুলিসমূহ</name>
- <name xml:lang="bal">وسایل پیشروگ</name>
- <name xml:lang="be">Сродкі распрацоўкі праграм</name>
- <name xml:lang="bg">Инструменти за разработка</name>
- <name xml:lang="bn">সফ্টওয়্যার নির্মাণের জন্য প্রয়োজনীয় টুল</name>
- <name xml:lang="bn_IN">সফ্টওয়্যার নির্মাণের জন্য প্রয়োজনীয় টুল</name>
- <name xml:lang="bs">Razvojni alati</name>
- <name xml:lang="ca">Eines de desenvolupament</name>
- <name xml:lang="cs">Vývojářské nástroje</name>
- <name xml:lang="cy">Arfau Datblygu</name>
- <name xml:lang="da">Udviklingsværktøjer</name>
- <name xml:lang="de">Entwicklungswekzeuge</name>
- <name xml:lang="el">Εργαλεία ανάπτυξης λογισμικού</name>
- <name xml:lang="en_GB">Development Tools</name>
- <name xml:lang="es">Herramientas de desarrollo</name>
- <name xml:lang="et">Arendusvahendid</name>
- <name xml:lang="fa">ابزارهای برنامه‌سازی</name>
- <name xml:lang="fi">Ohjelmistokehitystyökalut</name>
- <name xml:lang="fr">Outils de développement</name>
- <name xml:lang="gl">Ferramentas de desenvolvemento</name>
- <name xml:lang="gu">વિકાસના સાધનો</name>
- <name xml:lang="he">כלי פיתוח</name>
- <name xml:lang="hi">विकासात्मक उपकरण</name>
- <name xml:lang="hr">Razvojni alati</name>
- <name xml:lang="hu">Fejlesztőeszközök</name>
- <name xml:lang="hy">Ծրագրավորման գործիքներ</name>
- <name xml:lang="ia">Instrumentos de disveloppamento</name>
- <name xml:lang="id">Peralatan Pengembangan</name>
- <name xml:lang="ilo">Ramramit a Pambukel</name>
- <name xml:lang="is">Þróunartól</name>
- <name xml:lang="it">Strumenti di sviluppo</name>
- <name xml:lang="ja">開発ツール</name>
- <name xml:lang="ka">პროგრამირების ინსტრუმენტები</name>
- <name xml:lang="kn">ವಿಕಸನ ಉಪಕರಣಗಳು</name>
- <name xml:lang="ko">개발용 도구</name>
- <name xml:lang="lv">Programmēšanas rīki</name>
- <name xml:lang="mai">विकासात्मक अओजार</name>
- <name xml:lang="mk">Алатки за развој</name>
- <name xml:lang="ml">ഡെവലപ്പ്മെന്‍റ് ഉപകരണങ്ങള്‍</name>
- <name xml:lang="mr">विकास उपकरणे</name>
- <name xml:lang="ms">Alatan Pembangunan</name>
- <name xml:lang="nb">Utviklingsverktøy</name>
- <name xml:lang="ne">विकास उपकरण</name>
- <name xml:lang="nl">Ontwikkelingshulpmiddelen</name>
- <name xml:lang="no">Utviklingsverktøy</name>
- <name xml:lang="nso">Didirišwa tša Tšwetšopele</name>
- <name xml:lang="or">ବିକାଶ ଉପକରଣ</name>
- <name xml:lang="pa">ਵਿਕਾਸ ਸੰਦ</name>
- <name xml:lang="pl">Narzędzia programistyczne</name>
- <name xml:lang="pt">Ferramentas de Desenvolvimento</name>
- <name xml:lang="pt_BR">Ferramentas de Desenvolvimento</name>
- <name xml:lang="ro">Unelte pentru dezvoltare</name>
- <name xml:lang="ru">Средства разработки</name>
- <name xml:lang="si">ප්‍රවර්ධන මෙවලම්</name>
- <name xml:lang="sk">Vývojárske nástroje</name>
- <name xml:lang="sl">Razvojna orodja</name>
- <name xml:lang="sq">Mjete Zhvillimi</name>
- <name xml:lang="sr">Развојне алатке</name>
- <name xml:lang="sr@latin">Razvojne alatke</name>
- <name xml:lang="sr@Latn">Razvojne alatke</name>
- <name xml:lang="sv">Utvecklingsverktyg</name>
- <name xml:lang="ta">உருவாக்கம் கருவிகள்</name>
- <name xml:lang="te">అబివృద్ధిచేయు సాధనములు</name>
- <name xml:lang="tg">Асбобҳои барноманависӣ</name>
- <name xml:lang="th">เครื่องมือสำหรับการพัฒนาซอฟต์แวร์</name>
- <name xml:lang="tr">Geliştirme Araçları</name>
- <name xml:lang="uk">Засоби розробки</name>
- <name xml:lang="ur">تعمیر کے الات</name>
- <name xml:lang="vi">Công cụ phát triển</name>
- <name xml:lang="zh_CN">开发工具</name>
- <name xml:lang="zh_TW">開發工具</name>
- <name xml:lang="zu">Amathuluzi Okuthuthukisa</name>
- <description>A basic development environment.</description>
- <description xml:lang="as">উন্নয়নৰ বাবে মৌলিক পৰিৱেশ।</description>
- <description xml:lang="bn">ডিভেলমেন্টের জন্য মৌলিক পরিবেশ।</description>
- <description xml:lang="bn_IN">ডিভেলমেন্টের জন্য মৌলিক পরিবেশ।</description>
- <description xml:lang="cs">Základní vývojové prostředí.</description>
- <description xml:lang="de">Eine grundlegende Entwicklungsumgebung.</description>
- <description xml:lang="es">Un entorno de desarrollo básico.</description>
- <description xml:lang="eu">Oinarrizko garapen ingurune bat</description>
- <description xml:lang="fr">Un environnement de développement de base.</description>
- <description xml:lang="gu">આધાર વિકાસ પર્યાવરણ.</description>
- <description xml:lang="hi">मौलिक विकास वातावरण.</description>
- <description xml:lang="ia">Un ambiente de disveloppamento basic.</description>
- <description xml:lang="it">Un ambiente di sviluppo di base.</description>
- <description xml:lang="ja">基本的な開発環境</description>
- <description xml:lang="kn">ಒಂದು ಮೂಲಭೂತ ವಿಕಸನಾ ಪರಿಸರ.</description>
- <description xml:lang="ko">기본 개발 환경.</description>
- <description xml:lang="ml">ഒരു അടിസ്ഥാന ഡെവലപ്പ്മെന്റ് എന്‍വയോണ്മെന്റ്.</description>
- <description xml:lang="mr">मुळ डेव्हलपमेंट एन्वार्यनमेंट.</description>
- <description xml:lang="or">ଗୋଟିଏ ମୌଳିକ ବିକାଶ ପରିବେଶ।</description>
- <description xml:lang="pa">ਇੱਕ ਮੁਢਲਾ ਵਿਕਾਸ ਵਾਤਾਵਰਣ।</description>
- <description xml:lang="pl">Podstawowe środowisko programistyczne.</description>
- <description xml:lang="pt_BR">O ambiente básico de desenvolvimento</description>
- <description xml:lang="ru">Стандартная среда разработки.</description>
- <description xml:lang="sv">En grundläggande utvecklingsmiljö.</description>
- <description xml:lang="ta">ஒரு அடிப்படை வளர்ச்சி சூழல்.</description>
- <description xml:lang="te">ఒక ప్రాధమిక అభివృద్ది వాతావరణం.</description>
- <description xml:lang="uk">Базове середовище розробки.</description>
- <description xml:lang="zh_CN">基本开发环境。</description>
- <description xml:lang="zh_TW">基本開發環境。</description>
- <default>false</default>
- <uservisible>true</uservisible>
- <packagelist>
- <packagereq type="mandatory">autoconf</packagereq>
- <packagereq type="mandatory">automake</packagereq>
- <packagereq type="mandatory">binutils</packagereq>
- <packagereq type="mandatory">bison</packagereq>
- <packagereq type="mandatory">flex</packagereq>
- <packagereq type="mandatory">gcc</packagereq>
- <packagereq type="mandatory">gcc-c++</packagereq>
- <packagereq type="mandatory">gettext</packagereq>
- <packagereq type="mandatory">libtool</packagereq>
- <packagereq type="mandatory">make</packagereq>
- <packagereq type="mandatory">patch</packagereq>
- <packagereq type="mandatory">pkgconfig</packagereq>
- <packagereq type="mandatory">redhat-rpm-config</packagereq>
- <packagereq type="mandatory">rpm-build</packagereq>
- <packagereq type="mandatory">rpm-sign</packagereq>
- <packagereq type="default">byacc</packagereq>
- <packagereq type="default">cscope</packagereq>
- <packagereq type="default">ctags</packagereq>
- <packagereq type="default">diffstat</packagereq>
- <packagereq type="default">doxygen</packagereq>
- <packagereq type="default">elfutils</packagereq>
- <packagereq type="default">gcc-gfortran</packagereq>
- <packagereq type="default">git</packagereq>
- <packagereq type="default">indent</packagereq>
- <packagereq type="default">intltool</packagereq>
- <packagereq type="default">patchutils</packagereq>
- <packagereq type="default">rcs</packagereq>
- <packagereq type="default">subversion</packagereq>
- <packagereq type="default">swig</packagereq>
- <packagereq type="default">systemtap</packagereq>
- <packagereq type="optional">ant</packagereq>
- <packagereq type="optional">babel</packagereq>
- <packagereq type="optional">bzr</packagereq>
- <packagereq type="optional">chrpath</packagereq>
- <packagereq type="optional">cmake</packagereq>
- <packagereq type="optional">compat-gcc-44</packagereq>
- <packagereq type="optional">compat-gcc-44-c++</packagereq>
- <packagereq type="optional">cvs</packagereq>
- <packagereq type="optional">dejagnu</packagereq>
- <packagereq type="optional">ElectricFence</packagereq>
- <packagereq type="optional">expect</packagereq>
- <packagereq type="optional">gcc-gnat</packagereq>
- <packagereq type="optional">gcc-objc</packagereq>
- <packagereq type="optional">gcc-objc++</packagereq>
- <packagereq type="optional">imake</packagereq>
- <packagereq type="optional">javapackages-tools</packagereq>
- <packagereq type="optional">ksc</packagereq>
- <packagereq type="optional">libstdc++-docs</packagereq>
- <packagereq type="optional">mercurial</packagereq>
- <packagereq type="optional">mod_dav_svn</packagereq>
- <packagereq type="optional">nasm</packagereq>
- <packagereq type="optional">perltidy</packagereq>
- <packagereq type="optional">python-docs</packagereq>
- <packagereq type="optional">rpmdevtools</packagereq>
- <packagereq type="optional">rpmlint</packagereq>
- <packagereq type="optional">systemtap-sdt-devel</packagereq>
- <packagereq type="optional">systemtap-server</packagereq>
- </packagelist>
- </group>
- <group>
- <id>dial-up</id>
- <name>Dial-up Networking Support</name>
- <name xml:lang="ar">دعم شبكات الاتصال الهاتفي</name>
- <name xml:lang="as">ডায়েল-আপ কৰা নেটৱাৰ্কিং সমৰ্থন</name>
- <name xml:lang="bal">حمایت شبکه ای دیال آپ</name>
- <name xml:lang="bg">Поддръжка на Dailup мрежи</name>
- <name xml:lang="bn">ডায়াল-আপ নেটওয়ার্কিং ব্যবস্থা</name>
- <name xml:lang="bn_IN">ডায়াল-আপ নেটওয়ার্কিং ব্যবস্থা</name>
- <name xml:lang="bs">Podrška za telefoniranje</name>
- <name xml:lang="ca">Suport per a la connexió a la xarxa</name>
- <name xml:lang="cs">Telefonické připojení</name>
- <name xml:lang="da">Understøttelse for opkaldt netopkobling</name>
- <name xml:lang="de">Unterstützung für DFÜ-Netzwerke</name>
- <name xml:lang="el">Υποστήριξη δικτύωσης μέσω τηλεφώνου</name>
- <name xml:lang="es">Soporte de Red por Módem</name>
- <name xml:lang="et">Sissehelistamisega võrgutamise tugi</name>
- <name xml:lang="fi">Tuki puhelinverkkoyhteyksille</name>
- <name xml:lang="fr">Prise en charge de l'accès à distance au réseau</name>
- <name xml:lang="gu">ડાયલ-અપ નેટવર્કીંગ આધાર</name>
- <name xml:lang="he">תמיכה בחיוג לרשת</name>
- <name xml:lang="hi">ड़ायलअप संजालन समर्थन</name>
- <name xml:lang="hr">Podrška za telefoniranje</name>
- <name xml:lang="hu">Telefonos hálózat támogatása</name>
- <name xml:lang="hy">Հեռախոսային միացման հնարավորություն</name>
- <name xml:lang="ia">Supporto de connexion a rete per modem</name>
- <name xml:lang="id">Dukungan Dialup Networking</name>
- <name xml:lang="is">Upphringinetsstuðningur</name>
- <name xml:lang="it">Supporto Networking dialup</name>
- <name xml:lang="ja">ダイヤルアップネットワークサポート</name>
- <name xml:lang="kn">ದೂರವಾಣಿ ಮೂಲಕ ಜಾಲವ್ಯವಸ್ಥೆಯ ಬೆಂಬಲ</name>
- <name xml:lang="ko">전화연결 네트워킹 지원</name>
- <name xml:lang="lv">Iezvanpiekļuve datortīkliem</name>
- <name xml:lang="mai">ड़ायलअप संजालन समर्थन</name>
- <name xml:lang="ml">ഡൈല്‍-അപ്പ് നെറ്റ്‍വര്‍ക്കിങ് പിന്തുണ</name>
- <name xml:lang="mr">डायल-अप संजालन समर्थन</name>
- <name xml:lang="ms">Sokongan Rangkaian Dail-up</name>
- <name xml:lang="nb">Støtte for oppringt nettverk</name>
- <name xml:lang="ne">डायल-अप नेटवर्किङ समर्थन</name>
- <name xml:lang="nl">Inbelnetwerk ondersteuning</name>
- <name xml:lang="or">ଡାଏଲ-ଅପ ନେଟୱାର୍କିଙ୍ଗ ସହାୟତା</name>
- <name xml:lang="pa">ਡਾਇਲ-ਅੱਪ ਨੈੱਟਵਰਕ ਸਹਿਯੋਗ</name>
- <name xml:lang="pl">Obsługa sieci dial-up</name>
- <name xml:lang="pt">Suporte a Redes Telefónicas</name>
- <name xml:lang="pt_BR">Suporte à Rede Dialup</name>
- <name xml:lang="ro">Suport pentru acces la reţea prin telefon</name>
- <name xml:lang="ru">Удалённый доступ к сети</name>
- <name xml:lang="si">ඩයල්අප් ජාල පහසුකම</name>
- <name xml:lang="sk">Podpora telefonického pripojenia</name>
- <name xml:lang="sl">Podpora za klicne povezave</name>
- <name xml:lang="sq">Mbulim Punimi në Rrjet Dial-up</name>
- <name xml:lang="sr">Подршка за телефонско умрежавање</name>
- <name xml:lang="sr@latin">Podrška za telefonsko umrežavanje</name>
- <name xml:lang="sr@Latn">Podrška za telefonsko umrežavanje</name>
- <name xml:lang="sv">Stöd för uppringt nätverk</name>
- <name xml:lang="ta">டயல்-அப் பிணைய ஆதரவு</name>
- <name xml:lang="te">డయిల్-అప్ నెట్ వర్కు మద్దతు</name>
- <name xml:lang="tg">Рақамзании Интернет Dial-up</name>
- <name xml:lang="tr">Çevirmeli Ağ Desteği</name>
- <name xml:lang="uk">Комутований доступ до мережі</name>
- <name xml:lang="zh_CN">拨号网络支持</name>
- <name xml:lang="zh_TW">撥號網路支援</name>
- <description>Tools for connecting via WWAN, PPP or ISDN.</description>
- <description xml:lang="as">WWAN, PPP বা ISDN ৰে সংযোগ কৰিবলে সঁজুলিসমূহ।</description>
- <description xml:lang="bn_IN">WWAN, PPP অথবা ISDN-র মাধ্যমে সংযোগ স্থাপনার বিভিন্ন সরঞ্জাম।</description>
- <description xml:lang="cs">Nástroje pro připojení pomocí protokolů WWAN, PPP nebo ISDN.</description>
- <description xml:lang="de">Werkzeuge zur Verbindung über WWAN, PPP oder ISDN.</description>
- <description xml:lang="es">Herramientas para conexión vía WWAN, PPP o ISDN.</description>
- <description xml:lang="fr">Outils de connexion via WWAN, PPP ou ISDN.</description>
- <description xml:lang="gu">WWAN, PPP અથવા ISDN મારફતે જોડાવા માટેના સાધનો.</description>
- <description xml:lang="hi">WWAN, PPP या ISDN के द्वारा कनेक्टिंग के लिए औज़ार.</description>
- <description xml:lang="it">Strumenti per il collegamento tramite WWAN, PPP o ISDN.</description>
- <description xml:lang="ja">WWAN、PPP または ISDN 経由の接続に使用するツールです。</description>
- <description xml:lang="kn">WWAN, PPP ಅಥವ ISDN ಮೂಲಕ ಸಂಪರ್ಕಸಾಧಿಸಲು ಬಳಸಲಾಗುವ ಉಪಕರಣಗಳು.</description>
- <description xml:lang="ko">WWAN, PPP나 ISDN을 통한 연결을 위한 도구.</description>
- <description xml:lang="ml">ഡബ്ല്യൂഡബ്ല്യൂഎഎന്‍, പിപിപി അല്ലെങ്കില്‍ ഐഎസ്ഡിഎന്‍ മുഖേന കണക്ട് ചെയ്യുന്നതിനുള്ള പ്രയോഗങ്ങള്‍</description>
- <description xml:lang="mr">WWAN, PPP किंवा ISDN मार्फत जोडणीकरिता साधने.</description>
- <description xml:lang="or">WWAN, PPP କିମ୍ବା ISDN ମାଧ୍ଯମରେ ସଂଯୋଗ କରିବା ପାଇଁ ସାଧନଗୁଡ଼ିକ।</description>
- <description xml:lang="pa">WWAN, PPP ਜਾਂ ISDN ਦੁਆਰਾ ਸੰਪਰਕ ਜੋੜਨ ਲਈ ਸੰਦ।</description>
- <description xml:lang="pl">Narzędzia do łączenia się przez WWAN, PPP lub ISDN.</description>
- <description xml:lang="pt_BR">Ferramentas para conectar via WWAN, PPP ou ISDN.</description>
- <description xml:lang="ru">Средства подключения через WWAN, PPP, ISDN.</description>
- <description xml:lang="ta">WWAN, PPP அல்லது ISDN வழியாக இணைப்பதற்கான கருவிகள்.</description>
- <description xml:lang="te">WWAN, PPP లేదా ISDN ద్వారా అనుసంధానమగుటకు సాధనాలు.</description>
- <description xml:lang="uk">Програми для встановлення з’єднання за допомогою WWAN, PPP або ISDN.</description>
- <description xml:lang="zh_CN">通过 WWAN、PPP 或者 ISDN 连接的工具。</description>
- <description xml:lang="zh_TW">用來透過 WWAN、PPP 或是 ISDN 連線的工具</description>
- <default>false</default>
- <uservisible>false</uservisible>
- <packagelist>
- <packagereq type="mandatory">lrzsz</packagereq>
- <packagereq type="mandatory">ModemManager</packagereq>
- <packagereq type="mandatory">NetworkManager-adsl</packagereq>
- <packagereq type="mandatory">NetworkManager-ppp</packagereq>
- <packagereq type="mandatory">ppp</packagereq>
- <packagereq type="mandatory">usb_modeswitch-data</packagereq>
- <packagereq type="mandatory">wvdial</packagereq>
- <packagereq type="optional">efax</packagereq>
- <packagereq type="optional">isdn4k-utils</packagereq>
- <packagereq type="optional">minicom</packagereq>
- <packagereq type="optional">pptp</packagereq>
- <packagereq type="optional">rp-pppoe</packagereq>
- </packagelist>
- </group>
- <group>
- <id>directory-client</id>
- <name>Directory Client</name>
- <name xml:lang="as">ডাইৰেকটৰি ক্লাএন্ট</name>
- <name xml:lang="bn">ডিরেক্টরি ক্লায়েন্ট</name>
- <name xml:lang="bn_IN">ডিরেক্টরি ক্লায়েন্ট</name>
- <name xml:lang="cs">klient LDAP</name>
- <name xml:lang="de">Verzeichnis-Client</name>
- <name xml:lang="es">Cliente de directorio</name>
- <name xml:lang="eu">Direktorio-bezeroa</name>
- <name xml:lang="fr">Client LDAP</name>
- <name xml:lang="gu">ડિરેક્ટરી ક્લાયન્ટ</name>
- <name xml:lang="hi">निर्देशिका क्लाइंट</name>
- <name xml:lang="ia">Cliente de directorio</name>
- <name xml:lang="it">Directory Client</name>
- <name xml:lang="ja">ディレクトリ接続クライアント</name>
- <name xml:lang="kn">ಡಿರೆಕ್ಟರಿ ಕ್ಲೈಂಟ್</name>
- <name xml:lang="ko">디렉터리 클라이언트</name>
- <name xml:lang="ml">ഡയറക്ടറി ക്ലയന്റ്</name>
- <name xml:lang="mr">डिरेक्ट्री क्लाएंट</name>
- <name xml:lang="or">ଡିରେକ୍ଟୋରୀ କ୍ଲାଏଣ୍ଟ</name>
- <name xml:lang="pa">ਡਾਇਰੈਕਟਰੀ ਕਲਾਈਂਟ</name>
- <name xml:lang="pl">Klient katalogu</name>
- <name xml:lang="pt_BR">Cliente de Diretório</name>
- <name xml:lang="ru">Клиент каталогов</name>
- <name xml:lang="sv">Katalogklient</name>
- <name xml:lang="ta">அடைவு வாடிக்கையாளர்</name>
- <name xml:lang="te">డైరెక్టరీ క్లైంట్</name>
- <name xml:lang="uk">Клієнт служби каталогів</name>
- <name xml:lang="zh_CN">目录客户端</name>
- <name xml:lang="zh_TW">目錄客戶端</name>
- <description>Clients for integration into a network managed by a directory service.</description>
- <description xml:lang="as">নেটৱাৰ্ক দ্বাৰা পৰিচালিত ডাইৰেকটৰি সেৱাৰ সৈতে অনুকলনৰ বাবে ব্যৱহাৰযোগ্য ক্লাএন্ট।</description>
- <description xml:lang="bn">নেটওয়ার্ক দ্বারা পরিচালিত ডিরেক্টরি পরিসেবার সাথে একত্রিকরণের জন্য ব্যবহারযোগ্য ক্লায়েন্ট।</description>
- <description xml:lang="bn_IN">নেটওয়ার্ক দ্বারা পরিচালিত ডিরেক্টরি পরিসেবার সাথে একত্রিকরণের জন্য ব্যবহারযোগ্য ক্লায়েন্ট।</description>
- <description xml:lang="cs">Klienti pro integraci do sítí spravovaných adresářovou službou.</description>
- <description xml:lang="de">Clients zur Integration in ein via Directory Service verwaltetes Netzwerk.</description>
- <description xml:lang="es">Clientes para integración en una red administrada por un servicio de directorio.</description>
- <description xml:lang="fr">Clients pour intégration dans un réseau géré par un service répertoire.</description>
- <description xml:lang="gu">ડિરેક્ટરી સેવા દ્દારા સંચાલિત થયેલ નેટવર્કમાં એકત્રીકરણ માટે ક્લાયન્ટો.</description>
- <description xml:lang="hi">निर्देशिका सेवा के द्वारा प्रबंधित संजाल में एकीकरण के लिए क्लाइंट.</description>
- <description xml:lang="ia">Clientes pro integrar a un rete administrate per un servicio de directorio.</description>
- <description xml:lang="it">Client per l'integrazione in una rete gestita da un servizio della directory.</description>
- <description xml:lang="ja">ディレクトリサービスによって管理されるネットワークに統合するための接続クライアント</description>
- <description xml:lang="kn">ಡಿರೆಕ್ಟರಿ ಸೇವೆಯಿಂದ ನಿರ್ವಹಿಸಲಾಗುತ್ತಿರುವ ಜಾಲಬಂಧದೊಂದಿಗೆ ಸೇರ್ಪಡಿಸುವ ಕ್ಲೈಂಟ್‌ಗಳು.</description>
- <description xml:lang="ko">디렉터리 서비스에 의해 관리되는 네트워크에 통합하기 위한 클라이언트</description>
- <description xml:lang="ml">ഒരു ഡയറക്ടറി സര്‍വീസ് കൈകാര്യം ചെയ്യുന്ന നെറ്റ്‌വര്‍ക്കിലേക്ക് ചേര്‍ക്കുന്നതിനുള്ള ക്ലയന്റുകള്‍.</description>
- <description xml:lang="mr">डिरेक्ट्री सर्व्हिस द्वारे व्यवस्थापीत नेटवर्कमध्ये एकत्रीत करण्यासाठी क्लाएंट्स्.</description>
- <description xml:lang="or">ଡିରେକ୍ଟୋରୀ ସର୍ଭିସ ଦ୍ୱାରା ପରିଚାଳିତ ନେଟୱର୍କ ଭିତରେ ସଂଯୁକ୍ତ କରିବା ପାଇଁ କ୍ଲାଏଣ୍ଟ।</description>
- <description xml:lang="pa">ਡਾਇਰੈਕਟਰੀ ਸਰਵਿਸ ਦੁਆਰਾ ਪਰਬੰਧਿਤ ਨੈੱਟਵਰਕ ਨਾਲ ਜੁੜਨ ਲਈ ਕਲਾਂਈਟ।</description>
- <description xml:lang="pl">Klienci do integrowania z siecią zarządzaną przez usługę katalogu.</description>
- <description xml:lang="pt_BR">Clientes para integração com a rede gerenciada pelo serviço de diretório.</description>
- <description xml:lang="ru">Клиенты для интеграции с сетью под управлением службы каталогов.</description>
- <description xml:lang="sv">Klienter för integrering i ett nätverk som hanteras med en katalogtjänst.</description>
- <description xml:lang="ta">ஒரு அடைவு சேவையால் பராமரிக்கப்பட்ட ஒரு பிணையத்தின் ஒருமைபாட்டிற்கான வாடிக்கையாளர்கள்</description>
- <description xml:lang="te">డైరెక్టరీ సేవ ద్వారా నిర్వహించబడుచున్న నెట్వర్కులోనికి విలీనం చెందుటకు క్లైంట్లు.</description>
- <description xml:lang="uk">Клієнтські програми для інтеграції до мережі, якою керує служба каталогів.</description>
- <description xml:lang="zh_CN">用于整合到使用目录服务管理的网络的客户端。</description>
- <description xml:lang="zh_TW">用來整合入一個由目錄服務所管理的網路的客戶端。</description>
- <default>false</default>
- <uservisible>false</uservisible>
- <packagelist>
- <packagereq type="default">adcli</packagereq>
- <packagereq type="default">certmonger</packagereq>
- <packagereq type="default">ipa-client</packagereq>
- <packagereq type="default">oddjob-mkhomedir</packagereq>
- <packagereq type="default">realmd</packagereq>
- <packagereq type="default">sssd</packagereq>
- <packagereq type="optional">clevis-dracut</packagereq>
- <packagereq type="optional">clevis-udisks2</packagereq>
- <packagereq type="optional">krb5-pkinit</packagereq>
- <packagereq type="optional">krb5-workstation</packagereq>
- <packagereq type="optional">ldapjdk</packagereq>
- <packagereq type="optional">luksmeta</packagereq>
- <packagereq type="optional">nscd</packagereq>
- <packagereq type="optional">nss-pam-ldapd</packagereq>
- <packagereq type="optional">openldap-clients</packagereq>
- <packagereq type="optional">pam_krb5</packagereq>
- <packagereq type="optional">samba-winbind</packagereq>
- <packagereq type="optional">samba-winbind-clients</packagereq>
- <packagereq type="optional">sssd-dbus</packagereq>
- <packagereq type="optional">sssd-kcm</packagereq>
- <packagereq type="optional">sssd-polkit-rules</packagereq>
- <packagereq type="optional">sssd-tools</packagereq>
- <packagereq type="optional">sssd-winbind-idmap</packagereq>
- </packagelist>
- </group>
- <group>
- <id>directory-server</id>
- <name>Directory Server</name>
- <name xml:lang="as">ডাইৰেকটৰি চাৰ্ভাৰ</name>
- <name xml:lang="bn">ডিরেক্টরি সার্ভার</name>
- <name xml:lang="bn_IN">ডিরেক্টরি সার্ভার</name>
- <name xml:lang="cs">Server LDAP</name>
- <name xml:lang="de">Verzeichnis-Server</name>
- <name xml:lang="es">Servidores de directorio</name>
- <name xml:lang="eu">Direktorio-zerbitzaria</name>
- <name xml:lang="fr">Serveur LDAP</name>
- <name xml:lang="gu">ડિરેક્ટરી સર્વર</name>
- <name xml:lang="hi">निर्देशिका सर्वर</name>
- <name xml:lang="ia">Servitor de directorio</name>
- <name xml:lang="it">Directory Server</name>
- <name xml:lang="ja">ディレクトリサーバー</name>
- <name xml:lang="kn">ಡಿರೆಕ್ಟರಿ ಪೂರೈಕೆಗಣಕ</name>
- <name xml:lang="ko">디렉터리 서버</name>
- <name xml:lang="ml">ഡയറക്ടറി സര്‍വര്‍</name>
- <name xml:lang="mr">डिरेक्ट्री सर्व्हर</name>
- <name xml:lang="or">ଡିରେକ୍ଟୋରୀ ସର୍ଭର</name>
- <name xml:lang="pa">ਡਾਇਰੈਕਟਰੀ ਸਰਵਰ</name>
- <name xml:lang="pl">Serwer katalogu</name>
- <name xml:lang="pt_BR">Servidores de Diretório</name>
- <name xml:lang="ru">Сервер каталогов</name>
- <name xml:lang="sv">Katalogservrar</name>
- <name xml:lang="ta">அடைவு சேவையகம்</name>
- <name xml:lang="te">డెరెక్టరీ సర్వరు</name>
- <name xml:lang="uk">Сервер каталогів</name>
- <name xml:lang="zh_CN">目录服务器</name>
- <name xml:lang="zh_TW">目錄伺服器</name>
- <description>Machine and user identity servers.</description>
- <description xml:lang="as">মেশিন আৰু ব্যৱহাৰকাৰীৰ পৰিচয় চাৰ্ভাৰ।</description>
- <description xml:lang="bn">মেশিন ও ব্যবহারকারীদের সনাক্তকারী সার্ভার।</description>
- <description xml:lang="bn_IN">মেশিন ও ব্যবহারকারীদের সনাক্তকারী সার্ভার।</description>
- <description xml:lang="cs">Servery pro identity počítačů a uživatelů.</description>
- <description xml:lang="de">Maschinen- und Benutzer-Identitätsserver.</description>
- <description xml:lang="es">Máquina y servidores de identidad de usuario.</description>
- <description xml:lang="fr">Serveurs d'identité machine et utilisateur.</description>
- <description xml:lang="gu">મશીન અને વપરાશકર્તા ઓળખપત્ર સર્વરો.</description>
- <description xml:lang="hi">मशीन और उपयोक्ता पहचान सर्वर.</description>
- <description xml:lang="ia">Servitores de identification de machinas e usatores.</description>
- <description xml:lang="it">Server identità utente e macchina</description>
- <description xml:lang="ja">マシンおよびユーザーの認証サーバー</description>
- <description xml:lang="kn">ಗಣಕ ಹಾಗು ಬಳಕೆದಾರರನ್ನು ಗುರುತಿಸುವ ಪೂರೈಕೆಗಣಕಗಳು.</description>
- <description xml:lang="ko">기계와 사용자 식별 서버.</description>
- <description xml:lang="ml">മഷീന്‍, യൂസര്‍ ഐഡന്റിറ്റി സര്‍വറുകള്‍.</description>
- <description xml:lang="mr">मशीन व वापरकर्ता ओळख सर्व्हस्.</description>
- <description xml:lang="or">ଯନ୍ତ୍ର ଏବଂ ଚାଳକ ପରିଚୟ ସର୍ଭରଗୁଡ଼ିକ।</description>
- <description xml:lang="pa">ਮਸ਼ੀਨ ਅਤੇ ਯੂਜ਼ਰ ਪਛਾਣ ਸਰਵਰ।</description>
- <description xml:lang="pl">Serwery tożsamości komputerów i użytkowników.</description>
- <description xml:lang="pt_BR">Servidores de identidade de usuário e máquina</description>
- <description xml:lang="ru">Серверы идентификации компьютеров и пользователей.</description>
- <description xml:lang="sv">Maskin- och användaridentitetsservrar.</description>
- <description xml:lang="ta">கணினி மற்றும் பயனர் அடையாளங்காணும் சேவையகங்கள்.</description>
- <description xml:lang="te">మిషన్ మరియు వినియోగదారి గుర్తింపు సేవికలు.</description>
- <description xml:lang="uk">Сервери ідентифікації комп'ютерів та користувачів</description>
- <description xml:lang="zh_CN">机器和用户识别服务器。</description>
- <description xml:lang="zh_TW">機器和使用者身份伺服器。</description>
- <default>false</default>
- <uservisible>false</uservisible>
- <packagelist>
- <packagereq type="optional">krb5-server</packagereq>
- <packagereq type="optional">krb5-server-ldap</packagereq>
- <packagereq type="optional">migrationtools</packagereq>
- <packagereq type="optional">mod_session</packagereq>
- <packagereq type="optional">openldap-servers</packagereq>
- <packagereq type="optional">python-pyasn1-modules</packagereq>
- <packagereq type="optional">samba</packagereq>
- </packagelist>
- </group>
- <group>
- <id>dns-server</id>
- <name>DNS Name Server</name>
- <name xml:lang="af">DNS-naambediener</name>
- <name xml:lang="am">DNS የስም ሰርቨር</name>
- <name xml:lang="ar">اسم خادم خدمة أسم النّطاق (DNS)</name>
- <name xml:lang="as">DNS নাম চাৰ্ভাৰ</name>
- <name xml:lang="bal">نام سرور DNS</name>
- <name xml:lang="be">Паслужнік DNS</name>
- <name xml:lang="bg">DNS сървър на имена</name>
- <name xml:lang="bn">DNS নেইম সার্ভার</name>
- <name xml:lang="bn_IN">DNS নেইম সার্ভার</name>
- <name xml:lang="bs">DNS poslužitelj naziva</name>
- <name xml:lang="ca">Servidor de noms de DNS</name>
- <name xml:lang="cs">DNS server</name>
- <name xml:lang="cy">Gweinydd Enwau DNS</name>
- <name xml:lang="da">DNS-navneserver</name>
- <name xml:lang="de">DNS-Nameserver</name>
- <name xml:lang="el">Διακομιστής ονομάτων DNS</name>
- <name xml:lang="en_GB">DNS Name Server</name>
- <name xml:lang="es">Servidor de nombres DNS</name>
- <name xml:lang="et">DNS nimeserver</name>
- <name xml:lang="eu">DNS izen-zerbitzaria</name>
- <name xml:lang="fa">کارگزار نام DNS</name>
- <name xml:lang="fi">DNS-nimipalvelin</name>
- <name xml:lang="fr">Serveur de nom DNS</name>
- <name xml:lang="gu">DNS નામ સર્વર</name>
- <name xml:lang="he">שרת שמות (DNS).</name>
- <name xml:lang="hi">DNS नाम सर्वर</name>
- <name xml:lang="hr">DNS poslužitelj naziva</name>
- <name xml:lang="hu">DNS névkiszolgáló</name>
- <name xml:lang="hy">DNS Անունների սերվեր</name>
- <name xml:lang="ia">Servitor de nomines DNS</name>
- <name xml:lang="id">DNS Name Server</name>
- <name xml:lang="ilo">Serbidor ti DNS a Nagnagan</name>
- <name xml:lang="is">DNS nafnaþjónn</name>
- <name xml:lang="it">Server dei nomi DNS</name>
- <name xml:lang="ja">DNS ネームサーバー</name>
- <name xml:lang="ka">DNS სახელთა სერვერი</name>
- <name xml:lang="kn">DNS ನಾಮಪೂರೈಕೆಗಣಕ</name>
- <name xml:lang="ko">DNS 네임 서버</name>
- <name xml:lang="lv">DNS vārdu serveris</name>
- <name xml:lang="mai">DNS नाम सर्वर</name>
- <name xml:lang="mk">DNS сервер</name>
- <name xml:lang="ml">DNS നെയിം സര്‍വര്‍</name>
- <name xml:lang="mr">DNS नाम सर्व्हर</name>
- <name xml:lang="ms">Pelayan Nama DNS</name>
- <name xml:lang="nb">DNS-tjener</name>
- <name xml:lang="ne">DNS नाम सर्भर</name>
- <name xml:lang="nl">DNS-nameserver</name>
- <name xml:lang="no">DNS-tjener</name>
- <name xml:lang="nso">Seabi sa Leina la DNS</name>
- <name xml:lang="or">ଡି.ଏନ୍.ଏସ୍. ନାମ ସେବକ</name>
- <name xml:lang="pa">DNS ਨਾਂ ਸਰਵਰ</name>
- <name xml:lang="pl">Serwer nazw DNS</name>
- <name xml:lang="pt">Servidor de Nomes DNS</name>
- <name xml:lang="pt_BR">Servidor de Nomes DNS</name>
- <name xml:lang="ro">Server de nume DNS</name>
- <name xml:lang="ru">Сервер DNS</name>
- <name xml:lang="si">DNS Name සේවා දායකය</name>
- <name xml:lang="sk">DNS menný server</name>
- <name xml:lang="sl">Imenski strežnik DNS</name>
- <name xml:lang="sq">Shërbyes Emrash DNS</name>
- <name xml:lang="sr">DNS сервер имена</name>
- <name xml:lang="sr@latin">DNS server imena</name>
- <name xml:lang="sr@Latn">DNS server imena</name>
- <name xml:lang="sv">DNS-namnserver</name>
- <name xml:lang="ta">DNS பெயர் சேவையகம்</name>
- <name xml:lang="te">DNS పేరుకల సర్వరు</name>
- <name xml:lang="tg">Номи хидматгоҳи DNS</name>
- <name xml:lang="th">ตัวให้บริการ DNS</name>
- <name xml:lang="tr">DNS İsim Sunucusu</name>
- <name xml:lang="uk">Сервер DNS</name>
- <name xml:lang="ur">نام سرور (DNS)</name>
- <name xml:lang="vi">Server tên miền DNS</name>
- <name xml:lang="zh_CN">DNS 名称服务器</name>
- <name xml:lang="zh_TW">DNS 名稱伺服器</name>
- <name xml:lang="zu">Umlekeleli Wegama le-DNS</name>
- <description>This package group allows you to run a DNS name server (BIND) on the system.</description>
- <description xml:lang="af">Hierdie pakket stel jou in staat om 'n DNS-naambediener (BIND) op die rekenaar te laat loop.</description>
- <description xml:lang="am">የዚህ ጥቅል ቡድን የDNS የስም ሰርቨር (BIND)ን በሲስተሙ ላይ ለማስኬድ ያስችልዎታል።</description>
- <description xml:lang="ar">تتيح لك هذه المجموعة من الحزم تشغيل خادم خدمة أسم النّطاق (BIND) على النظام.</description>
- <description xml:lang="as">এই পেকেইজে আপোনাক চিস্টেমত DNS নামকৰণৰ চাৰ্ভাৰ(BIND) চলোৱা সম্ভৱ কৰে।</description>
- <description xml:lang="bal">ای گروه بستگ په شما اجازت دن تا یک نام DNS سروری(BIND) اور سیستم اجرا کنیت.</description>
- <description xml:lang="bg">Тази група пакети позволява стартирането на DNS сървър за имена (BIND).</description>
- <description xml:lang="bn">এই প্যাকেজগুলির সাহায্যে সিস্টেমে একটি DNS নেম সার্ভার (BIND) চালানো যাবে।</description>
- <description xml:lang="bn_IN">এই প্যাকেজগুলির সাহায্যে সিস্টেমে একটি DNS নেম সার্ভার (BIND) চালানো যাবে।</description>
- <description xml:lang="bs">Ova vam grupa paketa dopušta pokretanje DNS poslužitelja naziva (BIND).</description>
- <description xml:lang="ca">Aquest grup de paquets us permet executar un servidor de noms DNS (BIND) en el sistema.</description>
- <description xml:lang="cs">Skupina balíčků pro provoz DNS serveru (BIND).</description>
- <description xml:lang="cy">Mae'r grŵp pecynnau yma'n caniatáu i chi redeg gweinydd enwau DNS (BIND) ar y system.</description>
- <description xml:lang="da">Denne pakkegruppe lader dig køre en DNS-navneserver (BIND) på systemet.</description>
- <description xml:lang="de">Mit dieser Paketgruppe können Sie einen DNS-Nameserver (BIND) auf dem System betreiben.</description>
- <description xml:lang="el">Αυτή η ομάδα πακέτων επιτρέπει τη λειτουργία DNS διακομιστή ονομάτων (BIND) στο σύστημα.</description>
- <description xml:lang="en_GB">This package group allows you to run a DNS name server (BIND) on the system.</description>
- <description xml:lang="es">Este paquete le permite ejecutar un servidor de nombres DNS (BIND) en el sistema.</description>
- <description xml:lang="et">See paketirühm võimaldab DNS nimeserverit (BIND) jooksutada.</description>
- <description xml:lang="fa">این گروه بسته به شما امکان می‌دهد که یک کارگزار نام DNS‏ (BIND) روی سیستم اجرا کنید.</description>
- <description xml:lang="fi">Tämä paketti mahdollistaa DNS-nimipalvelimen (BIND) ajamisen järjestelmässä.</description>
- <description xml:lang="fr">Ce groupe de paquetages vous permet d'exécuter un serveur de noms DNS (BIND) sur le système.</description>
- <description xml:lang="gu">આ પેકેજનું જૂથ તમને સિસ્ટમ પર DNS નામ સેવા (BIND) ચલાવવાની પરવાનગી આપે છે.</description>
- <description xml:lang="he">קבוצת חבילות זו מאפשרת לך להריץ את BIND, שרת שמות (DNS) על גבי המערכת.</description>
- <description xml:lang="hi">इस संकुल समूह से आप सिस्टम पर DNS नाम सर्वर (BIND) को चला सकते हैं.</description>
- <description xml:lang="hr">Ova vam grupa paketa dopušta pokretanje DNS poslužitelja naziva (BIND).</description>
- <description xml:lang="hu">Ez a csoport DNS-kiszolgáló (BIND) kialakításához szükséges programokat tartalmaz.</description>
- <description xml:lang="ia">Iste gruppo de pacchettos te permitte exequer un servitor de nomines DNS (BIND) sur le systema.</description>
- <description xml:lang="id">Di grup paket ini membolehkan anda untuk menjalakan server name DNS (BIND) pada sistem.</description>
- <description xml:lang="is">Þessi pakkahópur gerir þér kleyft að keyra DNS nafnaþjón (BIND) á vélinni þinni.</description>
- <description xml:lang="it">Questo gruppo di pacchetti consente di eseguire un server dei nomi DNS (BIND) sul sistema.</description>
- <description xml:lang="ja">このパッケージグループを使用するとシステムで DNS ネームサーバー (BIND) を稼動できます。</description>
- <description xml:lang="kn">ಈ ಪ್ಯಾಕೇಜ್ ಸಮೂಹ ನಿಮ್ಮ ಗಣಕದಲ್ಲಿ ನಾಮಪೂರೈಕೆಗಣಕವನ್ನು (DNS name server (BIND)) ಚಾಲಿಸಲು ಅನುವು ಮಾಡಿಕೊಡುತ್ತದೆ.</description>
- <description xml:lang="ko">이 패키지 그룹을 사용하여 시스템 상에서 DNS 네임 서버 (BIND)를 운영하실 수 있습니다.</description>
- <description xml:lang="lv">Šīs grupas pakotnes ļaus Jums uzstādīt iestatīt DNS serveri BIND.</description>
- <description xml:lang="mai">ई संकुल समूह सँ अहाँ सिस्टम पर DNS नाम सर्वर (BIND) केँ चलाए सकैत छी.</description>
- <description xml:lang="mk">Овој пакет Ви овозможва да користите DNS сервер (BIND) на системот.</description>
- <description xml:lang="ml">കംപ്യൂട്ടറില്‍ DNS നെയിം സര്‍വര്‍ (BIND) പ്രവര്‍ത്തിപ്പിയ്ക്കുന്നതിനായി നിങ്ങളെ ഈ പാക്കേജ് സഹായിക്കുന്നു.</description>
- <description xml:lang="mr">हा संकुल संच तुम्हास DNS नाम सेवक (BIND) प्रणालीवर चालवू देतो.</description>
- <description xml:lang="ms">Kumpulan pakej ini membolehkan anda untuk melaksanakan pelayan nama DNS (BIND) pada sistem.</description>
- <description xml:lang="nb">Denne pakkegruppen lar deg kjøre en DNS-tjener (BIND) på systemet.</description>
- <description xml:lang="ne">यो प्याकेज समूहले तपाईँलाई प्रणालीमा DNS नाम सर्भर (BIND) चलाउन अनुमति दिन्छ ।</description>
- <description xml:lang="nl">Met deze pakketgroep kunt u een DNS-nameserver (BIND) op het systeem draaien.</description>
- <description xml:lang="no">Denne pakkegruppen lar deg kjøre en DNS-tjener (BIND) på systemet.</description>
- <description xml:lang="nso">Sehlopha se sa sephuthelwana se go dumelela go diriša seabi (BIND) sa leina la DNS tshepedišong.</description>
- <description xml:lang="or">ଏହି ପ୍ଯାକେଜ ସମୂହଟି ଆପଣଙ୍କୁ ତନ୍ତ୍ର ରେ ଡି.ଏନ୍.ଏସ୍. ନାମ ସେବକ (ବାଇଣ୍ଡ) କୁ ଚଳାଇବା ପାଇଁ ଅନୁମତି ପ୍ରଦାନ କରି ଥାଏ</description>
- <description xml:lang="pa">ਇਹ ਪੈਕੇਜ ਤੁਹਾਨੂੰ ਆਪਣੇ ਸਿਸਟਮ ਤੇ DNS ਨਾਂ -ਸਰਵਰ(BIND) ਨੂੰ ਚਲਾਉਣ ਲਈ ਸਹਾਈ ਹੈ।</description>
- <description xml:lang="pl">Ta grupa pakietów umożliwia uruchomienie serwera nazw DNS (BIND).</description>
- <description xml:lang="pt">Este grupo de pacotes permite-lhe correr um servidor de nomes de DNS (o BIND) no sistema.</description>
- <description xml:lang="pt_BR">Este grupo de pacotes permite rodar um servidor de nomes DNS (BIND) no sistema.</description>
- <description xml:lang="ro">Acest grup de pachete vă permite să rulaţi pe sistem un server de nume DNS (BIND).</description>
- <description xml:lang="ru">Пакеты в этой группе позволят вам установить и настроить DNS (BIND).</description>
- <description xml:lang="si">මෙම ඇසුරුම් කණ්ඩායම තුල තිබෙන ඇසුරුම් DNS name සේවා දායකයක් (BIND) පද්ධතිය තුල ක්‍රියා කිරීමට අවශ්‍ය පහසුකම් සලසනු ලබයි.</description>
- <description xml:lang="sk">Táto skupina balíčkov vám umožní spustiť DNS menný server (BIND) na počítači.</description>
- <description xml:lang="sl">Ta skupina paketov vam omogoča poganjanje imenskega strežnika DNS (BIND) v sistemu.</description>
- <description xml:lang="sq">Ky grup paketash ju lejon të xhironi në sistem një shërbyes emrash DNS (BIND).</description>
- <description xml:lang="sr">Ова група пакета омогућава извршавање DNS сервера имена (BIND) на систему.</description>
- <description xml:lang="sr@latin">Ova grupa paketa omogućava izvršavanje DNS servera imena (BIND) na sistemu.</description>
- <description xml:lang="sr@Latn">Ova grupa paketa omogućava izvršavanje DNS servera imena (BIND) na sistemu.</description>
- <description xml:lang="sv">Denna paketgrupp låter dig köra en DNS-namnserver (BIND) på systemet.</description>
- <description xml:lang="ta">இந்த தொகுப்பு குழு கணினியில் DNS பெயர் சேவையகத்தை (BIND) இயக்க அனுமதிக்கிறது.</description>
- <description xml:lang="te">DNS పేరుగల సర్వరును (BIND) మీ కంప్యూటరులో ఉపయోగించటానికి ఈ అనువర్తనాల సమూహం అనుమతిస్తుంది.</description>
- <description xml:lang="tg">Ин гуруҳи барномаҳо иҷозат медиҳад, номи хидматгоҳи DNS (BIND)дар система иҷро кунед.</description>
- <description xml:lang="th">แพ็กเกจกลุ่มนี้ทำให้คุณรันตัวให้บริการชื่อ DNS (BIND) บนระบบได้</description>
- <description xml:lang="tr">Bu paket grubu sisteminizde DNS isim sunucusu (BIND) çalıştırabilmenizi mümkün kılar.</description>
- <description xml:lang="uk">Пакунки цієї групи дозволяють встановити та налаштувати сервер DNS (BIND).</description>
- <description xml:lang="ur">یھ مجموعہ اپ کو اجازت د ے گا نظام پر DNS name server (BIND) چلانے کے لے</description>
- <description xml:lang="vi">Nhóm gói này cho phép bạn chạy Server tên miền DNS (BIND) trên hệ thống.</description>
- <description xml:lang="zh_CN">该软件包组允许您在系统上运行 DNS 名称服务器(BIND)。</description>
- <description xml:lang="zh_TW">這個套件群組讓您可以在系統上執行 DNS 名稱伺服器 (BIND)。</description>
- <description xml:lang="zu">Leli qembu likuvuma ukuba usebenzise igama lomlekeleli we-DNS (BIND) kulesistimu</description>
- <default>false</default>
- <uservisible>false</uservisible>
- <packagelist>
- <packagereq type="default">bind-chroot</packagereq>
- <packagereq type="optional">bind-dyndb-ldap</packagereq>
- <packagereq type="optional">unbound</packagereq>
- </packagelist>
- </group>
- <group>
- <id>emacs</id>
- <name>Emacs</name>
- <name xml:lang="af">Emacs</name>
- <name xml:lang="am">ኢማክስ</name>
- <name xml:lang="ar">إيماكس</name>
- <name xml:lang="as">Emacs</name>
- <name xml:lang="be">Emacs</name>
- <name xml:lang="bn">Emacs</name>
- <name xml:lang="bn_IN">Emacs</name>
- <name xml:lang="bs">Emacs</name>
- <name xml:lang="ca">Emacs</name>
- <name xml:lang="cs">Emacs</name>
- <name xml:lang="cy">Emacs</name>
- <name xml:lang="de">Emacs</name>
- <name xml:lang="en_GB">Emacs</name>
- <name xml:lang="es">Emacs</name>
- <name xml:lang="eu">Emacs</name>
- <name xml:lang="fa">ای‌مَکس</name>
- <name xml:lang="fi">Emacs</name>
- <name xml:lang="fr">Emacs</name>
- <name xml:lang="gl">Emacs</name>
- <name xml:lang="gu">Emacs</name>
- <name xml:lang="hi">Emacs</name>
- <name xml:lang="hr">Emacs</name>
- <name xml:lang="hu">Emacs</name>
- <name xml:lang="hy">Emacs</name>
- <name xml:lang="ia">Emacs</name>
- <name xml:lang="id">Emacs</name>
- <name xml:lang="ilo">Emacs</name>
- <name xml:lang="it">Emacs</name>
- <name xml:lang="ja">Emacs</name>
- <name xml:lang="ka">Emacs</name>
- <name xml:lang="kn">Emacs</name>
- <name xml:lang="ko">이맥스</name>
- <name xml:lang="lv">Emacs</name>
- <name xml:lang="mk">Emacs</name>
- <name xml:lang="ml">ഈമാക്സ്</name>
- <name xml:lang="mr">ईमॅक्स्</name>
- <name xml:lang="no">Emacs</name>
- <name xml:lang="nso">Emacs</name>
- <name xml:lang="or">ଇ-ମାକ୍ସ</name>
- <name xml:lang="pa">ਈਮੈਕਸ</name>
- <name xml:lang="pl">Emacs</name>
- <name xml:lang="pt_BR">Emacs</name>
- <name xml:lang="ru">Emacs</name>
- <name xml:lang="si">Emacs</name>
- <name xml:lang="sl">Emacs</name>
- <name xml:lang="sq">Emacs</name>
- <name xml:lang="sv">Emacs</name>
- <name xml:lang="ta">Emacs</name>
- <name xml:lang="te">ఈమాక్స్</name>
- <name xml:lang="th">Emacs</name>
- <name xml:lang="tr">Emacs</name>
- <name xml:lang="uk">Emacs</name>
- <name xml:lang="ur">إيماكس</name>
- <name xml:lang="vi">Emacs</name>
- <name xml:lang="zh_CN">Emacs</name>
- <name xml:lang="zh_TW">Emacs</name>
- <name xml:lang="zu">I-emacs</name>
- <description>The GNU Emacs extensible, customizable, text editor.</description>
- <description xml:lang="as">GNU Emacs প্ৰসাৰণযোগ্য, স্বনিৰ্ধাৰণযোগ্য গুণ, টেক্সট এডিটৰ।</description>
- <description xml:lang="bn">GNU Emacs প্রসারণযোগ্য, বৈশিষ্ট্য স্বনির্ধারণযোগ্য, টেক্সট এডিটর।</description>
- <description xml:lang="bn_IN">GNU Emacs প্রসারণযোগ্য, বৈশিষ্ট্য স্বনির্ধারণযোগ্য, টেক্সট এডিটর।</description>
- <description xml:lang="cs">Rozšiřitelný a nastavitelný textový editor GNU Emacs.</description>
- <description xml:lang="de">Der GNU-Emacs erweiterbare, anpassbare Texteditor.</description>
- <description xml:lang="es">El editor de texto de Emacs de GNU extensible y personalizable.</description>
- <description xml:lang="fr">L'éditeur de texte GNU Emacs est extensible et personnalisable.</description>
- <description xml:lang="gu">GNU Emacs વિસ્તૃત કરી શકાય તેવુ, વૈવિધ્યપૂર્ણ થઇ શકે તેવુ, લખાણ સંપાદક.</description>
- <description xml:lang="hi">GNU Emacs विस्तार योग्य, पसंदीदाकरण योग्य पाठ संपादक.</description>
- <description xml:lang="ia">Le editor de textos extensibile e personalisabile GNU Emacs.</description>
- <description xml:lang="it">L'editor di testo di GNU Emacs personalizzabile ed estendibile.</description>
- <description xml:lang="ja">拡張およびカスタマイズ可能な GNU Emacs テキストエディタ</description>
- <description xml:lang="kn">GNU Emacs ವಿಸ್ತಾರವಾದ, ಇಚ್ಛೆಗೆ ತಕ್ಕಂತೆ ಬದಲಾಯಿಸಬಹುದಾದ, ಪಠ್ಯ ಸಂಪಾದಕ.</description>
- <description xml:lang="ko">GNU 이맥스 - 확장가능하고 사용자 변경 가능한 텍스트 에디터</description>
- <description xml:lang="ml">ഗ്നു ഈമാക്സ് ടെക്സ്റ്റ് എഡിറ്റര്‍.</description>
- <description xml:lang="mr">GNU Emacs एक्सटेंसिबल, पसंतीचे, मजकूर संपादक.</description>
- <description xml:lang="or">GNU Emacs ଅନୁଲମ୍ବିତ, ଇଚ୍ଛାରୂପଣ, ପାଠ୍ୟ ସମ୍ପାଦକ।</description>
- <description xml:lang="pa">GNU ਈਮੈਕਸ ਐਕਸਟੈਂਸੀਬਲ, ਪਸੰਦੀਯੋਗ, ਪਾਠ ਸੰਪਾਦਕ।</description>
- <description xml:lang="pl">Rozszerzalny, łatwo modyfikowalny edytor tekstu GNU Emacs.</description>
- <description xml:lang="pt_BR">O editor de texto do GNU Emacs, extensível, personalizável.</description>
- <description xml:lang="ru">Многофункциональный расширяемый текстовый редактор Emacs, распространяемый на условиях GNU GPL.</description>
- <description xml:lang="sv">Den utbyggbara, anpassningsbara, textredigeraren GNU Emacs.</description>
- <description xml:lang="ta">GNU Emacs விரிவாக்கக்கூடிய, தனிபயாக்கக்கூடிய, உரையை எடிட் செய்ய கூடியதாகும்.</description>
- <description xml:lang="te">విస్తృతపరచగల, మలచుకొనగల, పాఠపు సరికూర్పరి GNU Emacs.</description>
- <description xml:lang="uk">Гнучкий у можливостях розширення та налаштування текстовий редактор GNU Emacs.</description>
- <description xml:lang="zh_CN">GNU Emacs 可扩展、可自定义的文本编辑器。</description>
- <description xml:lang="zh_TW">可延伸、自訂化的 GNU Emacs 文字編輯器。</description>
- <default>false</default>
- <uservisible>false</uservisible>
- <packagelist>
- <packagereq type="mandatory">emacs</packagereq>
- <packagereq type="optional">ctags-etags</packagereq>
- <packagereq type="optional">emacs-auctex</packagereq>
- <packagereq type="optional">emacs-gnuplot</packagereq>
- <packagereq type="optional">emacs-nox</packagereq>
- </packagelist>
- </group>
- <group>
- <id>file-server</id>
- <name>File and Storage Server</name>
- <name xml:lang="as">ফাইল আৰু সংৰক্ষণ চাৰ্ভাৰ</name>
- <name xml:lang="bn_IN">ফাইল এবং স্টোরেজ সার্ভার</name>
- <name xml:lang="cs">Úložný a souborový server</name>
- <name xml:lang="de">Datei- und Storage-Server</name>
- <name xml:lang="es">Servidor y archivo de almacenamiento</name>
- <name xml:lang="fr">Serveur de fichiers et de stockage</name>
- <name xml:lang="gu">ફાઇલ અને સ્ટોરેજ સર્વર</name>
- <name xml:lang="hi">फ़ाइल और भंडार सर्वर</name>
- <name xml:lang="it">Server di storage e file</name>
- <name xml:lang="ja">ファイルとストレージサーバー</name>
- <name xml:lang="kn">ಕಡತ ಮತ್ತು ಶೇಖರಣಾ ಪೂರೈಕೆಗಣಕಗಳು</name>
- <name xml:lang="ko">파일 및 스토리지 서버</name>
- <name xml:lang="ml">ഫയല്‍, സംഭരണ സര്‍വര്‍</name>
- <name xml:lang="mr">फाइल आणि स्टोरेज सर्व्हर</name>
- <name xml:lang="or">ଫାଇଲ ଏବଂ ସଂରକ୍ଷଣ ସର୍ଭର</name>
- <name xml:lang="pa">ਫਾਈਲ ਅਤੇ ਭੰਡਾਰਣ ਸਰਵਰ</name>
- <name xml:lang="pl">Serwer plików i przechowywania danych</name>
- <name xml:lang="pt_BR">Arquivo e Servidor de Armazenamento</name>
- <name xml:lang="ru">Сервер файлов и печати</name>
- <name xml:lang="ta">கோப்பு மற்றும் சேமிப்பக சேவையகம்</name>
- <name xml:lang="te">ఫైలు మరియు నిల్వ సేవిక</name>
- <name xml:lang="uk">Сервер для зберігання файлів і даних</name>
- <name xml:lang="zh_CN">文件及存储服务器</name>
- <name xml:lang="zh_TW">檔案與儲存伺服器</name>
- <description>CIFS, SMB, NFS, iSCSI, iSER, and iSNS network storage server.</description>
- <description xml:lang="as">CIFS, SMB, NFS, iSCSI, iSER, আৰু iSNS নেটৱাৰ্ক সংৰক্ষণ চাৰ্ভাৰ।</description>
- <description xml:lang="bn_IN">CIFS, SMB, NFS, iSCSI, iSER, এবং iSNS নেটওয়ার্ক স্টোরেজ সার্ভার।</description>
- <description xml:lang="cs">Server pro síťová úložiště CIFS, SMB, NFS, iSCSI, iSER a iSNS.</description>
- <description xml:lang="de">CIFS, SMB, NFS, iSCSI, iSER und iSNS Netzwerk-Storage-Server.</description>
- <description xml:lang="es">CIFS, SMB, NFS, iSCSI, iSER, y servidor de almacenamiento de red iSNS.</description>
- <description xml:lang="fr">Serveur de stockage réseau CIFS, SMB, NFS, iSCSI, iSER et iSNS.</description>
- <description xml:lang="gu">CIFS, SMB, NFS, iSCSI, iSER, અને iSNS નેટવર્ક સ્ટોરેજ સર્વર.</description>
- <description xml:lang="hi">CIFS, SMB, NFS, iSCSI, iSER, और iSNS संजाल भंडारण सर्वर.</description>
- <description xml:lang="it">Server per lo storage di rete CIFS, SMB, NFS, iSCSI, iSER e iSNS.</description>
- <description xml:lang="ja">CIFS、SMB、NFS、iSCSI、iSER、iSNS のネットワークストレージサーバーです。</description>
- <description xml:lang="kn">CIFS, SMB, NFS, iSCSI, iSER, ಹಾಗು iSNS ಜಾಲಬಂಧ ಶೇಖರಣಾ ಪೂರೈಕೆಗಣಕ.</description>
- <description xml:lang="ko">CIFS, SMB, NFS, iSCSI, iSER, iSNS 네트워크 스토리지 서버.</description>
- <description xml:lang="ml">സിഐഎഫ്എസ്, എസ്എംബി, എന്‍എഫ്എസ്, iSCSI, iSER, iSNS നെറ്റ്‌വര്‍ക്ക് സംഭരണ സര്‍വര്‍.</description>
- <description xml:lang="mr">CIFS, SMB, NFS, iSCSI, iSER, आणि iSNS नेटवर्क स्टोरेज सर्व्हर.</description>
- <description xml:lang="or">CIFS, SMB, NFS, iSCSI, iSER, ଏବଂ iSNS ନେଟୱର୍କ ସଂରକ୍ଷଣ ସର୍ଭର।</description>
- <description xml:lang="pa">CIFS, SMB, NFS, iSCSI, iSER, ਅਤੇ iSNS ਨੈੱਟਵਰਕ ਭੰਡਾਰਣ ਸਰਵਰ।</description>
- <description xml:lang="pl">Serwer sieciowego przechowywania danych w CIFS, SMB, NFS, iSCSI, iSER i iSNS.</description>
- <description xml:lang="pt_BR">CIFS, SMB, NFS, iSCSI, iSER, e servidor de armazenamento de rede iSNS</description>
- <description xml:lang="ru">Сетевой сервер CIFS, SMB, NFS, iSCSI, iSER, iSNS.</description>
- <description xml:lang="ta">CIFS, SMB, NFS, iSCSI, iSER மற்றும் iSNS பிணையிஅ சேமிப்பக சேவையகம்.</description>
- <description xml:lang="te">CIFS, SMB, NFS, iSCSI, iSER, మరియు iSNS నెట్వర్కు నిల్వ సేవిక.</description>
- <description xml:lang="uk">Сервер зберігання даних CIFS, SMB, NFS, iSCSI, iSER та iSNS.</description>
- <description xml:lang="zh_CN">CIFS, SMB, NFS, iSCSI, iSER 及 iSNS 网络存储服务器。</description>
- <description xml:lang="zh_TW">CIFS、SMB、NFS、iSCSI、iSER 和 iSNS 網路儲存伺服器。</description>
- <default>false</default>
- <uservisible>false</uservisible>
- <packagelist>
- <packagereq type="mandatory">cifs-utils</packagereq>
- <packagereq type="mandatory">gssproxy</packagereq>
- <packagereq type="mandatory">nfs-utils</packagereq>
- <packagereq type="mandatory">nfs4-acl-tools</packagereq>
- <packagereq type="mandatory">samba</packagereq>
- <packagereq type="mandatory">targetcli</packagereq>
- <packagereq type="mandatory">targetd</packagereq>
- <packagereq type="optional">isns-utils</packagereq>
- <packagereq type="optional">nfsometer</packagereq>
- <packagereq type="optional">nfstest</packagereq>
- </packagelist>
- </group>
- <group>
- <id>fonts</id>
- <name>Fonts</name>
- <name xml:lang="ar">خطوط</name>
- <name xml:lang="as">ফন্টসমূহ</name>
- <name xml:lang="bal">فونت آن</name>
- <name xml:lang="bg">Шрифтове</name>
- <name xml:lang="bn">ফন্ট</name>
- <name xml:lang="bn_IN">ফন্ট</name>
- <name xml:lang="ca">Tipus de lletra</name>
- <name xml:lang="cs">Sada fontů</name>
- <name xml:lang="da">Skrifttyper</name>
- <name xml:lang="de">Schriftarten</name>
- <name xml:lang="el">Γραμματοσειρές</name>
- <name xml:lang="es">Fuentes</name>
- <name xml:lang="et">Kirjatüübid (fondid)</name>
- <name xml:lang="eu">Letra-tipoak</name>
- <name xml:lang="fi">Kirjasimet</name>
- <name xml:lang="fr">Police</name>
- <name xml:lang="gu">ફોન્ટ</name>
- <name xml:lang="he">גופנים</name>
- <name xml:lang="hi">फ़ॉन्ट</name>
- <name xml:lang="hu">Betűkészletek</name>
- <name xml:lang="ia">Characteres</name>
- <name xml:lang="id">Huruf</name>
- <name xml:lang="is">Letur</name>
- <name xml:lang="it">Caratteri</name>
- <name xml:lang="ja">フォント</name>
- <name xml:lang="kn">ಅಕ್ಷರಶೈಲಿಗಳು</name>
- <name xml:lang="ko">폰트</name>
- <name xml:lang="lv">Fonti</name>
- <name xml:lang="mai">फान्ट्स</name>
- <name xml:lang="ml">ലിപികള്‍</name>
- <name xml:lang="mr">फॉन्ट</name>
- <name xml:lang="ms">Font</name>
- <name xml:lang="nb">Skrifter</name>
- <name xml:lang="ne">फन्ट</name>
- <name xml:lang="nl">Lettertypes</name>
- <name xml:lang="or">ଅକ୍ଷରରୂପଗୁଡ଼ିକ</name>
- <name xml:lang="pa">ਫੌਂਟ</name>
- <name xml:lang="pl">Czcionki</name>
- <name xml:lang="pt">Tipos de Letra</name>
- <name xml:lang="pt_BR">Fontes</name>
- <name xml:lang="ru">Шрифты</name>
- <name xml:lang="sk">Písma</name>
- <name xml:lang="sr">Фонтови</name>
- <name xml:lang="sr@latin">Fontovi</name>
- <name xml:lang="sr@Latn">Fontovi</name>
- <name xml:lang="sv">Typsnitt</name>
- <name xml:lang="ta">எழுத்துருக்கள்</name>
- <name xml:lang="te">ఫాంట్లు</name>
- <name xml:lang="tg">Ҳарфҳо</name>
- <name xml:lang="th">แบบอักษร</name>
- <name xml:lang="uk">Шрифти</name>
- <name xml:lang="zh_CN">字体</name>
- <name xml:lang="zh_TW">字型</name>
- <description>Fonts for rendering text in a variety of languages and scripts.</description>
- <description xml:lang="as">বিভিন্ন ভাষা আৰু লিপিত লিখা টেক্সট ৰেন্ডাৰ কৰিবলৈ ব্যৱহৃত ফন্ট সঁজুলিসমূহ।</description>
- <description xml:lang="bn">বিভিন্ন ভাষা ও লীপিতে লেখা টেক্সট রেন্ডার করতে ব্যবহৃত ফন্ট প্যাকেজ।</description>
- <description xml:lang="bn_IN">বিভিন্ন ভাষা ও লীপিতে লেখা টেক্সট রেন্ডার করতে ব্যবহৃত ফন্ট প্যাকেজ।</description>
- <description xml:lang="cs">Fonty pro zobrazování textu v různých jazycích a zápisech.</description>
- <description xml:lang="de">Font-Pakete für das Rendering von Text in einer Vielfalt von Sprachen und Skripten.</description>
- <description xml:lang="es">Paquetes de tipos de letra para crear una variedad de idiomas y scripts.</description>
- <description xml:lang="fr">Polices pour la restitution de textes dans un éventail de langues et scripts.</description>
- <description xml:lang="gu">ભાષાઓ અને સ્ક્રિપ્ટોની વિવિધતામાં રેન્ડરિંગ લખાણ માટે ફોન્ટો.</description>
- <description xml:lang="hi">विभिन्न भाषा और स्क्रिप्ट में पाठ रेंडरिंग के लिए फ़ॉन्ट.</description>
- <description xml:lang="ia">Characteres pro render texto in varie linguas e scriptos.</description>
- <description xml:lang="it">Caratteri per la rappresentazione del testo in una varietà di lingue e script.</description>
- <description xml:lang="ja">異なる言語やスクリプトにテキストをレンダリングするためのフォント</description>
- <description xml:lang="kn">ಹಲವಾರು ಭಾಷೆಗಳು ಹಾಗು ಲಿಪಿಗಳಲ್ಲಿ ಪಠ್ಯವನ್ನು ರೆಂಡರ್ ಮಾಡುವ ಅಕ್ಷರಶೈಲಿಗಳು.</description>
- <description xml:lang="ko">여러 언어와 문자에서 텍스트를 표시하기 위한 폰트</description>
- <description xml:lang="ml">അനവധി ഭാഷകളിലും സ്ക്രിപ്റ്റുകളിലും വാക്യം റെണ്ടര്‍ ചെയ്യുവാനുള്ള അക്ഷരസഞ്ചയങ്ങള്‍.</description>
- <description xml:lang="mr">विविध भाषा व स्क्रिप्टस् मध्ये मजकूर दाखवण्याकरीता फाँट्स्.</description>
- <description xml:lang="or">ବିଭିନ୍ନ ଭାଷା ଏବଂ ସ୍କ୍ରିପ୍ଟଗୁଡ଼ିକରେ ପାଠ୍ୟ ଚିତ୍ରଣ ପାଇଁ ଅକ୍ଷରରୂପ।</description>
- <description xml:lang="pa">ਵੱਖ-ਵੱਖ ਭਾਸ਼ਾਵਾਂ ਅਤੇ ਸਕਰਿਪਟਾਂ ਵਿੱਚ ਟੈਕਸਟ ਰੈਂਡਰਿੰਗ ਲਈ ਫੌਂਟ।</description>
- <description xml:lang="pl">Czcionki do wyświetlania tekstu w różnych językach i pismach.</description>
- <description xml:lang="pt_BR">Fontes para renderizar texto em diversas linguas e scripts</description>
- <description xml:lang="ru">Шрифты для отображения текста на различных языках.</description>
- <description xml:lang="sv">Typsnitt för att rendera text i ett antal olika språk och alfabeten.</description>
- <description xml:lang="ta">பல்வேறு மொழிகள் மற்றும் எழுத்துக்களில் உள்ள உரைகளை திரும்ப தருகின்றன.</description>
- <description xml:lang="te">పాఠమును వివిధ భాషలనందు మరియు లిపులనందు చూపుటకు ఫాంట్లు.</description>
- <description xml:lang="uk">Шрифти для показу тексту різними мовами та писемностями.</description>
- <description xml:lang="zh_CN">在各种语言和脚本中输入文本的字体。</description>
- <description xml:lang="zh_TW">用來處理各種語言與 script 中的文字的字型。</description>
- <default>false</default>
- <uservisible>false</uservisible>
- <packagelist>
- <packagereq type="default">cjkuni-uming-fonts</packagereq>
- <packagereq type="default">dejavu-sans-fonts</packagereq>
- <packagereq type="default">dejavu-sans-mono-fonts</packagereq>
- <packagereq type="default">dejavu-serif-fonts</packagereq>
- <packagereq type="default">gnu-free-mono-fonts</packagereq>
- <packagereq type="default">gnu-free-sans-fonts</packagereq>
- <packagereq type="default">gnu-free-serif-fonts</packagereq>
- <packagereq type="default">google-crosextra-caladea-fonts</packagereq>
- <packagereq type="default">google-crosextra-carlito-fonts</packagereq>
- <packagereq type="default">jomolhari-fonts</packagereq>
- <packagereq type="default">khmeros-base-fonts</packagereq>
- <packagereq type="default">liberation-mono-fonts</packagereq>
- <packagereq type="default">liberation-sans-fonts</packagereq>
- <packagereq type="default">liberation-serif-fonts</packagereq>
- <packagereq type="default">lklug-fonts</packagereq>
- <packagereq type="default">lohit-assamese-fonts</packagereq>
- <packagereq type="default">lohit-bengali-fonts</packagereq>
- <packagereq type="default">lohit-devanagari-fonts</packagereq>
- <packagereq type="default">lohit-gujarati-fonts</packagereq>
- <packagereq type="default">lohit-kannada-fonts</packagereq>
- <packagereq type="default">lohit-malayalam-fonts</packagereq>
- <packagereq type="default">lohit-marathi-fonts</packagereq>
- <packagereq type="default">lohit-nepali-fonts</packagereq>
- <packagereq type="default">lohit-oriya-fonts</packagereq>
- <packagereq type="default">lohit-punjabi-fonts</packagereq>
- <packagereq type="default">lohit-tamil-fonts</packagereq>
- <packagereq type="default">lohit-telugu-fonts</packagereq>
- <packagereq type="default">madan-fonts</packagereq>
- <packagereq type="default">nhn-nanum-gothic-fonts</packagereq>
- <packagereq type="default">open-sans-fonts</packagereq>
- <packagereq type="default">overpass-fonts</packagereq>
- <packagereq type="default">paktype-naskh-basic-fonts</packagereq>
- <packagereq type="default">paratype-pt-sans-fonts</packagereq>
- <packagereq type="default">sil-abyssinica-fonts</packagereq>
- <packagereq type="default">sil-nuosu-fonts</packagereq>
- <packagereq type="default">sil-padauk-fonts</packagereq>
- <packagereq type="default">smc-meera-fonts</packagereq>
- <packagereq type="default">stix-fonts</packagereq>
- <packagereq type="default">thai-scalable-waree-fonts</packagereq>
- <packagereq type="default">ucs-miscfixed-fonts</packagereq>
- <packagereq type="default">vlgothic-fonts</packagereq>
- <packagereq type="default">wqy-microhei-fonts</packagereq>
- <packagereq type="default">wqy-zenhei-fonts</packagereq>
- <packagereq type="optional">bitmap-fixed-fonts</packagereq>
- <packagereq type="optional">bitmap-lucida-typewriter-fonts</packagereq>
- <packagereq type="optional">bpg-chveulebrivi-fonts</packagereq>
- <packagereq type="optional">bpg-courier-fonts</packagereq>
- <packagereq type="optional">bpg-glaho-fonts</packagereq>
- <packagereq type="optional">cjkuni-ukai-fonts</packagereq>
- <packagereq type="optional">culmus-aharoni-clm-fonts</packagereq>
- <packagereq type="optional">culmus-caladings-clm-fonts</packagereq>
- <packagereq type="optional">culmus-david-clm-fonts</packagereq>
- <packagereq type="optional">culmus-drugulin-clm-fonts</packagereq>
- <packagereq type="optional">culmus-ellinia-clm-fonts</packagereq>
- <packagereq type="optional">culmus-frank-ruehl-clm-fonts</packagereq>
- <packagereq type="optional">culmus-hadasim-clm-fonts</packagereq>
- <packagereq type="optional">culmus-keteryg-fonts</packagereq>
- <packagereq type="optional">culmus-miriam-clm-fonts</packagereq>
- <packagereq type="optional">culmus-miriam-mono-clm-fonts</packagereq>
- <packagereq type="optional">culmus-nachlieli-clm-fonts</packagereq>
- <packagereq type="optional">culmus-simple-clm-fonts</packagereq>
- <packagereq type="optional">culmus-stamashkenaz-clm-fonts</packagereq>
- <packagereq type="optional">culmus-stamsefarad-clm-fonts</packagereq>
- <packagereq type="optional">culmus-yehuda-clm-fonts</packagereq>
- <packagereq type="optional">ghostscript-chinese</packagereq>
- <packagereq type="optional">google-noto-sans-armenian-fonts</packagereq>
- <packagereq type="optional">google-noto-sans-devanagari-fonts</packagereq>
- <packagereq type="optional">google-noto-sans-devanagari-ui-fonts</packagereq>
- <packagereq type="optional">google-noto-sans-ethiopic-fonts</packagereq>
- <packagereq type="optional">google-noto-sans-fonts</packagereq>
- <packagereq type="optional">google-noto-sans-georgian-fonts</packagereq>
- <packagereq type="optional">google-noto-sans-hebrew-fonts</packagereq>
- <packagereq type="optional">google-noto-sans-khmer-fonts</packagereq>
- <packagereq type="optional">google-noto-sans-khmer-ui-fonts</packagereq>
- <packagereq type="optional">google-noto-sans-lao-fonts</packagereq>
- <packagereq type="optional">google-noto-sans-lao-ui-fonts</packagereq>
- <packagereq type="optional">google-noto-sans-tamil-fonts</packagereq>
- <packagereq type="optional">google-noto-sans-tamil-ui-fonts</packagereq>
- <packagereq type="optional">google-noto-sans-thai-fonts</packagereq>
- <packagereq type="optional">google-noto-sans-thai-ui-fonts</packagereq>
- <packagereq type="optional">google-noto-sans-ui-fonts</packagereq>
- <packagereq type="optional">google-noto-serif-armenian-fonts</packagereq>
- <packagereq type="optional">google-noto-serif-fonts</packagereq>
- <packagereq type="optional">google-noto-serif-georgian-fonts</packagereq>
- <packagereq type="optional">google-noto-serif-lao-fonts</packagereq>
- <packagereq type="optional">google-noto-serif-thai-fonts</packagereq>
- <packagereq type="optional">gubbi-fonts</packagereq>
- <packagereq type="optional">ipa-gothic-fonts</packagereq>
- <packagereq type="optional">ipa-mincho-fonts</packagereq>
- <packagereq type="optional">ipa-pgothic-fonts</packagereq>
- <packagereq type="optional">ipa-pmincho-fonts</packagereq>
- <packagereq type="optional">kacst-art-fonts</packagereq>
- <packagereq type="optional">kacst-book-fonts</packagereq>
- <packagereq type="optional">kacst-decorative-fonts</packagereq>
- <packagereq type="optional">kacst-digital-fonts</packagereq>
- <packagereq type="optional">kacst-farsi-fonts</packagereq>
- <packagereq type="optional">kacst-letter-fonts</packagereq>
- <packagereq type="optional">kacst-naskh-fonts</packagereq>
- <packagereq type="optional">kacst-office-fonts</packagereq>
- <packagereq type="optional">kacst-one-fonts</packagereq>
- <packagereq type="optional">kacst-pen-fonts</packagereq>
- <packagereq type="optional">kacst-poster-fonts</packagereq>
- <packagereq type="optional">kacst-qurn-fonts</packagereq>
- <packagereq type="optional">kacst-screen-fonts</packagereq>
- <packagereq type="optional">kacst-title-fonts</packagereq>
- <packagereq type="optional">kacst-titlel-fonts</packagereq>
- <packagereq type="optional">khmeros-battambang-fonts</packagereq>
- <packagereq type="optional">khmeros-bokor-fonts</packagereq>
- <packagereq type="optional">khmeros-handwritten-fonts</packagereq>
- <packagereq type="optional">khmeros-metal-chrieng-fonts</packagereq>
- <packagereq type="optional">khmeros-muol-fonts</packagereq>
- <packagereq type="optional">khmeros-siemreap-fonts</packagereq>
- <packagereq type="optional">kurdit-unikurd-web-fonts</packagereq>
- <packagereq type="optional">liberation-narrow-fonts</packagereq>
- <packagereq type="optional">nafees-web-naskh-fonts</packagereq>
- <packagereq type="optional">navilu-fonts</packagereq>
- <packagereq type="optional">nhn-nanum-brush-fonts</packagereq>
- <packagereq type="optional">nhn-nanum-myeongjo-fonts</packagereq>
- <packagereq type="optional">nhn-nanum-pen-fonts</packagereq>
- <packagereq type="optional">paktype-naqsh-fonts</packagereq>
- <packagereq type="optional">paktype-tehreer-fonts</packagereq>
- <packagereq type="optional">pothana2000-fonts</packagereq>
- <packagereq type="optional">saab-fonts</packagereq>
- <packagereq type="optional">samyak-devanagari-fonts</packagereq>
- <packagereq type="optional">samyak-gujarati-fonts</packagereq>
- <packagereq type="optional">samyak-malayalam-fonts</packagereq>
- <packagereq type="optional">samyak-oriya-fonts</packagereq>
- <packagereq type="optional">samyak-tamil-fonts</packagereq>
- <packagereq type="optional">smc-anjalioldlipi-fonts</packagereq>
- <packagereq type="optional">smc-dyuthi-fonts</packagereq>
- <packagereq type="optional">smc-kalyani-fonts</packagereq>
- <packagereq type="optional">smc-rachana-fonts</packagereq>
- <packagereq type="optional">smc-raghumalayalam-fonts</packagereq>
- <packagereq type="optional">smc-suruma-fonts</packagereq>
- <packagereq type="optional">thai-scalable-garuda-fonts</packagereq>
- <packagereq type="optional">thai-scalable-kinnari-fonts</packagereq>
- <packagereq type="optional">thai-scalable-loma-fonts</packagereq>
- <packagereq type="optional">thai-scalable-norasi-fonts</packagereq>
- <packagereq type="optional">thai-scalable-purisa-fonts</packagereq>
- <packagereq type="optional">thai-scalable-sawasdee-fonts</packagereq>
- <packagereq type="optional">thai-scalable-tlwgmono-fonts</packagereq>
- <packagereq type="optional">thai-scalable-tlwgtypewriter-fonts</packagereq>
- <packagereq type="optional">thai-scalable-tlwgtypist-fonts</packagereq>
- <packagereq type="optional">thai-scalable-tlwgtypo-fonts</packagereq>
- <packagereq type="optional">thai-scalable-umpush-fonts</packagereq>
- <packagereq type="optional">tibetan-machine-uni-fonts</packagereq>
- <packagereq type="optional">vemana2000-fonts</packagereq>
- <packagereq type="optional">vlgothic-p-fonts</packagereq>
- </packagelist>
- </group>
- <group>
- <id>ftp-server</id>
- <name>FTP Server</name>
- <name xml:lang="af">FTP-bediener</name>
- <name xml:lang="am">FTP ሰርቨር</name>
- <name xml:lang="ar">خادم FTP</name>
- <name xml:lang="as">FTP চাৰ্ভাৰ</name>
- <name xml:lang="bal">سرور FTP</name>
- <name xml:lang="be">Паслужнік FTP</name>
- <name xml:lang="bg">FTP сървър</name>
- <name xml:lang="bn">FTP সার্ভার</name>
- <name xml:lang="bn_IN">FTP সার্ভার</name>
- <name xml:lang="bs">FTP poslužitelj</name>
- <name xml:lang="ca">Servidor FTP</name>
- <name xml:lang="cs">FTP server</name>
- <name xml:lang="cy">Gweinydd FTP</name>
- <name xml:lang="da">FTP-server</name>
- <name xml:lang="de">FTP-Server</name>
- <name xml:lang="el">Εξυπηρετητής FTP</name>
- <name xml:lang="en_GB">FTP Server</name>
- <name xml:lang="es">Servidor FTP</name>
- <name xml:lang="et">FTP server</name>
- <name xml:lang="eu">FTP zerbitzaria</name>
- <name xml:lang="fa">کارگزار FTP</name>
- <name xml:lang="fi">FTP-palvelin</name>
- <name xml:lang="fr">Serveur FTP</name>
- <name xml:lang="gl">Servidor FTP</name>
- <name xml:lang="gu">FTP સર્વર</name>
- <name xml:lang="he">שרת FTP</name>
- <name xml:lang="hi">FTP सर्वर</name>
- <name xml:lang="hr">FTP poslužitelj</name>
- <name xml:lang="hu">FTP-kiszolgáló</name>
- <name xml:lang="hy">FTP սերվեր</name>
- <name xml:lang="ia">Servitor FTP</name>
- <name xml:lang="id">Server FTP</name>
- <name xml:lang="ilo">Serbidor a FTP</name>
- <name xml:lang="is">FTP þjónn</name>
- <name xml:lang="it">Server FTP</name>
- <name xml:lang="ja">FTP サーバー</name>
- <name xml:lang="ka">FTP სერვერი</name>
- <name xml:lang="kn">FTP ಪೂರೈಕೆಗಣಕ</name>
- <name xml:lang="ko">FTP 서버</name>
- <name xml:lang="lv">FTP serveris</name>
- <name xml:lang="mai">FTP सर्वर</name>
- <name xml:lang="mk">FTP сервер</name>
- <name xml:lang="ml">FTP സര്‍വര്‍</name>
- <name xml:lang="mr">FTP सर्व्हर</name>
- <name xml:lang="ms">Pelayan FTP</name>
- <name xml:lang="nb">FTP-tjener</name>
- <name xml:lang="ne">FTP सर्भर</name>
- <name xml:lang="nl">FTP-server</name>
- <name xml:lang="no">FTP-tjener</name>
- <name xml:lang="nso">Seabi sa FTP</name>
- <name xml:lang="or">ଏଫ.ଟି.ପି. ସେବକ</name>
- <name xml:lang="pa">FTP ਸਰਵਰ</name>
- <name xml:lang="pl">Serwer FTP</name>
- <name xml:lang="pt">Servidor de FTP</name>
- <name xml:lang="pt_BR">Servidor FTP</name>
- <name xml:lang="ro">Server FTP</name>
- <name xml:lang="ru">Сервер FTP</name>
- <name xml:lang="si">FTP සේවා දායකය</name>
- <name xml:lang="sk">FTP server</name>
- <name xml:lang="sl">Strežnik FTP</name>
- <name xml:lang="sq">Shërbyes FTP</name>
- <name xml:lang="sr">FTP сервер</name>
- <name xml:lang="sr@latin">FTP server</name>
- <name xml:lang="sr@Latn">FTP server</name>
- <name xml:lang="sv">FTP-server</name>
- <name xml:lang="ta">FTP சேவையகம்</name>
- <name xml:lang="te">FTP సర్వరు</name>
- <name xml:lang="tg">Ҳидматгоҳи FTP</name>
- <name xml:lang="th">ตัวให้บริการ FTP</name>
- <name xml:lang="tr">FTP Sunucusu</name>
- <name xml:lang="uk">Сервер FTP</name>
- <name xml:lang="ur">سرور FTP</name>
- <name xml:lang="vi">Server FTP</name>
- <name xml:lang="zh_CN">FTP 服务器</name>
- <name xml:lang="zh_TW">FTP 伺服器</name>
- <name xml:lang="zu">Umlekeleli we-FTP</name>
- <description>Allows the system to act as an FTP server.</description>
- <description xml:lang="as">চিস্টেমক এটা FTP চাৰ্ভাৰ হিচাপে কাৰ্য্য কৰাৰ অনুমতি দিয়ে।</description>
- <description xml:lang="bn">FTP সার্ভার রূপে সিস্টেম ব্যবহার করার সুবিধা উপলব্ধ করা হয়।</description>
- <description xml:lang="bn_IN">FTP সার্ভার রূপে সিস্টেম ব্যবহার করার সুবিধা উপলব্ধ করা হয়।</description>
- <description xml:lang="cs">Umožňuje používat počítač jako FTP server.</description>
- <description xml:lang="de">Ermöglicht dem System, als FTP-Server fungieren.</description>
- <description xml:lang="es">Permite al sistema actuar como un servidor FTP.</description>
- <description xml:lang="fr">Permet au système d'agir comme un serveur FTP.</description>
- <description xml:lang="gu">FTP સર્વર તરીકે કાર્ય કરવા માટે સિસ્ટમને પરવાનગી આપે છે.</description>
- <description xml:lang="hi">तंत्र को बतौर FTP सर्वर के रूप में काम करने की अनुमति दें.</description>
- <description xml:lang="ia">Illo permitte al systema ager como un servitor FTP.</description>
- <description xml:lang="it">Permette al sistema di comportarsi come un server FTP.</description>
- <description xml:lang="ja">システムが FTP サーバーとして機能できるようにします。</description>
- <description xml:lang="kn">ವ್ಯವಸ್ಥೆಯು ಒಂದು FTP ಪೂರೈಕೆಗಣಕವಾಗಿ ನಿರ್ವಹಿಸಲು ಇದು ಅನುಮತಿಸುತ್ತದೆ.</description>
- <description xml:lang="ko">시스템이 FTP 서버로 동작하도록 허용</description>
- <description xml:lang="ml">ഒരു എഫ്‌ടിപി സര്‍വറാകുന്നതിനു് സിസ്റ്റത്തിനെ സഹായിക്കുന്നു.</description>
- <description xml:lang="mr">प्रणालीला FTP सर्व्हर म्हणून कार्य करण्यास शक्य करतो.</description>
- <description xml:lang="or">ତନ୍ତ୍ର କୁ FTP ସର୍ଭର ଭଳି କାର୍ଯ୍ଯ କରିବା ପାଇଁ ଅନୁମତି ଦିଅନ୍ତୁ।</description>
- <description xml:lang="pa">ਸਿਸਟਮ ਨੂੰ FTP ਸਰਵਰ ਵਾਂਗ ਕੰਮ ਕਰਨ ਲਈ ਮਦਦ ਕਰਦਾ ਹੈ।</description>
- <description xml:lang="pl">Umożliwia systemowi pracę jako serwer FTP.</description>
- <description xml:lang="pt_BR">Permite que o sistema aja como um servidor FTP.</description>
- <description xml:lang="ru">Позволяет системе функционировать в качестве FTP-сервера.</description>
- <description xml:lang="sv">Låter systemet agera som en FTP-server.</description>
- <description xml:lang="ta">ஒரு FTP சேவையகமாக பணியாற்ற இந்தக் கணினியை அனுமதிக்கிறது.</description>
- <description xml:lang="te">సిస్టమ్ FTP సేవిక వలె పనిచేయుటకు అనుమతించును.</description>
- <description xml:lang="uk">Надає змогу системі працювати у режимі сервера FTP.</description>
- <description xml:lang="zh_CN">允许将系统作为 FTP 服务器使用。</description>
- <description xml:lang="zh_TW">允許系統被用來作為 FTP 伺服器。</description>
- <default>false</default>
- <uservisible>false</uservisible>
- <packagelist>
- <packagereq type="mandatory">vsftpd</packagereq>
- <packagereq type="optional">xferstats</packagereq>
- </packagelist>
- </group>
- <group>
- <id>gnome-apps</id>
- <name>GNOME Applications</name>
- <name xml:lang="as">GNOME এপ্লিকেচনসমূহ</name>
- <name xml:lang="bn_IN">GNOME অ্যাপ্লিকেশন</name>
- <name xml:lang="cs">Aplikace pro GNOME</name>
- <name xml:lang="de">GNOME-Anwendungen</name>
- <name xml:lang="es">Aplicaciones de Gnome</name>
- <name xml:lang="fr">Applications GNOME</name>
- <name xml:lang="gu">GNOME કાર્યક્રમો</name>
- <name xml:lang="hi">गनोम अनुप्रयोग</name>
- <name xml:lang="it">Applicazioni di GNOME</name>
- <name xml:lang="ja">GNOME アプリケーション</name>
- <name xml:lang="kn">GNOME ಅನ್ವಯಗಳು</name>
- <name xml:lang="ko">GNOME 응용 프로그램</name>
- <name xml:lang="ml">ഗ്നോം പ്രയോഗങ്ങള്‍</name>
- <name xml:lang="mr">GNOME ॲप्लिकेशन्स</name>
- <name xml:lang="or">GNOME ପ୍ରୟୋଗଗୁଡ଼ିକ</name>
- <name xml:lang="pa">GNOME ਐਪਲੀਕੇਸ਼ਨਾਂ</name>
- <name xml:lang="pl">Aplikacje GNOME</name>
- <name xml:lang="pt_BR">Aplicativos do GNOME</name>
- <name xml:lang="ru">Приложения GNOME</name>
- <name xml:lang="ta">GNOME பயன்பாடுகள்</name>
- <name xml:lang="te">గ్నోమ్ అనువర్తనాలు</name>
- <name xml:lang="uk">Програми GNOME</name>
- <name xml:lang="zh_CN">GNOME 应用程序</name>
- <name xml:lang="zh_TW">GNOME 應用程式</name>
- <description>A set of commonly used GNOME Applications.</description>
- <description xml:lang="cs">Sada běžně používaných aplikací v prostředí GNOME.</description>
- <description xml:lang="de">Eine Reihe häufig verwendeter GNOME-Anwendungen.</description>
- <description xml:lang="es">Un set de las aplicaciones GNOME más utilizadas.</description>
- <description xml:lang="fr">Ensemble d'applications GNOME couramment utilisées.</description>
- <description xml:lang="gu">સામાન્ય રીતે વપરાતા GNOME કાર્યક્રમોનો સમૂહ.</description>
- <description xml:lang="hi">बारंबार प्रयुक्त गनोम अनुप्रयोग.</description>
- <description xml:lang="it">Un set di applicazioni GNOME usate frequentemente.</description>
- <description xml:lang="ja">よく使用する GNOME アプリケーションセットです。</description>
- <description xml:lang="kn">ಸಾಮಾನ್ಯವಾಗಿ ಬಳಸಲಾಗುವ GNOME ಅನ್ವಯಗಳ ಒಂದು ಸಂಗ್ರಹ.</description>
- <description xml:lang="ko">자주 사용하는 GNOME 애플리케이션 모음입니다.</description>
- <description xml:lang="ml">സാധാരണമായി എപ്പോഴും ഉപയോഗിയ്ക്കുന്ന ഗ്നോം പ്രയോഗങ്ങള്‍.</description>
- <description xml:lang="mr">वारंवार वापरले जाणाऱ्या GNOME ॲप्लिकेशन्स्चा संच.</description>
- <description xml:lang="or">ସାଧାରଣ ଭାବରେ ବ୍ୟବହୃତ GNOME ପ୍ରୟୋଗଗୁଡ଼ିକର ଏକ ସେଟ।</description>
- <description xml:lang="pa">ਅਾਮ ਤੌਰ ਤੇ ਵਰਤੀਆਂ ਜਾਂਦੀਆਂ GNOME ਐਪਲੀਕੇਸ਼ਨਾਂ ਦਾ ਇੱਕ ਸਮੂਹ।</description>
- <description xml:lang="pl">Zestaw często używanych aplikacji środowiska GNOME.</description>
- <description xml:lang="pt_BR">Um conjunto de aplicativos de GNOME mais usados.</description>
- <description xml:lang="ru">Набор популярных приложений GNOME.</description>
- <description xml:lang="ta">பொதுவாகப் பயன்படுத்தப்படும் GNOME பயன்பாடுகளின் தொகுப்பு.</description>
- <description xml:lang="te">ఉమ్మడిగా ఉపయోగించే గ్నోమ్ అనువర్తనాల సమితి</description>
- <description xml:lang="uk">Набір типових програм GNOME.</description>
- <description xml:lang="zh_CN">一组经常使用的 GNOME 应用程序。</description>
- <description xml:lang="zh_TW">一組常用的 GNOME 應用程式。</description>
- <default>false</default>
- <uservisible>false</uservisible>
- <packagelist>
- <packagereq type="mandatory">brasero</packagereq>
- <packagereq type="mandatory">brasero-nautilus</packagereq>
- <packagereq type="mandatory">rhythmbox</packagereq>
- <packagereq type="mandatory">shotwell</packagereq>
- </packagelist>
- </group>
- <group>
- <id>gnome-desktop</id>
- <name>GNOME</name>
- <name xml:lang="af">GNOME</name>
- <name xml:lang="am">ኖም</name>
- <name xml:lang="ar">جينوم</name>
- <name xml:lang="as">GNOME</name>
- <name xml:lang="be">GNOME</name>
- <name xml:lang="bn">GNOME</name>
- <name xml:lang="bn_IN">GNOME</name>
- <name xml:lang="bs">GNOME</name>
- <name xml:lang="ca">GNOME</name>
- <name xml:lang="cs">GNOME</name>
- <name xml:lang="cy">GNOME</name>
- <name xml:lang="de">GNOME</name>
- <name xml:lang="en_GB">GNOME</name>
- <name xml:lang="es">GNOME</name>
- <name xml:lang="eu">GNOME</name>
- <name xml:lang="fa">گنوم</name>
- <name xml:lang="fi">Gnome</name>
- <name xml:lang="fr">GNOME</name>
- <name xml:lang="gl">GNOME</name>
- <name xml:lang="gu">GNOME</name>
- <name xml:lang="hi">GNOME</name>
- <name xml:lang="hr">GNOME</name>
- <name xml:lang="hu">GNOME</name>
- <name xml:lang="hy">GNOME</name>
- <name xml:lang="id">GNOME</name>
- <name xml:lang="ilo">GNOME</name>
- <name xml:lang="it">GNOME</name>
- <name xml:lang="ja">GNOME</name>
- <name xml:lang="ka">GNOME</name>
- <name xml:lang="kn">GNOME</name>
- <name xml:lang="ko">GNOME</name>
- <name xml:lang="lv">GNOME</name>
- <name xml:lang="mk">Гном</name>
- <name xml:lang="ml">ഗ്നോം</name>
- <name xml:lang="mr">GNOME</name>
- <name xml:lang="no">GNOME</name>
- <name xml:lang="nso">GNOME</name>
- <name xml:lang="or">GNOME</name>
- <name xml:lang="pa">ਗਨੋਮ</name>
- <name xml:lang="pl">GNOME</name>
- <name xml:lang="pt_BR">GNOME</name>
- <name xml:lang="ru">GNOME</name>
- <name xml:lang="si">GNOME</name>
- <name xml:lang="sl">GNOME</name>
- <name xml:lang="sq">GNOME</name>
- <name xml:lang="ta">GNOME</name>
- <name xml:lang="te">GNOME</name>
- <name xml:lang="th">GNOME</name>
- <name xml:lang="tr">GNOME</name>
- <name xml:lang="uk">GNOME</name>
- <name xml:lang="ur">جينوم</name>
- <name xml:lang="vi">GNOME</name>
- <name xml:lang="zh_CN">GNOME</name>
- <name xml:lang="zh_TW">GNOME</name>
- <name xml:lang="zu">I-GNOME</name>
- <description>GNOME is a highly intuitive and user friendly desktop environment.</description>
- <description xml:lang="as">GNOME উচ্চভাৱে আন্তদৃষ্টিক আৰু ব্যৱহাৰকাৰীৰ বাবে সহজ ডেস্কটপ পৰিৱেশ।</description>
- <description xml:lang="bn_IN">GNOME হল উচ্চ অনুমানক্ষমতা বিশিষ্ট এবং ব্যবহারের দিক থেকে সহজ এক ডেস্কটপ এনভায়রনমেন্ট।</description>
- <description xml:lang="cs">GNOME je intuitivní a uživatelsky příjemné pracovní prostředí.</description>
- <description xml:lang="de">GNOME ist eine sehr intuitive und benutzerfreundliche Desktop-Umgebung.</description>
- <description xml:lang="es">GNOME es un entorno de escritorio altamente intuitivo y fácil de manejar</description>
- <description xml:lang="fr">GNOME est un environnement de bureau convivial et hautement intuitif.</description>
- <description xml:lang="gu">GNOME એ ખૂબ ઊંચુ સાહજિક અને વપરાશકર્તા મૈત્રી ડૅસ્કટોપ પર્યાવરણ છે.</description>
- <description xml:lang="hi">गनोम काफी पारस्परिका और उपयोक्ता मैत्रीयुक्त डेस्कटॉप वातावरण है.</description>
- <description xml:lang="it">GNOME è un ambiente desktop facile da usare e altamente intuitivo.</description>
- <description xml:lang="ja">GNOME は非常に直観的でユーザーフレンドリーなデスクトップ環境になります。</description>
- <description xml:lang="kn">GNOME ಒಂದು ಅತ್ಯಂತ ಸುಲಭವಾಗಿ ಅರ್ಥವಾಗುವ ಬಳಕೆದಾರ ಸ್ನೇಹಿ ಗಣಕತೆರೆ ಪರಿಸರ.</description>
- <description xml:lang="ko">GNOME은 사용하기 쉽고 사용자 친화적인 데스크탑 환경입니다.</description>
- <description xml:lang="ml">വളരെ അവബോധജന്യവും ഉപയോക്താവിനോടു് വളരെ സൌഹൃദ്യവുമുള്ള രീതിയിലുള്ള പണിയിടമാണു് ഗ്നോം.</description>
- <description xml:lang="mr">GNOME हे अत्यंत ज्ञानी आणि वापरकर्ता मदतगार डेस्कटॉप वातावरण आहे.</description>
- <description xml:lang="or">GNOME ଅତି ମାତ୍ରାରେ ସହଜଜ୍ଞାନ ସମ୍ପନ୍ନ ଏବଂ ବ୍ୟବହାରକାରୀଙ୍କ ପାଇଁ ସହଜମୟ ଡେସ୍କଟପ ପରିବେଶ।</description>
- <description xml:lang="pa">GNOME ਇੱਕ ਬਹੁਤ ਹੀ ਅਨੁਭਵੀ ਅਤੇ ਵਰਤੋਂਕਾਰ ਹਿਤਕਾਰੀ ਡੈਸਕਟਾਪ ਵਾਤਾਵਰਣ ਹੈ।</description>
- <description xml:lang="pl">GNOME to intuicyjne i przyjazne dla użytkownika środowisko pulpitu.</description>
- <description xml:lang="pt_BR">GNOME é um ambiente de desktop amigável de usuário e altamente intuitivo.</description>
- <description xml:lang="ru">GNOME — интуитивное окружение рабочего стола.</description>
- <description xml:lang="ta">GNOME புத்திசாலித்தனமான மற்றும் பயன்படுத்த எளிதான பணிமேடைச் சூழலாகும்.</description>
- <description xml:lang="te">గ్నోమ్ అనేది తేలికగా తెలుసుకొనే మరియు వాడుకరికి అనుకూలమైన డెస్కుటాప్ పరిసరం.</description>
- <description xml:lang="uk">GNOME — зручне у користуванні та інтуїтивно зрозуміле стільничне середовище.</description>
- <description xml:lang="zh_CN">GNOME 是一个非常直观且用户友好的桌面环境。</description>
- <description xml:lang="zh_TW">GNOME 是個容易上手且容易使用的桌面環境。</description>
- <default>false</default>
- <uservisible>false</uservisible>
- <packagelist>
- <packagereq type="mandatory">abrt-desktop</packagereq>
- <packagereq type="mandatory">at-spi2-atk</packagereq>
- <packagereq type="mandatory">at-spi2-core</packagereq>
- <packagereq type="mandatory">avahi</packagereq>
- <packagereq type="mandatory">baobab</packagereq>
- <packagereq type="mandatory">caribou</packagereq>
- <packagereq type="mandatory">caribou-gtk2-module</packagereq>
- <packagereq type="mandatory">caribou-gtk3-module</packagereq>
- <packagereq type="mandatory">cheese</packagereq>
- <packagereq type="mandatory">compat-cheese314</packagereq>
- <packagereq type="mandatory">control-center</packagereq>
- <packagereq type="mandatory">dconf</packagereq>
- <packagereq type="mandatory">empathy</packagereq>
- <packagereq type="mandatory">eog</packagereq>
- <packagereq type="mandatory">evince</packagereq>
- <packagereq type="mandatory">evince-nautilus</packagereq>
- <packagereq type="mandatory">file-roller</packagereq>
- <packagereq type="mandatory">file-roller-nautilus</packagereq>
- <packagereq type="mandatory">firewall-config</packagereq>
- <packagereq type="mandatory">firstboot</packagereq>
- <packagereq type="mandatory">fprintd-pam</packagereq>
- <packagereq type="mandatory">gdm</packagereq>
- <packagereq type="mandatory">gedit</packagereq>
- <packagereq type="mandatory">glib-networking</packagereq>
- <packagereq type="mandatory">gnome-bluetooth</packagereq>
- <packagereq type="mandatory">gnome-boxes</packagereq>
- <packagereq type="mandatory">gnome-calculator</packagereq>
- <packagereq type="mandatory">gnome-classic-session</packagereq>
- <packagereq type="mandatory">gnome-clocks</packagereq>
- <packagereq type="mandatory">gnome-color-manager</packagereq>
- <packagereq type="mandatory">gnome-contacts</packagereq>
- <packagereq type="mandatory">gnome-dictionary</packagereq>
- <packagereq type="mandatory">gnome-disk-utility</packagereq>
- <packagereq type="mandatory">gnome-font-viewer</packagereq>
- <packagereq type="mandatory">gnome-getting-started-docs</packagereq>
- <packagereq type="mandatory">gnome-icon-theme</packagereq>
- <packagereq type="mandatory">gnome-icon-theme-extras</packagereq>
- <packagereq type="mandatory">gnome-icon-theme-symbolic</packagereq>
- <packagereq type="mandatory">gnome-initial-setup</packagereq>
- <packagereq type="mandatory">gnome-packagekit</packagereq>
- <packagereq type="mandatory">gnome-packagekit-updater</packagereq>
- <packagereq type="mandatory">gnome-screenshot</packagereq>
- <packagereq type="mandatory">gnome-session</packagereq>
- <packagereq type="mandatory">gnome-session-xsession</packagereq>
- <packagereq type="mandatory">gnome-settings-daemon</packagereq>
- <packagereq type="mandatory">gnome-shell</packagereq>
- <packagereq type="mandatory">gnome-software</packagereq>
- <packagereq type="mandatory">gnome-system-log</packagereq>
- <packagereq type="mandatory">gnome-system-monitor</packagereq>
- <packagereq type="mandatory">gnome-terminal</packagereq>
- <packagereq type="mandatory">gnome-terminal-nautilus</packagereq>
- <packagereq type="mandatory">gnome-themes-standard</packagereq>
- <packagereq type="mandatory">gnome-tweak-tool</packagereq>
- <packagereq type="mandatory">gnome-user-docs</packagereq>
- <packagereq type="mandatory">gnome-weather</packagereq>
- <packagereq type="mandatory">gucharmap</packagereq>
- <packagereq type="mandatory">gvfs-afc</packagereq>
- <packagereq type="mandatory">gvfs-afp</packagereq>
- <packagereq type="mandatory">gvfs-archive</packagereq>
- <packagereq type="mandatory">gvfs-fuse</packagereq>
- <packagereq type="mandatory">gvfs-goa</packagereq>
- <packagereq type="mandatory">gvfs-gphoto2</packagereq>
- <packagereq type="mandatory">gvfs-mtp</packagereq>
- <packagereq type="mandatory">gvfs-smb</packagereq>
- <packagereq type="mandatory">initial-setup-gui</packagereq>
- <packagereq type="mandatory">libcanberra-gtk2</packagereq>
- <packagereq type="mandatory">libcanberra-gtk3</packagereq>
- <packagereq type="mandatory">libproxy-mozjs</packagereq>
- <packagereq type="mandatory">librsvg2</packagereq>
- <packagereq type="mandatory">libsane-hpaio</packagereq>
- <packagereq type="mandatory">metacity</packagereq>
- <packagereq type="mandatory">mousetweaks</packagereq>
- <packagereq type="mandatory">nautilus</packagereq>
- <packagereq type="mandatory">nautilus-sendto</packagereq>
- <packagereq type="mandatory">NetworkManager-libreswan-gnome</packagereq>
- <packagereq type="mandatory">nm-connection-editor</packagereq>
- <packagereq type="mandatory">orca</packagereq>
- <packagereq type="mandatory">PackageKit-command-not-found</packagereq>
- <packagereq type="mandatory">PackageKit-gtk3-module</packagereq>
- <packagereq type="mandatory">redhat-access-gui</packagereq>
- <packagereq type="mandatory">sane-backends-drivers-scanners</packagereq>
- <packagereq type="mandatory">seahorse</packagereq>
- <packagereq type="mandatory">setroubleshoot</packagereq>
- <packagereq type="mandatory">sushi</packagereq>
- <packagereq type="mandatory">totem</packagereq>
- <packagereq type="mandatory">totem-nautilus</packagereq>
- <packagereq type="mandatory">vinagre</packagereq>
- <packagereq type="mandatory">vino</packagereq>
- <packagereq type="mandatory">xdg-user-dirs-gtk</packagereq>
- <packagereq type="mandatory">yelp</packagereq>
- <packagereq type="default">xdg-desktop-portal-gtk</packagereq>
- <packagereq type="optional">alacarte</packagereq>
- <packagereq type="optional">dconf-editor</packagereq>
- <packagereq type="optional">dvgrab</packagereq>
- <packagereq type="optional">fonts-tweak-tool</packagereq>
- <packagereq type="optional">gconf-editor</packagereq>
- <packagereq type="optional">gedit-plugins</packagereq>
- <packagereq type="optional">gnome-shell-browser-plugin</packagereq>
- <packagereq type="optional">gnote</packagereq>
- <packagereq type="optional">seahorse-nautilus</packagereq>
- <packagereq type="optional">seahorse-sharing</packagereq>
- <packagereq type="optional">vim-X11</packagereq>
- <packagereq type="optional">xguest</packagereq>
- </packagelist>
- </group>
- <group>
- <id>graphical-admin-tools</id>
- <name>Graphical Administration Tools</name>
- <name xml:lang="as">গ্ৰাফিকেল পদ্ধতিত ব্যৱহাৰযোগ্য প্ৰশাসনিক সঁজুলিসমূহ</name>
- <name xml:lang="bn">গ্রাফিক্যাল পদ্ধতিতে ব্যবহারযোগ্য প্রশাসনিক সরঞ্জাম</name>
- <name xml:lang="bn_IN">গ্রাফিক্যাল পদ্ধতিতে ব্যবহারযোগ্য প্রশাসনিক সরঞ্জাম</name>
- <name xml:lang="cs">Grafické nástroje pro správu</name>
- <name xml:lang="de">Grafische Administrations-Tools</name>
- <name xml:lang="es">Herramientas gráficas de Administración</name>
- <name xml:lang="fr">Outils d'administration graphique</name>
- <name xml:lang="gu">ગ્રાફિકલ સંચાલન સાધનો</name>
- <name xml:lang="hi">आलेखी प्रशासन औज़ार</name>
- <name xml:lang="ia">Instrumentos de administration graphic</name>
- <name xml:lang="it">Tool di amministrazione grafica</name>
- <name xml:lang="ja">グラフィカル管理ツール</name>
- <name xml:lang="kn">ಚಿತ್ರಾತ್ಮಕ ನಿರ್ವಹಣಾ ಉಪಕರಣಗಳು</name>
- <name xml:lang="ko">그래픽기반 관리 도구</name>
- <name xml:lang="ml">ഗ്രാഫിക്സ് അഡ്മിനിസ്ട്രേഷന്‍ ഉപകരണങ്ങള്‍</name>
- <name xml:lang="mr">ग्राफिकल प्रशासकीय साधने</name>
- <name xml:lang="or">ଆଲେଖୀକ ପ୍ରଶାସନୀୟ ଉପକରଣମାନ</name>
- <name xml:lang="pa">ਗਰਾਫੀਕਲ ਪਰਬੰਧਨ ਟੂਲ</name>
- <name xml:lang="pl">Graficzne narzędzia administracyjne</name>
- <name xml:lang="pt_BR">Ferramentas Administrativas gráficas</name>
- <name xml:lang="ru">Графические средства администрирования</name>
- <name xml:lang="sv">Grafiska administrationsverktyg</name>
- <name xml:lang="ta">வரைகலை நிர்வாக கருவிகள்</name>
- <name xml:lang="te">గ్రాఫికల్ నిర్వహణా సాధనములు</name>
- <name xml:lang="uk">Графічні засоби адміністрування</name>
- <name xml:lang="zh_CN">图形管理工具</name>
- <name xml:lang="zh_TW">圖形化管理工具</name>
- <description>Graphical system administration tools for managing many aspects of a system.</description>
- <description xml:lang="as">এটা চিস্টেমৰ বহু বস্তুক চম্ভালীবলে গ্ৰাফীয় চিস্টেম ব্যৱস্থাপনা সঁজুলিসমূহ।</description>
- <description xml:lang="bn">সিস্টেমের বিভিন্ন অংশ পরিচালনার জন্য সিস্টেম অ্যাডমিনিস্ট্রেশনের গ্রাফিক্যাল সরঞ্জাম</description>
- <description xml:lang="bn_IN">সিস্টেমের বিভিন্ন অংশ পরিচালনার জন্য সিস্টেম অ্যাডমিনিস্ট্রেশনের গ্রাফিক্যাল সরঞ্জাম</description>
- <description xml:lang="cs">Grafické nástroje pro správu mnoha aspektů systému.</description>
- <description xml:lang="de">Grafische Systemadministrations-Tools zur Verwaltung vieler Aspekte eines Systems.</description>
- <description xml:lang="es">Herramientas de administración de sistemas gráficos para administrar varios aspectos de un sistema.</description>
- <description xml:lang="fr">Outils d'administration du système graphique pour la gestion de nombreux aspects d'un système.</description>
- <description xml:lang="gu">સિસ્ટમની ઘણી સ્થિતિને સંચાલિત કરવા માટે ગ્રાફિકલ સિસ્ટમ સંચાલન સાધનો.</description>
- <description xml:lang="hi">तंत्र के कई पहलू के लिए आलेखी प्रशासन औज़ार.</description>
- <description xml:lang="ia">Utensiles graphic pro administrar numerose aspectos de un systema.</description>
- <description xml:lang="it">Strumenti di gestione del sistema grafici per la gestione di numerosi aspetti di un sistema</description>
- <description xml:lang="ja">システムの多くの側面を管理するためのグラフィカルなシステム管理ツール</description>
- <description xml:lang="kn">ಒಂದು ವ್ಯವಸ್ಥೆಯ ಹಲವು ಅಂಶಗಳನ್ನು ನಿರ್ವಹಿಸುವ ಚಿತ್ರಾತ್ಮಕ ನಿರ್ವಹಣಾ ಉಪಕರಣಗಳು</description>
- <description xml:lang="ko">시스템의 여러 측면을 관리하기 위한 그래픽 시스템 관리 도구</description>
- <description xml:lang="ml">ഒരു സിസ്റ്റത്തിന്റെ പല തരത്തിലുള്ള കാര്യങ്ങള്‍ കൈകാര്യം ചെയ്യുന്നതിനുള്ള ഗ്രാഫിക്കല്‍ സിസ്റ്റം അഡ്മിനിസ്ട്രേഷന്‍ പ്രയോഗങ്ങള്‍.</description>
- <description xml:lang="mr">प्रणालीचे अनेक पैलू व्यवस्थापीत करण्यासाठी ग्राफिकल सिस्टम् प्रशासन साधने.</description>
- <description xml:lang="or">ତନ୍ତ୍ରର ଅନେକ ଦୃଷ୍ଟିକୋଣକୁ ପରିଚାଳନା କରିବା ପାଇଁ ଆଲେଖିକ ତନ୍ତ୍ର ପ୍ରଶାସନୀୟ ଉପକରଣଗୁଡ଼ିକ।</description>
- <description xml:lang="pa">ਇੱਕ ਸਿਸਟਮ ਦੇ ਬਹੁਤ ਸਾਰੇ ਕੰਟਰੋਲਾਂ ਲਈ ਗਰਾਫੀਕਲ ਸਿਸਟਮ ਪਰਬੰਧਨ ਟੂਲ।</description>
- <description xml:lang="pl">Graficzne narzędzia administracji systemem do zarządzania wieloma aspektami systemu.</description>
- <description xml:lang="pt_BR">Ferramentas de administração de sistemas para gerenciar muitos aspectos de um sistema.</description>
- <description xml:lang="ru">Графические программы управления системными компонентами.</description>
- <description xml:lang="ta">ஒரு சிஸ்டத்தின் பல வகைகளை நிர்வகிக்க வரைகலை சிஸ்டம் நிர்வாக கருவிகள்.</description>
- <description xml:lang="te">సిస్టమ్ యొక్క పెక్కు దృక్కులు(యాస్పెక్ట్స్) నిర్వహించుటకు గ్రాఫికల్ సిస్టమ్ నిర్వహణా సాధనములు.</description>
- <description xml:lang="uk">Графічні програми для адміністративного керування різними параметрами системи.</description>
- <description xml:lang="zh_CN">用于管理系统各个方面的图形系统管理工具。</description>
- <description xml:lang="zh_TW">管理系統多方面的圖像化系統管理工具。</description>
- <default>false</default>
- <uservisible>true</uservisible>
- <packagelist>
- <packagereq type="conditional" requires="system-config-users">system-config-users-docs</packagereq>
- <packagereq type="optional">authconfig-gtk</packagereq>
- <packagereq type="optional">gnome-disk-utility</packagereq>
- <packagereq type="optional">gnome-packagekit</packagereq>
- <packagereq type="optional">policycoreutils-gui</packagereq>
- <packagereq type="optional">setools-console</packagereq>
- <packagereq type="optional">setroubleshoot</packagereq>
- <packagereq type="optional">system-config-kdump</packagereq>
- <packagereq type="optional">system-config-kickstart</packagereq>
- <packagereq type="optional">system-config-users</packagereq>
- <packagereq type="optional">wireshark-gnome</packagereq>
- </packagelist>
- </group>
- <group>
- <id>graphics</id>
- <name>Graphics Creation Tools</name>
- <name xml:lang="as">গ্ৰাফিক্স নিৰ্মাণৰ বাবে ব্যৱহাৰযোগ্য সঁজুলিসমূহ</name>
- <name xml:lang="bn">গ্রাফিক্স নির্মাণের জন্য ব্যবহারযোগ্য সরঞ্জাম</name>
- <name xml:lang="bn_IN">গ্রাফিক্স নির্মাণের জন্য ব্যবহারযোগ্য সরঞ্জাম</name>
- <name xml:lang="cs">Grafické tvůrčí nástroje</name>
- <name xml:lang="de">Tools zur Erstellung von Grafiken</name>
- <name xml:lang="es">Herramientas de creación de gráficas</name>
- <name xml:lang="fr">Outils de création graphique</name>
- <name xml:lang="gu">ગ્રાફિક્સ બનાવવાનાં સાધનો</name>
- <name xml:lang="hi">आलेखी निर्माण औज़ार</name>
- <name xml:lang="ia">Instrumentos pro crear graphicas</name>
- <name xml:lang="it">Tool di creazione grafici</name>
- <name xml:lang="ja">グラフィックスツール</name>
- <name xml:lang="kn">ಗ್ರಾಫಿಕ್ಸ್ ರಚನಾ ಉಪಕರಣಗಳು</name>
- <name xml:lang="ko">그래픽스 생성 도구</name>
- <name xml:lang="ml">ഗ്രാഫിക്സ് സജ്ജമാക്കുന്നതിനുള്ള ഉപകരണങ്ങള്‍</name>
- <name xml:lang="mr">ग्राफिक्स् निर्माण साधने</name>
- <name xml:lang="or">ଆଲେଖୀକ ନିର୍ମାଣ ଉପକରଣ</name>
- <name xml:lang="pa">ਗਰਾਫੀਕਲ ਬਣਾਵਟੀ ਸੰਦ</name>
- <name xml:lang="pl">Narzędzia tworzenia grafiki</name>
- <name xml:lang="pt_BR">Ferramentas de criaçao gráficas</name>
- <name xml:lang="ru">Средства создания графики</name>
- <name xml:lang="sv">Grafiska verktyg för att skapa</name>
- <name xml:lang="ta">வரைகலைகள் உருவாக்க கருவிகள்</name>
- <name xml:lang="te">గ్రాఫిక్స్ సృష్టీకరణ సాధనములు</name>
- <name xml:lang="uk">Інструменти для створення графіки</name>
- <name xml:lang="zh_CN">图形生成工具</name>
- <name xml:lang="zh_TW">圖形設計工具</name>
- <description>Software for creation and manipulation of still images.</description>
- <description xml:lang="as">ছবি নিৰ্মাণ আৰু পৰিবৰ্তনৰ বাবে ব্যৱহাৰযোগ্য চফ্টৱেৰ।</description>
- <description xml:lang="bn">ছবি নির্মাণ ও পরিবর্তনের জন্য ব্যবহারযোগ্য সফ্টওয়্যার।</description>
- <description xml:lang="bn_IN">ছবি নির্মাণ ও পরিবর্তনের জন্য ব্যবহারযোগ্য সফ্টওয়্যার।</description>
- <description xml:lang="cs">Software pro tvorbu a úpravu statických obrázků.</description>
- <description xml:lang="de">Software zur Erstellung und Manipulation von Stillbildern.</description>
- <description xml:lang="es">Software para creación y manipulación de imágenes fijas.</description>
- <description xml:lang="fr">Logiciel pour la création et la manipulation d'images fixes.</description>
- <description xml:lang="gu">હજુ ઇમેજોને વાપરવા અને બનાવવા માટે સોફ્ટવેર.</description>
- <description xml:lang="hi">निर्जीव छवियों के निर्माण और परिवर्तन के लिए सॉफ्टवेयर.</description>
- <description xml:lang="ia">Software pro crear e manipular imagines immobile.</description>
- <description xml:lang="it">Software per la creazione e manipolazione di immagini ferme.</description>
- <description xml:lang="ja">静止画像の作成や修正を行うためのソフトウェアです。</description>
- <description xml:lang="kn">ಸ್ಥಿರ ಚಿತ್ರಗಳನ್ನು ರಚಿಸುವ ಹಾಗು ಸಂಸ್ಕರಿಸಲು ನೆರವಾಗುವ ತಂತ್ರಾಂಶ.</description>
- <description xml:lang="ko">정지 화상을 만들고 다루기 위한 소프트웨어.</description>
- <description xml:lang="ml">നിശ്ചല ചിത്രങ്ങള്‍ തയ്യാറാക്കുന്നതിനും കൈകാര്യം ചെയ്യുന്നതിനുമുള്ള സോഫ്റ്റ്‌വെയര്‍.</description>
- <description xml:lang="mr">स्टील प्रतिमांच्या निर्माण व बदलकरीता सॉफ्टवेअर.</description>
- <description xml:lang="or">ସ୍ଥିର ପ୍ରତିଛବିଗୁଡ଼ିକର ନିର୍ମାଣ ଏବଂ ସଙ୍କଳନ ପାଇଁ ସଫ୍ଟୱେର।</description>
- <description xml:lang="pa">ਸਟਿੱਲ ਈਮੇਜ਼ ਬਣਾਉਣ ਅਤੇ ਸੋਧਣ ਲਈ ਸਾਫਟਵੇਅਰ।</description>
- <description xml:lang="pl">Oprogramowanie do tworzenia i modyfikowania obrazów.</description>
- <description xml:lang="pt_BR">Software para criação e manipulação de imagens paradas.</description>
- <description xml:lang="ru">Программы для создания и обработки изображений.</description>
- <description xml:lang="sv">Program för att skapa och förändra stillbilder.</description>
- <description xml:lang="ta">இன்னும் படங்களை உருவாக்க மற்றும் திறமையாக கையாளுவதற்கான மென்பொருள்.</description>
- <description xml:lang="te">స్టిల్ ఇమేజెస్‌ను సృష్టించుటకు మరియు తీర్చిదిద్దుటకు సాఫ్టువేరు.</description>
- <description xml:lang="uk">Програми для створення і обробки статичних зображень.</description>
- <description xml:lang="zh_CN">生成和操作静止图像的软件。</description>
- <description xml:lang="zh_TW">用來建立和操作靜態影像的軟體。</description>
- <default>false</default>
- <uservisible>false</uservisible>
- <packagelist>
- <packagereq type="mandatory">gimp</packagereq>
- <packagereq type="default">gimp-data-extras</packagereq>
- <packagereq type="default">gimp-help</packagereq>
- <packagereq type="default">gutenprint-plugin</packagereq>
- <packagereq type="default">inkscape</packagereq>
- <packagereq type="default">libsane-hpaio</packagereq>
- <packagereq type="default">sane-backends-drivers-scanners</packagereq>
- <packagereq type="default">sane-frontends</packagereq>
- <packagereq type="default">xsane-gimp</packagereq>
- <packagereq type="optional">dcraw</packagereq>
- <packagereq type="optional">ImageMagick</packagereq>
- <packagereq type="optional">netpbm-progs</packagereq>
- </packagelist>
- </group>
- <group>
- <id>guest-agents</id>
- <name>Guest Agents</name>
- <name xml:lang="as">অতিথি সহায়ক</name>
- <name xml:lang="bn_IN">গেস্ট এজেন্ট</name>
- <name xml:lang="cs">Agenti pro virtualizované hosty</name>
- <name xml:lang="de">Gast-Agenten</name>
- <name xml:lang="es">Agentes de huésped</name>
- <name xml:lang="fr">Agents invités</name>
- <name xml:lang="gu">મહેમાન એજન્ટો</name>
- <name xml:lang="hi">अतिथि प्रतिनिधि</name>
- <name xml:lang="it">Agente guest</name>
- <name xml:lang="ja">ゲストエージェント</name>
- <name xml:lang="kn">ಅತಿಥಿ ಮಧ್ಯವರ್ತಿಗಳು</name>
- <name xml:lang="ko">게스트 에이전트</name>
- <name xml:lang="ml">ഗസ്റ്റ് ഏജന്റുകള്‍</name>
- <name xml:lang="mr">अतिथी अजेंट्स</name>
- <name xml:lang="or">ଅତିଥି ସଦସ୍ୟମାନେ</name>
- <name xml:lang="pa">ਪ੍ਰਾਹੁਣੇ ਏਜੰਟ</name>
- <name xml:lang="pl">Agenty gościa</name>
- <name xml:lang="pt_BR">Agentes de Convidados</name>
- <name xml:lang="ru">Гостевые агенты</name>
- <name xml:lang="ta">விருந்தினர் முகவர்கள்</name>
- <name xml:lang="te">అతిథి ఏజెంట్లు</name>
- <name xml:lang="uk">Агенти гостьових систем</name>
- <name xml:lang="zh_CN">虚拟机代理</name>
- <name xml:lang="zh_TW">客座代理程式</name>
- <description>Agents used when running under a hypervisor.</description>
- <description xml:lang="as">এটা হাইপাৰভাইছৰৰ অন্তৰ্গত চলোতে ব্যৱহৃত সহায়কসমূহ।</description>
- <description xml:lang="bn_IN">একটি হাইপারভাইজরের অাওতায় চলার সময়ে ব্যবহৃত এজেন্ট।</description>
- <description xml:lang="cs">Nástroje používané při virtualizaci s hypervizorem.</description>
- <description xml:lang="de">Verwendete Agenten bei Ausführung unter einem Hypervisor.</description>
- <description xml:lang="es">Agentes utilizados al ejecutarse en un hipervisor.</description>
- <description xml:lang="fr">Agents utilisés lors d'une exécution sous un hyperviseur.</description>
- <description xml:lang="gu">હાયપરવાઇઝર હેઠળ ચલાવી રહ્યા હોય ત્યારે વપરાતા એજન્ટો.</description>
- <description xml:lang="hi">हाइपरविज़र के अंतर्गत प्रयुक्त होने वाले प्रतिनिधि.</description>
- <description xml:lang="it">Agenti usati durante l'esecuzione con un hypervisor.</description>
- <description xml:lang="ja">ハイパーバイザー配下で稼働する場合に使用するエージェントです。</description>
- <description xml:lang="kn">ಒಂದು ಹೈಪರ್ವೈಸರಿನ ಅಡಿಯಲ್ಲಿ ಚಲಾಯಿತಗೊಳ್ಳುವಾಗ ಬಳಸಲಾಗುವ ಮಧ್ಯವರ್ತಿಗಳು.</description>
- <description xml:lang="ko">하이퍼바이저에서 실행 시 사용되는 에이전트</description>
- <description xml:lang="ml">ഒരു ഹൈപ്പര്‍വൈസറില്‍ പ്രവര്‍ത്തിയ്ക്കുമ്പോള്‍ ഉപയോഗിയ്ക്കുന്ന ഏജന്റുകള്‍.</description>
- <description xml:lang="mr">हाइपरवाजर अंतर्गत चालवतेवेळी वापरण्याजोगी एजंट्स.</description>
- <description xml:lang="or">ଏକ ହାଇପରଭାଇଜର ଅନ୍ତର୍ଗତରେ ଚଲାଉଥିବା ସମୟରେ ବ୍ୟବହୃତ ସଦସ୍ୟମାନେ।</description>
- <description xml:lang="pa">ਜਦੋਂ ਹਾਈਪਰਵਾਈਜ਼ਰ ਹੇਠਾਂ ਚਲਾਏ ਜਾਣ ਤਾਂ ਵਰਤੇ ਜਾਂਦੇ ਏਜੰਟ।</description>
- <description xml:lang="pl">Agenty używane podczas działania pod nadzorcą.</description>
- <description xml:lang="pt_BR">Agentes utilizados ao serem executados sob um hypervisor</description>
- <description xml:lang="ru">Агенты, работающие под управлением гипервизора.</description>
- <description xml:lang="ta">ஒரு ஹைப்பர்வைசரின் கீழ் இயக்கப்படும் போது பயன்படுத்தப்படும் முகவர்கள்.</description>
- <description xml:lang="te">హైపర్విజర్ కిందన నడుస్తున్నప్పుడు అతిథులు ఉపయోగించబడును.</description>
- <description xml:lang="uk">Агенти, що використовуються під час роботи під керування гіпервізора.</description>
- <description xml:lang="zh_CN">在 hypervisor 中运行时使用的代理。</description>
- <description xml:lang="zh_TW">在 hypervisor 下執行時所使用的代理程式。</description>
- <default>false</default>
- <uservisible>false</uservisible>
- <packagelist>
- <packagereq type="mandatory">hyperv-daemons</packagereq>
- <packagereq type="mandatory">open-vm-tools</packagereq>
- <packagereq type="mandatory">qemu-guest-agent</packagereq>
- </packagelist>
- </group>
- <group>
- <id>guest-desktop-agents</id>
- <name>Guest Desktop Agents</name>
- <name xml:lang="as">অতিথি ডেস্কটপ সহায়কসমূহ</name>
- <name xml:lang="bn_IN">গেস্ট ডেস্কটপ এজেন্ট</name>
- <name xml:lang="cs">Agenti pro pracovní prostředí hostů</name>
- <name xml:lang="de">Gast-Desktop-Agenten</name>
- <name xml:lang="es">Agentes de escritorio de huésped</name>
- <name xml:lang="fr">Agents de bureau invités</name>
- <name xml:lang="gu">મહેમાન ડૅસ્કટોપ એજન્ટો</name>
- <name xml:lang="hi">अतिथि डेस्कटॉप प्रतिनिधि</name>
- <name xml:lang="it">Agenti desktop del guest</name>
- <name xml:lang="ja">ゲストデスクトップエージェント</name>
- <name xml:lang="kn">ಅತಿಥಿ ಗಣಕತೆರೆ ಮಧ್ಯವರ್ತಿಗಳು</name>
- <name xml:lang="ko">게스트 데스크탑 에이전트</name>
- <name xml:lang="ml">ഗസ്റ്റ് പണിയിടത്തിനുള്ള ഏജന്റുകള്‍</name>
- <name xml:lang="mr">अतिथी डेस्कटॉप एजंट्स</name>
- <name xml:lang="or">ଅତିଥି ଡେସ୍କଟପ ସଦସ୍ୟମାନେ</name>
- <name xml:lang="pa">ਪ੍ਰਾਹੁਣੇ ਡੈਸਕਟਾਪ ਏਜੰਟ</name>
- <name xml:lang="pl">Agenty pulpitu gościa</name>
- <name xml:lang="pt_BR">Agentes de Desktop de Convidado</name>
- <name xml:lang="ru">Агенты гостевого рабочего стола</name>
- <name xml:lang="ta">விருந்தினர் பணிமேடை முகவர்கள்</name>
- <name xml:lang="te">అతిథి డెస్కుటాప్ ఏజెంట్లు</name>
- <name xml:lang="uk">Стільничні агенти гостьових систем</name>
- <name xml:lang="zh_CN">虚拟机桌面代理</name>
- <name xml:lang="zh_TW">客座桌面環境代理程式</name>
- <description>Agents used when running as a virtualized desktop.</description>
- <description xml:lang="as">এটা ভাৰছুৱেলাইজ্ড ডেস্কটপ ৰূপে চলোতে ব্যৱহৃত সহায়কসমূহ।</description>
- <description xml:lang="bn_IN">একটি ভার্চুয়ালাইজড ডেস্কটপ হিসাবে চলার সময়ে ব্যবহৃত এজেন্ট।</description>
- <description xml:lang="cs">Nástroje používané s virtualizovaným pracovním prostředím.</description>
- <description xml:lang="de">Verwendete Agenten bei Ausführung als virtualisierter Desktop.</description>
- <description xml:lang="es">Agentes utilizados cuando se ejecutan como un escritorio virtualizado.</description>
- <description xml:lang="fr">Agents utilisés lors d'une exécution en tant que bureau virtualisé.</description>
- <description xml:lang="gu">વર્ચ્યુઅલાઇઝ્ડ ડેસ્કટોપ તરીકે ચલાવતી વખતે વપરાતા એજન્ટો.</description>
- <description xml:lang="hi">प्रतिनिधि प्रयुक्त जब बतौर वर्चुअलाइज्ड डेस्कटॉप चले.</description>
- <description xml:lang="it">Agenti usati durante l'esecuzione come desktop virtualizzato.</description>
- <description xml:lang="ja">仮想化したデスクトップとして稼働する場合に使用するエージェントです。</description>
- <description xml:lang="kn">ವರ್ಚುವಲ್ ಆದ ಗಣಕತೆರೆಯಾಗಿ ಚಲಾಯಿತಗೊಳ್ಳುವಾಗ ಬಳಸಲಾಗುವ ಮಧ್ಯವರ್ತಿಗಳು.</description>
- <description xml:lang="ko">가상화 데스크탑으로 실행할 때 사용되는 에이전트</description>
- <description xml:lang="ml">ഒരു വിര്‍ച്ച്വലൈസ്ഡ് പണിയിടമായി പ്രവര്‍ത്തിയ്ക്കുമ്പോള്‍ ഉപയോഗിയ്ക്കുന്ന ഏജന്റുകള്‍</description>
- <description xml:lang="mr">वर्च्युअलाइज्ड डेस्कटॉप अंतर्गत चालवतेवेळी वापरण्याजोगी एजंट्स.</description>
- <description xml:lang="or">ଆଭାସୀ ଡେସ୍କଟପ ଭାବରେ ଚଲାଉଥିବା ସମୟରେ ବ୍ୟବହୃତ ସଦସ୍ୟ।</description>
- <description xml:lang="pa">ਜਦੋਂ ਆਭਾਸੀਕ੍ਰਿਤ ਡੈਸਕਟਾਪ ਵਜੋਂ ਚਲਾਏ ਜਾਣ ਤਾਂ ਵਰਤੇ ਜਾਂਦੇ ਏਜੰਟ।</description>
- <description xml:lang="pl">Agenty używane podczas działania jako wirtualizowane środowisko graficzne.</description>
- <description xml:lang="pt_BR">Agentes usados ao serem executados como desktop virtualizados.</description>
- <description xml:lang="ru">Агенты виртуального рабочего стола.</description>
- <description xml:lang="ta">ஒரு மெய்நிகராக்கப்பட்ட பணிமேடையாக இயக்கப்படும் போது பயன்படுத்தப்படும் முகவர்கள்.</description>
- <description xml:lang="te">వర్చ్యులైజ్డు డెస్కుటాప్ వలె నడుచుచున్నప్పుడు ఏజెంట్లు ఉపయోగించబడెను.</description>
- <description xml:lang="uk">Агенти, що використовуються під час роботи у режимі віртуалізованої стільниці.</description>
- <description xml:lang="zh_CN">作为虚拟桌面运行时使用的代理。</description>
- <description xml:lang="zh_TW">以虛擬化桌面環境執行時所使用的代理程式。</description>
- <default>false</default>
- <uservisible>false</uservisible>
- <packagelist>
- <packagereq type="mandatory">open-vm-tools-desktop</packagereq>
- <packagereq type="mandatory">qemu-guest-agent</packagereq>
- <packagereq type="mandatory">spice-vdagent</packagereq>
- </packagelist>
- </group>
- <group>
- <id>ha</id>
- <name>High Availability</name>
- <name xml:lang="as">অতিমাত্ৰাত উপলব্ধ</name>
- <name xml:lang="bn">অতিমাত্রায় উপলব্ধ</name>
- <name xml:lang="bn_IN">অতিমাত্রায় উপলব্ধ</name>
- <name xml:lang="cs">Vysoká dostupnost</name>
- <name xml:lang="de">Hochverfügbarkeit</name>
- <name xml:lang="es">Alta disponibilidad</name>
- <name xml:lang="fr">Haute disponibilité</name>
- <name xml:lang="gu">ઊંચી ઉપલબ્ધતા</name>
- <name xml:lang="hi">उच्च उपलब्धता</name>
- <name xml:lang="it">High Availability</name>
- <name xml:lang="ja">High Availability</name>
- <name xml:lang="kn">ಅತಿ ಲಭ್ಯತೆ</name>
- <name xml:lang="ko">고 가용성</name>
- <name xml:lang="ml">ഹൈ അവയിലബിളിറ്റി</name>
- <name xml:lang="mr">उच्च उपलब्धता</name>
- <name xml:lang="or">ଅଧିକ ମାତ୍ରାରେ ଉପଲବ୍ଧତା</name>
- <name xml:lang="pa">ਉੱਚ ਉਪਲੱਬਧਤਾ</name>
- <name xml:lang="pl">Wysoka dostępność</name>
- <name xml:lang="pt_BR">Alta disponibilidade</name>
- <name xml:lang="ru">Высокий уровень доступности</name>
- <name xml:lang="sv">Hög tillgänglighet</name>
- <name xml:lang="ta">அதிகம் கிடைக்கூடியது</name>
- <name xml:lang="te">అత్యధిక అందుబాటు</name>
- <name xml:lang="uk">Висока доступність</name>
- <name xml:lang="zh_CN">高可用性</name>
- <name xml:lang="zh_TW">高可用性</name>
- <description>Infrastructure for highly available services and/or shared storage.</description>
- <description xml:lang="as">অতিমাত্ৰাত উপলব্ধ সেৱা আৰু/বা যৌথ ব্যৱহাৰৰ সংৰক্ষণৰ বাবে আন্তঃগাথনী।</description>
- <description xml:lang="bn">অতিমাত্রায় উপলব্ধ পরিসেবা এবং/অথবা যৌথ ব্যবহারের সংগ্রহস্থলের জন্য পরিকাঠামো।</description>
- <description xml:lang="bn_IN">অতিমাত্রায় উপলব্ধ পরিসেবা এবং/অথবা যৌথ ব্যবহারের সংগ্রহস্থলের জন্য পরিকাঠামো।</description>
- <description xml:lang="cs">Infrastruktura pro sdílená úložiště a služby s vysokou dostupností.</description>
- <description xml:lang="de">Infrastruktur für Hochverfügbarkeitsdienste und/oder gemeinsame genutzter Storage.</description>
- <description xml:lang="es">Infraestructura para servicios altamente disponibles y/o almacenaje compartido.</description>
- <description xml:lang="fr">Infrastructure pour services de haute disponibilité et/ou stockage partagé.</description>
- <description xml:lang="gu">ટોચની ઉપલબ્ધ સેવાઓ અને/અથવા વહેંચાયેલ સંગ્રહ માટે ઇન્ફ્રાસ્ટ્રક્ચર.</description>
- <description xml:lang="hi">उच्च रूप से उपलब्ध सेवाओं और/या साझा भंडार के लिए आधारभूत ढाँचा.</description>
- <description xml:lang="it">Infrastruttura per servizi altamente disponibili e/o storage condiviso.</description>
- <description xml:lang="ja">High Availability サービスや共有ストレージのインフラストラクチャ</description>
- <description xml:lang="kn">ಅತಿಯಾಗಿ ಲಭ್ಯವಿರುವ ಸೇವೆಗಳು ಹಾಗು/ಅಥವ ಹಂಚಲಾದ ಶೇಖರಣೆಯ ಸಂಪನ್ಮೂಲ.</description>
- <description xml:lang="ko">고가용성 서비스 또는/그리고 공유 저장소를 위한 인프라스트럭쳐</description>
- <description xml:lang="ml">ഹൈ അവയിലബിളിറ്റി സര്‍വീസുകള്‍, പങ്കിടുന്ന സ്റ്റോറേജ് എന്നിവയ്ക്കുള്ള ഇന്‍ഫ്രാസ്ട്രക്ടര്‍.</description>
- <description xml:lang="mr">उच्च उपलब्ध सर्व्हिसेस् व/किंवा शेअर्ड स्टोरेजकरीता इंफ्रास्ट्रक्चर.</description>
- <description xml:lang="or">ଅଧିକ ମାତ୍ରାରେ ଉପଲବ୍ଧ ସର୍ଭିସଗୁଡ଼ିକ ପାଇଁ ଅବସଂରଚନା ଏବଂ/ଅଥବା ସହଭାଗୀ ଭଣ୍ଡାର।</description>
- <description xml:lang="pa">ਵੱਧ ਉਪਲੱਬਧ ਸੇਵਾਵਾਂ ਅਤੇ/ਜਾਂ ਸ਼ੇਅਰ ਸਟੋਰੇਜ਼ ਲਈ ਢਾਂਚਾ।</description>
- <description xml:lang="pl">Infrastruktura dla wysoko dostępnych usług i/lub współdzielonej pamięci masowej.</description>
- <description xml:lang="pt_BR">Infraestrutura para serviços altamente disponíveis e/ou armazenamento compartilhado.</description>
- <description xml:lang="ru">Инфраструктура служб с высоким уровнем доступа и общего хранилища.</description>
- <description xml:lang="sv">Infrastruktur för tjänster med hög tillgänglighet och/eller delad lagring.</description>
- <description xml:lang="ta">அதிகமாக கிடைக்கக்கூடிய சேவைகள் மற்றும்/அல்லது பகிரப்பட்ட சேமிபக்கதிற்கான உள்ளமைப்பு.</description>
- <description xml:lang="te">అధికంగా అందుబాటులోవున్న సేవలు మరియు/లేదా భాగస్వామ్య నిల్వ కొరకు అవస్థాపన.</description>
- <description xml:lang="uk">Інфраструктура служб з високим рівнем доступності та спільні сховища.</description>
- <description xml:lang="zh_CN">用于高度可用服务和(或者)共享存储的基础设施。</description>
- <description xml:lang="zh_TW">高可用性服務與/或共享儲存裝置的架構。</description>
- <default>true</default>
- <uservisible>false</uservisible>
- <packagelist>
- <packagereq type="mandatory">pacemaker</packagereq>
- <packagereq type="default">fence-agents-all</packagereq>
- <packagereq type="default">omping</packagereq>
- <packagereq type="default">pacemaker-doc</packagereq>
- <packagereq type="default">pcs</packagereq>
- <packagereq type="optional">booth-arbitrator</packagereq>
- <packagereq type="optional">booth-site</packagereq>
- <packagereq type="optional">sbd</packagereq>
- </packagelist>
- </group>
- <group>
- <id>hardware-monitoring</id>
- <name>Hardware Monitoring Utilities</name>
- <name xml:lang="as">হাৰ্ডৱেৰ পৰ্যবেক্ষণ সঁজুলিসমূহ</name>
- <name xml:lang="bn_IN">হার্ডওয়্যার নিরীক্ষণের সামগ্রী</name>
- <name xml:lang="cs">Nástroje pro sledování stavu hardware</name>
- <name xml:lang="de">Hardware Überwachungs-Dienstprogramme</name>
- <name xml:lang="es">Herramientas de monitorización de hardware</name>
- <name xml:lang="fr">Utilitaires de surveillance du matériel</name>
- <name xml:lang="gu">હાર્ડવેર મોનીટરીંગ ઉપયોગીતાઓ</name>
- <name xml:lang="hi">हार्डवेयर मॉनिटरिंग उपयोगिता</name>
- <name xml:lang="it">Utilità di monitoraggio hardware</name>
- <name xml:lang="ja">ハードウェアモニタリングユーティリティ</name>
- <name xml:lang="kn">ಯಂತ್ರಾಂಶ ಮೇಲ್ವಿಚಾರಣೆ ಸೌಲಭ್ಯಗಳು</name>
- <name xml:lang="ko">하드웨어 모니터링 유틸리티</name>
- <name xml:lang="ml">ഹാര്‍ഡ്‌വെയര്‍ നിരീക്ഷിയ്ക്കുന്നതിനുള്ള പ്രയോഗങ്ങള്‍</name>
- <name xml:lang="mr">हार्डवेअर मॉनिटरिंग युटिलिटिज</name>
- <name xml:lang="or">ହାର୍ଡୱେର ନିରୀକ୍ଷକ ଉପଯୋଗିତା</name>
- <name xml:lang="pa">ਹਾਰਡਵੇਅਰ ਤੇ ਨਜ਼ਰ ਰੱਖਣ ਵਾਲੀਆਂ ਯੂਟਿਲਟੀਆਂ</name>
- <name xml:lang="pl">Narzędzia do monitorowania sprzętu</name>
- <name xml:lang="pt_BR">Recursos de Monitoramento de Hardware</name>
- <name xml:lang="ru">Средства наблюдения за оборудованием</name>
- <name xml:lang="ta">வன்பொருள் கண்காணிப்புக் கருவிகள்</name>
- <name xml:lang="te">హార్డువేర్ పర్యవేక్షక సౌలభ్యాలు</name>
- <name xml:lang="uk">Програми для спостереження за обладнанням</name>
- <name xml:lang="zh_CN">硬件监控工具</name>
- <name xml:lang="zh_TW">硬體監控程式工具</name>
- <description>A set of tools to monitor server hardware.</description>
- <description xml:lang="as">চাৰ্ভাৰ হাৰ্ডৱাৰ পৰ্যবেক্ষন কৰিবলে সঁজুলিসমূহৰ এটা সংহতি।</description>
- <description xml:lang="bn_IN">সার্ভারের হার্ডওয়্যার নিরীক্ষণের জন্য ব্যবহৃত সরঞ্জামের সংকলন।</description>
- <description xml:lang="cs">Sada nástrojů pro sledování hardware serverů.</description>
- <description xml:lang="de">Eine Reihe von Tools zur Überwachung von Server-Hardware</description>
- <description xml:lang="es">Un set de herramientas para monitorizar hardware de servidor.</description>
- <description xml:lang="fr">Ensemble d'outils pour surveiller le matériel du serveur.</description>
- <description xml:lang="gu">સર્વર હાર્ડવેર મોનીટર કરવા માટેના સાધનોનો સમૂહ.</description>
- <description xml:lang="hi">सर्वर हार्डवेयर निरीक्षण के लिए औज़ारों का एक सेट</description>
- <description xml:lang="it">Un insieme di strumenti per il monitoraggio dell'hardware del server.</description>
- <description xml:lang="ja">サーバーハードウェアの監視用ツールセットです。</description>
- <description xml:lang="kn">ಪೂರೈಕೆಗಣಕದ ಯಂತ್ರಾಂಶವನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ನಡೆಸುವ ಉಪಕರಣಗಳು.</description>
- <description xml:lang="ko">서버 하드웨어를 모니터링 하기 위한 도구 모음</description>
- <description xml:lang="ml">സര്‍വര്‍ ഹാര്‍ഡ്‌വെയര്‍ നിരീക്ഷിയ്ക്കുന്നതിനുള്ള പ്രയോഗങ്ങള്‍.</description>
- <description xml:lang="mr">सर्व्हर हार्डवेअर नियंत्रीत करण्यासाठी साधनांचा संच.</description>
- <description xml:lang="or">ସର୍ଭର ହାର୍ଡୱେରକୁ ନିରୀକ୍ଷଣ କରିବା ପାଇଁ ସାଧାନଗୁଡ଼ିକର ଗୋଟିଏ ସେଟ.</description>
- <description xml:lang="pa">ਸਰਵਰ ਹਾਰਡਵੇਅਰ ਤੇ ਨਜ਼ਰ ਰੱਖਣ ਲਈ ਸੰਦਾਂ ਦਾ ਇੱਕ ਸਮੂਹ।</description>
- <description xml:lang="pl">Zestaw narzędzi do monitorowania sprzętu serwera.</description>
- <description xml:lang="pt_BR">Um conjunto de ferramentas para monitorar o hardware do servidor.</description>
- <description xml:lang="ru">Набор инструментов наблюдения за оборудованием сервера.</description>
- <description xml:lang="ta">சேவையக வன்பொருளைக் கண்காணிப்பதற்கான கருவிகளின் தொகுப்பு.</description>
- <description xml:lang="te">సేవిక హార్డువేర్ పర్యవేక్షించుటకు సాధనాల సమితి.</description>
- <description xml:lang="uk">Набір програм для спостереження за обладнанням сервера.</description>
- <description xml:lang="zh_CN">一组用来监控服务器硬件的工具。</description>
- <description xml:lang="zh_TW">用來監控伺服器硬體的一組工具。</description>
- <default>false</default>
- <uservisible>false</uservisible>
- <packagelist>
- <packagereq type="default">mcelog</packagereq>
- <packagereq type="default">rasdaemon</packagereq>
- <packagereq type="default">smartmontools</packagereq>
- <packagereq type="optional">edac-utils</packagereq>
- <packagereq type="optional">intel-cmt-cat</packagereq>
- <packagereq type="optional">lm_sensors</packagereq>
- </packagelist>
- </group>
- <group>
- <id>identity-management-server</id>
- <name>Identity Management Server</name>
- <name xml:lang="as">পৰিচয় ব্যৱস্থাপনা চাৰ্ভাৰ</name>
- <name xml:lang="bn_IN">আইডেন্টিটি ম্যানেজমেন্ট সার্ভার</name>
- <name xml:lang="cs">Server pro správu identit</name>
- <name xml:lang="de">Identitätsverwaltungs-Server</name>
- <name xml:lang="es">Servidor de admininistración de identidad</name>
- <name xml:lang="fr">Serveur de gestion des identités</name>
- <name xml:lang="gu">ઓળખ સંચાલન સર્વર</name>
- <name xml:lang="hi">पहचान प्रबंधन सर्वर</name>
- <name xml:lang="it">Server gestione identità</name>
- <name xml:lang="ja">識別管理サーバー</name>
- <name xml:lang="kn">ಗುರುತು ನಿರ್ವಹಣಾ ಪೂರೈಕೆಗಣಕಗಣಕ</name>
- <name xml:lang="ko">ID 관리 서버</name>
- <name xml:lang="ml">ഐഡന്റിറ്റി മാനേജ്മെന്റ് സര്‍വര്‍</name>
- <name xml:lang="mr">आइडेंटिटि मॅनेजमेंट सर्व्हर</name>
- <name xml:lang="or">ପରିଚୟ ପରିଚାଳନା ସର୍ଭର</name>
- <name xml:lang="pa">ਅਡੈਂਟਿਟੀ ਮੈਨੇਜਮੈਂਟ ਸਰਵਰ</name>
- <name xml:lang="pl">Serwer zarządzania tożsamością</name>
- <name xml:lang="pt_BR">Servidor de Gerenciamento de Identidade</name>
- <name xml:lang="ru">Сервер управления идентификацией</name>
- <name xml:lang="ta">அடையாள நிர்வாக சேவையகம்</name>
- <name xml:lang="te">గుర్తింపు నిర్వహణ సేవిక</name>
- <name xml:lang="uk">Сервер керування профілями</name>
- <name xml:lang="zh_CN">身份管理服务器</name>
- <name xml:lang="zh_TW">認證管理伺服器</name>
- <description>Centralized management of users, servers and authentication policies.</description>
- <description xml:lang="as">ব্যৱহাৰকাৰীসমূহ, চাৰ্ভাৰসমূহ আৰু প্ৰমাণীকৰণ নীতিসমূহৰ কেন্দ্ৰীয় ব্যৱস্থাপনা।</description>
- <description xml:lang="bn_IN">ব্যবহারকারী, সার্ভার ও অনুমোদনের নিয়মনীতির একটি কেন্দ্রীয় পরিচালন ব্যবস্থা।</description>
- <description xml:lang="cs">Centralizovaná správa uživatelů, serverů a pravidel pro autentizaci.</description>
- <description xml:lang="de">Zentralisierte Verwaltung von Benutzern, Servern und Authentifizierungsrichtlinien.</description>
- <description xml:lang="es">Administración centralizada de usuarios, servidores y políticas de autenticación.</description>
- <description xml:lang="fr">Gestion centralisée des utilisateurs, des serveurs et des politiques d'authentification.</description>
- <description xml:lang="gu">વપરાશકર્તાઓ, સર્વરો અને સત્તાધિકરણ પોલિસીનું કેન્દ્રિય સંચાલન.</description>
- <description xml:lang="hi">उपयोक्ता, सर्वर और सत्यापन नीतियों का केंद्रीकृत प्रबंधन.</description>
- <description xml:lang="it">Gestione centralizzata di utenti, server e politiche di autenticazione.</description>
- <description xml:lang="ja">ユーザー、サーバー、および認証ポリシーの中央管理を行います。</description>
- <description xml:lang="kn">ಬಳಕೆದಾರರು, ಪೂರೈಕೆಗಣಕಗಣಕಗಳು ಮತ್ತು ದೃಢೀಕರಣ ನೀತಿಗಳಿಗಾಗಿ ಕೇಂದ್ರೀಕೃತ ವ್ಯವಸ್ಥೆ.</description>
- <description xml:lang="ko">사용자, 서버, 인증 정책을 중앙 관리합니다.</description>
- <description xml:lang="ml">ഉപയോക്താക്കള്‍ക്കുള്ള സെന്‍ട്രലൈസ്ഡ് മാനേജ്മെന്റ്, സര്‍വറുകളും ആധികാരികത ഉറപ്പാക്കല്‍ പോളിസികളും.</description>
- <description xml:lang="mr">वापरकर्ते, सर्व्हर्स् व ओळखपटवण्याचे कराराचे केंद्रित व्यवस्थापन.</description>
- <description xml:lang="or">ବ୍ୟବହାରକାରୀ, ସର୍ଭର ଏବଂ ବୈଧିକରଣ ନିତୀଗୁଡ଼ିକର କେନ୍ଦ୍ରିୟ ପରିଚାଳନା।</description>
- <description xml:lang="pa">ਯੂਜ਼ਰਾਂ, ਸਰਵਰਾਂ ਅਤੇ ਪ੍ਰਮਾਣਿਕਤਾ ਪਾਲਿਸੀਆਂ ਦਾ ਕੇਂਦਰੀ ਪਰਬੰਧਨ।</description>
- <description xml:lang="pl">Centralne zarządzanie użytkownikami, serwerami i politykami uwierzytelniania.</description>
- <description xml:lang="pt_BR">Gerenciamento centralizado de usuários, servidores e políticas de autenticação.</description>
- <description xml:lang="ru">Централизованное управление пользователями, серверами и механизмами аутентификации.</description>
- <description xml:lang="ta">பயனர்கள், சேவையகங்கள் மற்றும் அங்கீகரிப்பு கொள்கைகளை நிர்வகிக்க மையமான வசதி.</description>
- <description xml:lang="te">వాడుకరుల, సేవికల మరియు ధృవీకరణ విధానాల యొక్క కేంద్రీకృత నిర్వహణ.</description>
- <description xml:lang="uk">Інструмент централізованого керування правилами роботи з користувачами, серверами та правилами розпізнавання.</description>
- <description xml:lang="zh_CN">用户、服务器和认证策略的集中管理。</description>
- <description xml:lang="zh_TW">中央式管理使用者、伺服器、以及授權政策。</description>
- <default>false</default>
- <uservisible>false</uservisible>
- <packagelist>
- <packagereq type="default">389-ds-base</packagereq>
- <packagereq type="default">ipa-admintools</packagereq>
- <packagereq type="default">ipa-server</packagereq>
- <packagereq type="default">pki-ca</packagereq>
- <packagereq type="optional">bind-pkcs11</packagereq>
- <packagereq type="optional">bind-pkcs11-utils</packagereq>
- <packagereq type="optional">ipa-server-dns</packagereq>
- <packagereq type="optional">ipa-server-trust-ad</packagereq>
- <packagereq type="optional">nuxwdog</packagereq>
- <packagereq type="optional">slapi-nis</packagereq>
- </packagelist>
- </group>
- <group>
- <id>infiniband</id>
- <name>Infiniband Support</name>
- <name xml:lang="as">Infiniband সমৰ্থন</name>
- <name xml:lang="bn">Infiniband সমর্থন ব্যবস্থা</name>
- <name xml:lang="bn_IN">Infiniband সমর্থন ব্যবস্থা</name>
- <name xml:lang="cs">Podpora pro Infiniband</name>
- <name xml:lang="de">Unterstützung für Infiniband</name>
- <name xml:lang="es">Soporte para Infiniband</name>
- <name xml:lang="fr">Prise en charge de l'Infiniband</name>
- <name xml:lang="gu">Infiniband આધાર</name>
- <name xml:lang="hi">Infiniband समर्थन</name>
- <name xml:lang="ia">Supporto de Infiniband</name>
- <name xml:lang="it">Supporto Infiniband</name>
- <name xml:lang="ja">Infiniband のサポート</name>
- <name xml:lang="kn">ಇನ್‌ಫಿನಿಬ್ಯಾಂಡ್ ಬೆಂಬಲ</name>
- <name xml:lang="ko">Infiniband 지원</name>
- <name xml:lang="ml">ഇന്‍ഫിനിബാന്‍ഡ് പിന്തുണ</name>
- <name xml:lang="mr">इंफिनिबँड समर्थन</name>
- <name xml:lang="or">ଇନଫିନିବ୍ୟାଣ୍ଡ ସହାୟତା</name>
- <name xml:lang="pa">ਇਨਫਿਨੀਬੈਂਡ ਸਮਰਥਨ</name>
- <name xml:lang="pl">Obsługa InfiniBand</name>
- <name xml:lang="pt_BR">Suporte para Infiniband</name>
- <name xml:lang="ru">Поддержка InfiniBand</name>
- <name xml:lang="sv">Stöd för infiniband</name>
- <name xml:lang="ta">இன்ஃபினிபேண்ட் ஆதரவு</name>
- <name xml:lang="te">ఇన్ఫిబాండ్ మద్దతు</name>
- <name xml:lang="uk">Підтримка Infiniband</name>
- <name xml:lang="zh_CN">Infiniband 支持</name>
- <name xml:lang="zh_TW">Infiniband 支援</name>
- <description>Software designed for supporting clustering and grid connectivity using RDMA-based InfiniBand and iWARP fabrics.</description>
- <description xml:lang="as">RDMA ভিত্তিয় InfiniBand আৰু iWARP ফেব্ৰিকসমূহ ব্যৱহৃত থুপ খোৱা আৰু গ্ৰিড সংযোগৰ বাবে ৰূপাংকিত চফ্টৱেৰ।</description>
- <description xml:lang="bn">RDMA-ভিত্তিক InfiniBand ও iWARP ফ্যাব্রিক প্রয়োগকারী ক্লাস্টার ও গ্রিড সংযোগ সমর্থনকারী সফ্টওয়্যার।</description>
- <description xml:lang="bn_IN">RDMA-ভিত্তিক InfiniBand ও iWARP ফ্যাব্রিক প্রয়োগকারী ক্লাস্টার ও গ্রিড সংযোগ সমর্থনকারী সফ্টওয়্যার।</description>
- <description xml:lang="cs">Software pro podporu clusterů a mřížkové topologie grid s využitím sítí InfiniBand a protokolů RDMA a iWARP.</description>
- <description xml:lang="de">Software, die zur Unterstützung von Clustering- und Grid-Konnektivität unter Verwedung von RDMA-basierten Infiniband- und iWARP-Fabrics konzipiert wurde.</description>
- <description xml:lang="es">Software diseñado para soportar agrupamiento y conectividad de rejilla mediante telas InfiniBand e iWARP basadas en RDMA.</description>
- <description xml:lang="fr">Logiciel conçu pour prendre en charge le clustering et la connectivité de grilles à l'aide d'un InfiniBand basé RDMA, et de fabriques iWARP.</description>
- <description xml:lang="gu">RDMA-based InfiniBand અને iWARP ફેબ્રિક ની મદદથી ક્લસ્ટરીંગ અને જાળી જોડાણને આધાર આપવા માટે સોફ્ટવેર રચાયેલ છે.</description>
- <description xml:lang="hi">क्लस्टरिंग और ग्रिड कनेक्टेविटी के समर्थन के लिए बना सॉफ्टवेयर जो RDMA-आधारित InfiniBand और iWARP फैब्रिक्स का उपयोग करता है.</description>
- <description xml:lang="ia">Software designate pro supportar connexiones in gruppamentos e grillas de systemas per le uso de InfiniBand in modo RDMA e fabricas iWARP.</description>
- <description xml:lang="it">Software creato per il supporto del clustering e della connettività grid utilizzando InfiniBand basato su RDMA e Fabrics iWARP.</description>
- <description xml:lang="ja">RDMA ベースの InfiniBand や iWARP ファブリックを使用してクラスタリングやグリッドの接続性を サポートするように設計されているソフトウェアです。</description>
- <description xml:lang="kn">RDMA-ಆಧರಿತವಾದ InfiniBand ಹಾಗು iWARP ಫ್ಯಾಬ್ರಿಕ್‌ಗಳನ್ನು ಬಳಸುವ ಕ್ಲಸ್ಟರಿಂಗ್ ಹಾಗು ಗ್ರಿಡ್ ಸಂಪರ್ಕವನ್ನು ಬೆಂಬಲಿಸುವ ತಂತ್ರಾಂಶ.</description>
- <description xml:lang="ko">RDMA기반 InfiniBand와 iWARP 패브릭을 사용하여 클러스터링과 그리드 연결을 지원하기 위해 설계된 소프트웨어</description>
- <description xml:lang="ml">RDMA-അടിസ്ഥാനത്തിലുള്ള InfiniBand, iWARP ഫാബ്രിക്സ് ഉപയോഗിച്ചു് ക്ലസ്റ്ററിങും ഗ്രിഡ് കണക്ടിവിറ്റിയും പിന്തുണയ്ക്കുന്നതിനുള്ള സോഫ്റ്റ്‌വെയര്‍.</description>
- <description xml:lang="mr">RDMA-आधारीत InfiniBand व iWARP फॅब्रिक्स्चा वापर करून, क्लस्टरिंग व ग्रीड कनक्टिविटी समर्थन पुरवण्यासाठी सॉफ्टवेअर.</description>
- <description xml:lang="or">RDMA-ଆଧାରିତ InfiniBand ଏବଂ iWARP ଫେବ୍ରିକ ବ୍ୟବାହର କରି କ୍ଲଷ୍ଟରିଙ୍ଗ ଏବଂ ଗ୍ରୀଡ଼ ସଂଯୋଜକତାକୁ ସମର୍ଥନ କରିବା ପାଇଁ ସଂରଚନା କରାଯାଇଥିବା ସଫ୍ଟୱେର।</description>
- <description xml:lang="pa">RDMA-ਅਧਾਰਿਤ InfiniBand ਅਤੇ iWARP ਫੈਬਰਿਕ ਵਰਤ ਕੇ ਕਲੱਸਟਰਿੰਗ ਸਹਿਯੋਗ ਅਤੇ ਗਰਿੱਡ ਕੁਨੈਕਟੀਵਿਟੀ ਲਈ ਬਣਾਇਆ ਸਾਫਟਵੇਅਰ।</description>
- <description xml:lang="pl">Oprogramowanie zaprojektowane do obsługiwania łączności klastrowej i gridów?? używając urządzeń InfiniBand oraz iWARP opartych na RDMA.</description>
- <description xml:lang="pt_BR">Software criado para suportar clustering e conectividade do grid usando o InfiniBand e iWARP fabrics baseado em RDMA.</description>
- <description xml:lang="ru">Программы для поддержки кластеризации и распределенных соединений с помощью коммутации InfiniBand и iWARP.</description>
- <description xml:lang="sv">Programvara gjord för att stödja klustring och nätverkskonnektivitet med RDMA-baserat InfiniBand och iWARP-vävar.</description>
- <description xml:lang="ta">RDMA-அடிப்படையிலான InfiniBand மற்றும் iWARP இழைகளைப் பயன்படுத்தும் கிளஸ்ட்டரிங் மற்றும் கிரிட் இணைப்புத் தன்மை ஆகியவற்றை ஆதரிக்கும் வகையில் வடிவமைக்கப்பட்ட மென்பொருள்.</description>
- <description xml:lang="te">RDMA-ఆధారిత InfiniBand మరియు iWARP ఫాబ్రిక్స్ వుపయోగించి క్లస్టరింగ్ మరియు గ్రిడ్ అనుసంధానతను మద్దతించుటకు రూపొందించబడిన సాఫ్టువేరు.</description>
- <description xml:lang="uk">Програмне забезпечення, розроблене для підтримки кластеризації та підтримання з’єднання у обчислювальних мережах за допомогою заснованих на віддаленому прямому доступі до пам’яті (RDMA) за допомогою шин InfiniBand і iWARP.</description>
- <description xml:lang="zh_CN">用来支持集群和使用 RDMA InfiniBand 和 iWARO 光纤的网状连接性的软件。</description>
- <description xml:lang="zh_TW">此軟體主要設計來透過使用基於 RDMA 的 InfiniBand 和 iWARP fabrics,以支援叢集和網格連線。</description>
- <default>false</default>
- <uservisible>false</uservisible>
- <packagelist>
- <packagereq type="mandatory">libibcm</packagereq>
- <packagereq type="mandatory">libibverbs</packagereq>
- <packagereq type="mandatory">libibverbs-utils</packagereq>
- <packagereq type="mandatory">librdmacm</packagereq>
- <packagereq type="mandatory">librdmacm-utils</packagereq>
- <packagereq type="conditional" requires="glusterfs">glusterfs-rdma</packagereq>
- <packagereq type="default">dapl</packagereq>
- <packagereq type="default">ibacm</packagereq>
- <packagereq type="default">ibutils</packagereq>
- <packagereq type="default">infiniband-diags</packagereq>
- <packagereq type="default">iwpmd</packagereq>
- <packagereq type="default">libcxgb3</packagereq>
- <packagereq type="default">libcxgb4</packagereq>
- <packagereq type="default">libhfi1</packagereq>
- <packagereq type="default">libi40iw</packagereq>
- <packagereq type="default">libibmad</packagereq>
- <packagereq type="default">libibumad</packagereq>
- <packagereq type="default">libipathverbs</packagereq>
- <packagereq type="default">libmlx4</packagereq>
- <packagereq type="default">libmlx5</packagereq>
- <packagereq type="default">libmthca</packagereq>
- <packagereq type="default">libnes</packagereq>
- <packagereq type="default">libocrdma</packagereq>
- <packagereq type="default">mstflint</packagereq>
- <packagereq type="default">opa-address-resolution</packagereq>
- <packagereq type="default">opa-fastfabric</packagereq>
- <packagereq type="default">perftest</packagereq>
- <packagereq type="default">qperf</packagereq>
- <packagereq type="default">rdma-ndd</packagereq>
- <packagereq type="default">srp_daemon</packagereq>
- <packagereq type="optional">compat-dapl</packagereq>
- <packagereq type="optional">compat-opensm-libs</packagereq>
- <packagereq type="optional">libibcommon</packagereq>
- <packagereq type="optional">libusnic_verbs</packagereq>
- <packagereq type="optional">libvma</packagereq>
- <packagereq type="optional">opensm</packagereq>
- <packagereq type="optional">rdma-core</packagereq>
- <packagereq type="optional">usnic-tools</packagereq>
- </packagelist>
- </group>
- <group>
- <id>input-methods</id>
- <name>Input Methods</name>
- <name xml:lang="ar">طرق الإدخال</name>
- <name xml:lang="as">ইনপুট পদ্ধতিসমূহ</name>
- <name xml:lang="bn">ইনপুট পদ্ধতি</name>
- <name xml:lang="bn_IN">ইনপুট পদ্ধতি</name>
- <name xml:lang="ca">Mètodes d'entrada</name>
- <name xml:lang="cs">Vstupní metody</name>
- <name xml:lang="da">Inddatametoder</name>
- <name xml:lang="de">Eingabemethoden</name>
- <name xml:lang="el">Μέθοδοι εισαγωγής</name>
- <name xml:lang="es">Métodos de Entrada</name>
- <name xml:lang="et">Sisendmeetodid</name>
- <name xml:lang="fi">Syöttömenetelmät</name>
- <name xml:lang="fr">Méthodes de saisie</name>
- <name xml:lang="gu">ઇનપુટ પદ્દતિઓ</name>
- <name xml:lang="he">שיטות קלט</name>
- <name xml:lang="hi">इनपुट विधि</name>
- <name xml:lang="hu">Bevitel eljárások</name>
- <name xml:lang="ia">Methodos de entrata</name>
- <name xml:lang="id">Metoda Input</name>
- <name xml:lang="is">Innsetningaraðferðir</name>
- <name xml:lang="it">Metodi di input</name>
- <name xml:lang="ja">入力メソッド</name>
- <name xml:lang="kn">ಇನ್‌ಪುಟ್ ವಿಧಾನಗಳು</name>
- <name xml:lang="ko">입력 방식</name>
- <name xml:lang="lv">Ievades metodes</name>
- <name xml:lang="mai">इनपुट पद्धति</name>
- <name xml:lang="ml">ഇന്‍പുട്ട് രീതികള്‍</name>
- <name xml:lang="mr">इंपुट पध्दती</name>
- <name xml:lang="nb">Inndatametoder</name>
- <name xml:lang="nl">Invoermethoden</name>
- <name xml:lang="or">ନିବେଶ ପଦ୍ଧତି</name>
- <name xml:lang="pa">ਇੰਪੁੰਟ ਢੰਗ</name>
- <name xml:lang="pl">Metody wprowadzania</name>
- <name xml:lang="pt">Métodos de Introdução de Dados</name>
- <name xml:lang="pt_BR">Métodos de Inserção</name>
- <name xml:lang="ru">Методы ввода</name>
- <name xml:lang="sk">Metódy vstupu</name>
- <name xml:lang="sr">Методе уноса</name>
- <name xml:lang="sr@latin">Metode unosa</name>
- <name xml:lang="sr@Latn">Metode unosa</name>
- <name xml:lang="sv">Inmatningsmetoder</name>
- <name xml:lang="ta">உள்ளீடு முறைகள்</name>
- <name xml:lang="te">ఎగుబడి పద్దతులు</name>
- <name xml:lang="tg">Услубҳои воридотӣ</name>
- <name xml:lang="th">วิธีป้อนข้อความ</name>
- <name xml:lang="uk">Методи вводу</name>
- <name xml:lang="zh_CN">输入法</name>
- <name xml:lang="zh_TW">輸入法</name>
- <description>Software for the input of international text.</description>
- <description xml:lang="as">বিভিন্ন আন্তৰ্জাতিক ভাষাত লিখাৰ বাবে প্ৰয়োজনীয় চফ্টৱেৰ।</description>
- <description xml:lang="bn">বিভিন্ন আন্তর্জাতিক ভাষায় লেখার জন্য প্রয়োজনীয় সফ্টওয়্যার।</description>
- <description xml:lang="bn_IN">বিভিন্ন আন্তর্জাতিক ভাষায় লেখার জন্য প্রয়োজনীয় সফ্টওয়্যার।</description>
- <description xml:lang="cs">Vstupní metody pro podporu exotických jazyků s obrázkovým písmem (např. japonština, korejština, čínština).</description>
- <description xml:lang="de">Software zur Eingabe von internationalem Text.</description>
- <description xml:lang="es">Paquetes de métodos de entrada de texto internacional.</description>
- <description xml:lang="fr">Logiciel pour la saisie de texte international.</description>
- <description xml:lang="gu">આંતરરાષ્ટ્રીય લખાણનાં ઇનપુટ માટે સોફ્ટવેર.</description>
- <description xml:lang="hi">अंतरराष्ट्रीय पाठ की इनपुट के लिए सॉफ्टवेयर.</description>
- <description xml:lang="ia">Software pro le entrata de texto international.</description>
- <description xml:lang="it">Software per l'inserimento di testo internazionale.</description>
- <description xml:lang="ja">国際的なテキストを入力するためのソフトウェアです。</description>
- <description xml:lang="kn">ಅಂತರಾಷ್ಟ್ರೀಯ ಪಠ್ಯವನ್ನು ನಮೂದಿಸಲು ಬಳಸಲಾಗುವ ಇನ್‌ಪುಟ್ ತಂತ್ರಾಂಶ.</description>
- <description xml:lang="ko">다국어 텍스트 입력을 위한 소프트웨어.</description>
- <description xml:lang="ml">ഇന്റര്‍ണാഷണല്‍ ടെക്സ്റ്റ് ഇന്‍പുട്ടിനുള്ള സോഫ്റ്റ്‌വെയര്‍.</description>
- <description xml:lang="mr">अंतरराष्ट्रीय मजकूरच्या इंपुट करीता सॉफ्टवेअर.</description>
- <description xml:lang="or">ଆନ୍ତର୍ଜାତିକ ପାଠ୍ୟର ନିବେଶ ପାଇଁ ସଫ୍ଟୱେର।</description>
- <description xml:lang="pa">ਇੰਟਰਨੈਸ਼ਨਲ ਟੈਕਸਟ ਦੀ ਇੱਪੁੱਟ ਲਈ ਸਾਫਟਵੇਅਰ।</description>
- <description xml:lang="pl">Oprogramowanie do wpisywania międzynarodowego tekstu.</description>
- <description xml:lang="pt_BR">Software para inserção de texto internacional.</description>
- <description xml:lang="ru">Программы для набора текста на различных языках.</description>
- <description xml:lang="sv">Programvara för inmatning av internationell text.</description>
- <description xml:lang="ta">உலகளாவிய உரையின் உள்ளீட்டிற்கான மென்பொருள்.</description>
- <description xml:lang="te">అంతర్జాతీయ పాఠము యొక్క యిన్పుట్ కొరకు సాఫ్టువేరు.</description>
- <description xml:lang="uk">Програми для введення тексту різними мовами.</description>
- <description xml:lang="zh_CN">输入国际文本的软件。</description>
- <description xml:lang="zh_TW">用來輸入國際文字的軟體。</description>
- <default>false</default>
- <uservisible>false</uservisible>
- <packagelist>
- <packagereq type="conditional" requires="gtk2">gtk2-immodule-xim</packagereq>
- <packagereq type="conditional" requires="gtk3">gtk3-immodule-xim</packagereq>
- <packagereq type="conditional" requires="gtk2">ibus-gtk2</packagereq>
- <packagereq type="conditional" requires="gtk3">ibus-gtk3</packagereq>
- <packagereq type="conditional" requires="qt">ibus-qt</packagereq>
- <packagereq type="conditional" requires="gnome-session">imsettings-gsettings</packagereq>
- <packagereq type="conditional" requires="qt">imsettings-qt</packagereq>
- <packagereq type="default">ibus-chewing</packagereq>
- <packagereq type="default">ibus-hangul</packagereq>
- <packagereq type="default">ibus-kkc</packagereq>
- <packagereq type="default">ibus-libpinyin</packagereq>
- <packagereq type="default">ibus-m17n</packagereq>
- <packagereq type="default">ibus-rawcode</packagereq>
- <packagereq type="default">ibus-sayura</packagereq>
- <packagereq type="default">ibus-table</packagereq>
- <packagereq type="default">ibus-table-chinese</packagereq>
- <packagereq type="default">m17n-contrib</packagereq>
- <packagereq type="default">m17n-db</packagereq>
- <packagereq type="optional">ibus-typing-booster</packagereq>
- <packagereq type="optional">iok</packagereq>
- </packagelist>
- </group>
- <group>
- <id>internet-applications</id>
- <name>Internet Applications</name>
- <name xml:lang="as">ইন্টাৰনেট এপ্লিকেচনসমূহ</name>
- <name xml:lang="bn">ইন্টারনেট অ্যাপ্লিকেশন</name>
- <name xml:lang="bn_IN">ইন্টারনেট অ্যাপ্লিকেশন</name>
- <name xml:lang="cs">Internetové aplikace</name>
- <name xml:lang="de">Internet-Anwendungen</name>
- <name xml:lang="es">Aplicaciones de Internet</name>
- <name xml:lang="fr">Applications internet</name>
- <name xml:lang="gu">ઇન્ટરનેટ કાર્યક્રમો</name>
- <name xml:lang="hi">इंटरनेट अनुप्रयोग</name>
- <name xml:lang="ia">Applicationes de Rete</name>
- <name xml:lang="it">Applicazioni internet</name>
- <name xml:lang="ja">インターネットアプリケーション</name>
- <name xml:lang="kn">ಅಂತರಜಾಲ ಅನ್ವಯಗಳು</name>
- <name xml:lang="ko">인터넷 프로그램</name>
- <name xml:lang="ml">ഇന്റര്‍നെറ്റ് പ്രയോഗങ്ങള്‍</name>
- <name xml:lang="mr">ऍप्लिकेशन्स्</name>
- <name xml:lang="or">ଇଣ୍ଟରନେଟ ପ୍ରୟୋଗଗୁଡ଼ିକ</name>
- <name xml:lang="pa">ਇੰਟਰਨੈੱਟ ਐਪਲੀਕੇਸ਼ਨਾਂ</name>
- <name xml:lang="pl">Aplikacje internetowe</name>
- <name xml:lang="pt_BR">Aplicações de Internet</name>
- <name xml:lang="ru">Приложения Интернета</name>
- <name xml:lang="sv">Internetprogram</name>
- <name xml:lang="ta">இணையத்தள பயன்பாடுகள்</name>
- <name xml:lang="te">ఇంటర్నెట్ అనువర్తనములు</name>
- <name xml:lang="uk">Інтернет-програми</name>
- <name xml:lang="zh_CN">互联网应用程序</name>
- <name xml:lang="zh_TW">網際網路應用程式</name>
- <description>Email, chat, and video conferencing software.</description>
- <description xml:lang="as">ই-মেইল, চেট আৰু ভিডিঅ' সন্মিলনী চফ্টৱেৰ।</description>
- <description xml:lang="bn">ই-মেইল, আলাপন ও ভিডিও কনফারেন্স সম্বন্ধীয় সফ্টওয়্যার।</description>
- <description xml:lang="bn_IN">ই-মেইল, আলাপন ও ভিডিও কনফারেন্স সম্বন্ধীয় সফ্টওয়্যার।</description>
- <description xml:lang="cs">Aplikace pro provoz e-mailu, chatu a videokonferencí.</description>
- <description xml:lang="de">E-Mail, Chat und Videokonferenz-Software.</description>
- <description xml:lang="es">Software de correo-e, chat, y vídeo conferencias.</description>
- <description xml:lang="fr">Messagerie électronique, messagerie instantanée, et logiciel de vidéoconférence.</description>
- <description xml:lang="gu">ઇમેલ, ચેટ, અને વિડિયો કૉન્ફરન્સીંગ સોફ્ટવેર.</description>
- <description xml:lang="hi">ईमेल, चैट, और वीडियो सम्मेलन सॉफ्टवेयर.</description>
- <description xml:lang="ia">Software de e-posta, chat e video-conferentia.</description>
- <description xml:lang="it">Software per conferenza video, email e chat.</description>
- <description xml:lang="ja">電子メール、チャット、ビデオ会議のソフトウェアです。</description>
- <description xml:lang="kn">ಇಮೈಲ್, ಮಾತುಕತೆ, ಹಾಗು ವೀಡಿಯೊ ಸಮ್ಮೇಳನಕ್ಕೆ ನೆರವಾಗುವ ತಂತ್ರಾಂಶ.</description>
- <description xml:lang="ko">이메일, 채팅, 화상회의 소프트웨어.</description>
- <description xml:lang="ml">ഈമെയില്‍, ചാറ്റ്, വീഡിയോ കോണ്‍ഫറന്‍സിങ് എന്നിവയ്ക്കുള്ള സോഫ്റ്റ്‌വെയര്‍.</description>
- <description xml:lang="mr">ईमेल, चॅट, व व्हिडीओ कॉन्फरेंसिंग सॉफ्टवेअर.</description>
- <description xml:lang="or">ଇମେଲ, ଚାର୍ଟ, ଏବଂ ଭିଡିଓ ସମ୍ମେଳନ ସଫ୍ଟୱେର।</description>
- <description xml:lang="pa">ਈਮੇਲ, ਚੈਟ, ਅਤੇ ਵੀਡੀਓ ਕਾਨਫਰੰਸ ਸਾਫਟਵੇਅਰ।</description>
- <description xml:lang="pl">Oprogramowanie do obsługi poczty, komunikatorów i wideokonferencji.</description>
- <description xml:lang="pt_BR">Software email, babe-papo e vídeo-conferência.</description>
- <description xml:lang="ru">Программы электронной почты, обмена сообщениями и видеоконференций.</description>
- <description xml:lang="sv">Epost-, chatt- och videokonferensprogram.</description>
- <description xml:lang="ta">மின்னஞ்சல், அரட்டை, மற்றும் வீடியோ கலந்துரையாடல் மென்பொருள்.</description>
- <description xml:lang="te">ఈమెయిల్, చాట్, మరియు వీడియో కాన్ఫరెన్సింగ్ సాఫ్టువేర్.</description>
- <description xml:lang="uk">Програми для обміну електронною поштою, спілкування та проведення відеоконференцій.</description>
- <description xml:lang="zh_CN">电子邮件、聊天和视频会议软件。</description>
- <description xml:lang="zh_TW">郵件、聊天,以及視訊通話的軟體。</description>
- <default>false</default>
- <uservisible>false</uservisible>
- <packagelist>
- <packagereq type="default">ekiga</packagereq>
- <packagereq type="default">empathy</packagereq>
- <packagereq type="default">evolution</packagereq>
- <packagereq type="default">evolution-ews</packagereq>
- <packagereq type="default">evolution-help</packagereq>
- <packagereq type="default">evolution-mapi</packagereq>
- <packagereq type="optional">pidgin</packagereq>
- <packagereq type="optional">pidgin-sipe</packagereq>
- <packagereq type="optional">thunderbird</packagereq>
- <packagereq type="optional">xchat</packagereq>
- </packagelist>
- </group>
- <group>
- <id>internet-browser</id>
- <name>Internet Browser</name>
- <name xml:lang="as">ইন্টাৰনেট ব্ৰাউছাৰ</name>
- <name xml:lang="bn">ইন্টারনেট ব্রাউজার</name>
- <name xml:lang="bn_IN">ইন্টারনেট ব্রাউজার</name>
- <name xml:lang="cs">Prohlížeč internetu</name>
- <name xml:lang="de">Internet-Browser</name>
- <name xml:lang="es">Navegador de Internet</name>
- <name xml:lang="fr">Navigateur Internet</name>
- <name xml:lang="gu">ઇન્ટરનેટ બ્રાઉઝર</name>
- <name xml:lang="hi">इंटरनेट ब्राउज़र</name>
- <name xml:lang="ia">Navigator de Rete</name>
- <name xml:lang="it">Internet Browser</name>
- <name xml:lang="ja">インターネットブラウザ</name>
- <name xml:lang="kn">ಅಂತರಜಾಲ ವೀಕ್ಷಕ</name>
- <name xml:lang="ko">인터넷 브라우저</name>
- <name xml:lang="ml">ഇന്റര്‍നെറ്റ് ബ്രൌസര്‍</name>
- <name xml:lang="mr">इंटरनेट ब्राऊजर</name>
- <name xml:lang="or">ଇଣ୍ଟରନେଟ ବ୍ରାଉଜର</name>
- <name xml:lang="pa">ਇੰਟਰਨੈੱਟ ਬਰਾਊਜ਼ਿੰਗ</name>
- <name xml:lang="pl">Przeglądarka internetowa</name>
- <name xml:lang="pt_BR">Navegador de Internet</name>
- <name xml:lang="ru">Интернет-браузер</name>
- <name xml:lang="sv">Internetbläddrare</name>
- <name xml:lang="ta">இணைய உலாவி</name>
- <name xml:lang="te">ఇంటర్నెట్ బ్రౌజర్</name>
- <name xml:lang="uk">Програма для перегляду інтернету</name>
- <name xml:lang="zh_CN">互联网浏览器</name>
- <name xml:lang="zh_TW">網路瀏覽器</name>
- <description>Firefox web browser.</description>
- <description xml:lang="as">Firefox ৱেব ব্ৰাউছাৰ।</description>
- <description xml:lang="bn_IN">Firefox ওয়েব-ব্রাউজার।</description>
- <description xml:lang="cs">Webový prohlížeč Firefox.</description>
- <description xml:lang="de">Firefox Web-Browser.</description>
- <description xml:lang="es">Navegador web de Firefox</description>
- <description xml:lang="fr">Navigateur web Firefox.</description>
- <description xml:lang="gu">Firefox વેબ બ્રાઉઝર.</description>
- <description xml:lang="hi">फ़ायरफ़ॉक्स वेब ब्राउज़र</description>
- <description xml:lang="it">Web browser Firefox.</description>
- <description xml:lang="ja">Firefox web ブラウザです。</description>
- <description xml:lang="kn">ಫೈರ್ಫಾಕ್ಸ್ ಜಾಲ ವೀಕ್ಷಕ.</description>
- <description xml:lang="ko">Firefox 웹브라우저</description>
- <description xml:lang="ml">ഫയര്‍ഫോക്സ് വെബ് ബ്രൌസര്‍.</description>
- <description xml:lang="mr">Firefox वेब ब्राउजर.</description>
- <description xml:lang="or">Firefox ୱେବ ବ୍ରାଉଜର।</description>
- <description xml:lang="pa">ਫਾਇਰਫਾਕਸ ਵੈੱਬ ਸਰਵਰ।</description>
- <description xml:lang="pl">Przeglądarka WWW Firefox.</description>
- <description xml:lang="pt_BR">Firefox web browser</description>
- <description xml:lang="ru">Браузер Firefox</description>
- <description xml:lang="ta">Firefox வலை உலாவி.</description>
- <description xml:lang="te">ఫైర్‌ఫాక్స్ వెబ్‌బ్రౌజర్.</description>
- <description xml:lang="uk">Браузер Firefox.</description>
- <description xml:lang="zh_CN">Firefox 网页浏览器。</description>
- <description xml:lang="zh_TW">Firefox 網站瀏覽器。</description>
- <default>false</default>
- <uservisible>false</uservisible>
- <packagelist>
- <packagereq type="default">firefox</packagereq>
- <packagereq type="default">icedtea-web</packagereq>
- </packagelist>
- </group>
- <group>
- <id>java-platform</id>
- <name>Java Platform</name>
- <name xml:lang="as">Java প্লেটফৰ্ম</name>
- <name xml:lang="bn">Java প্ল্যাটফর্ম</name>
- <name xml:lang="bn_IN">Java প্ল্যাটফর্ম</name>
- <name xml:lang="cs">Prostředí pro Javu</name>
- <name xml:lang="de">Java-Plattform</name>
- <name xml:lang="es">Plataforma de Java</name>
- <name xml:lang="fr">Plateforme Java</name>
- <name xml:lang="gu">Java પ્લેટફોર્મ</name>
- <name xml:lang="hi">जावा प्लैटफॉर्म</name>
- <name xml:lang="ia">Platteforma Java</name>
- <name xml:lang="it">Piattaforma Java</name>
- <name xml:lang="ja">Java プラットフォーム</name>
- <name xml:lang="kn">ಜಾವಾ ಪ್ಲಾಟ್‌ಫಾರ್ಮ್</name>
- <name xml:lang="ko">자바 플랫폼</name>
- <name xml:lang="ml">ജാവാ പ്ലാറ്റ്ഫോം</name>
- <name xml:lang="mr">Java प्लॅटफॉर्म</name>
- <name xml:lang="or">Java ପ୍ଲାଟଫର୍ମ</name>
- <name xml:lang="pa">ਜਾਵਾ ਪਲੇਟਫਾਰਮ</name>
- <name xml:lang="pl">Platforma Java</name>
- <name xml:lang="pt_BR">Plataforma Java</name>
- <name xml:lang="ru">Java</name>
- <name xml:lang="sv">Javaplattform</name>
- <name xml:lang="ta">ஜாவா ஃப்ளாட்பார்ம்</name>
- <name xml:lang="te">జావా ప్లాట్‌ఫాం</name>
- <name xml:lang="uk">Платформа Java</name>
- <name xml:lang="zh_CN">Java 平台</name>
- <name xml:lang="zh_TW">Java 平台</name>
- <description>Java support for the CentOS Linux Server and Desktop Platforms.</description>
- <description xml:lang="as">CentOS Linux Server আৰু Desktop Platform ৰ বাবে Java সমৰ্থন।</description>
- <description xml:lang="bn">CentOS Linux Server ও Desktop Platform-র জন্য Java সমর্থন।</description>
- <description xml:lang="bn_IN">CentOS Linux Server ও Desktop Platform-র জন্য Java সমর্থন।</description>
- <description xml:lang="cs">Podpora pro Javu na platformách CentOS Linux Server a Desktop.</description>
- <description xml:lang="de">Java-Unterstützung für die CentOS Linux- und Desktop-Plattformen.</description>
- <description xml:lang="es">Soporte de Java para Servidor de CentOS Linux y plataformas de escritorio.</description>
- <description xml:lang="fr">Prise en charge Java pour les plateformes serveur et bureau de CentOS Linux.</description>
- <description xml:lang="gu">CentOS Linux સર્વર અને ડેસ્કટોપ પ્લેટફોર્મ માટે Java આધાર.</description>
- <description xml:lang="hi">CentOS Linux Server और Desktop प्लैटफॉर्म के लिए जावा स्क्रिप्ट.</description>
- <description xml:lang="it">Supporto Java per piattaforme desktop e CentOS Linux Server.</description>
- <description xml:lang="ja">CentOS Linux Server Platform と Desktop Platform の Java サポート</description>
- <description xml:lang="kn">CentOS Linux ಪೂರೈಕೆಗಣಕ ಹಾಗು ಗಣಕತೆರೆ ಪ್ಲಾಟ್‌ಫಾರ್ಮುಗಳಿಗಾಗಿನ Java ಬೆಂಬಲ.</description>
- <description xml:lang="ko">CentOS Linux 서버와 데스크탑 플랫폼을 위한 자바 지원</description>
- <description xml:lang="ml">CentOS Linux സര്‍വര്‍, ഡസ്ക്ടോപ്പ് പ്ലാറ്റ്ഫോമുകള്‍ക്കുള്ള ജാവാ പിന്തുണ.</description>
- <description xml:lang="mr">CentOS Linux Server व Desktop Platforms करीता Java समर्थन.</description>
- <description xml:lang="or">CentOS Linux ସର୍ଭର ଏବଂ Desktop ପ୍ଲାଟଫର୍ମଗୁଡ଼ିକ ପାଇଁ Java ସମର୍ଥନ।</description>
- <description xml:lang="pa">CentOS Linux ਸਰਵਰ ਅਤੇ ਡੈਸਕਟਾਪ ਪਲੇਟਫਾਰਮ ਲਈ ਜਾਵਾ ਸਮਰਥਨ।</description>
- <description xml:lang="pl">Obsługa języka Java dla platformy serwerowej i pulpitu systemu CentOS Linux.</description>
- <description xml:lang="pt_BR">Suporte Java para o Servidor CentOS Linux e Plataformas de Desktop.</description>
- <description xml:lang="ru">Поддержка Java для CentOS Linux Server и Desktop.</description>
- <description xml:lang="sv">Javastöd för CentOS Linux server- och skrivbordsplattformar.</description>
- <description xml:lang="ta">CentOS Linux சேவையகம் மற்றும் பணிமேடை ஃப்ளாட்பார்மிற்கான ஜாவா ஆதரவு.</description>
- <description xml:lang="te">CentOS Linux సర్వర్ మరియు డెస్కుటాప్ ప్లాట్‌ఫాంల కొరకు జావా మద్దతు.</description>
- <description xml:lang="uk">Підтримка Java для CentOS Linux Server та Desktop.</description>
- <description xml:lang="zh_CN">红帽企业版 Linux 服务器和桌面平台的 Java 支持。</description>
- <description xml:lang="zh_TW">CentOS Linux Server 和 Desktop Platforms 的 Java 支援。</description>
- <default>false</default>
- <uservisible>false</uservisible>
- <packagelist>
- <packagereq type="mandatory">java-1.7.0-openjdk</packagereq>
- <packagereq type="optional">java-1.6.0-openjdk</packagereq>
- <packagereq type="optional">java-1.8.0-openjdk</packagereq>
- <packagereq type="optional">system-switch-java</packagereq>
- </packagelist>
- </group>
- <group>
- <id>kde-apps</id>
- <name>KDE Applications</name>
- <name xml:lang="as">KDE এপ্লিকেচনসমূহ</name>
- <name xml:lang="bn_IN">KDE অ্যাপ্লিকেশন</name>
- <name xml:lang="cs">Aplikace pro KDE</name>
- <name xml:lang="de">KDE-Anwendungen</name>
- <name xml:lang="es">Aplicaciones KDE</name>
- <name xml:lang="fr">Applications KDE</name>
- <name xml:lang="gu">KDE કાર્યક્રમો</name>
- <name xml:lang="hi">केडीई अनुप्रयोग</name>
- <name xml:lang="it">Applicazioni KDE</name>
- <name xml:lang="ja">KDE アプリケーション</name>
- <name xml:lang="kn">KDE ಅನ್ವಯಗಳು</name>
- <name xml:lang="ko">KDE 애플리케이션</name>
- <name xml:lang="ml">കെഡിഇ പ്രയോഗങ്ങള്‍</name>
- <name xml:lang="mr">KDE ॲप्लिकेशन्स</name>
- <name xml:lang="or">KDE ପ୍ରୟୋଗ</name>
- <name xml:lang="pa">KDE ਐਪਲੀਕੇਸ਼ਨਾਂ</name>
- <name xml:lang="pl">Aplikacje KDE</name>
- <name xml:lang="pt_BR">Aplicativos de KDE</name>
- <name xml:lang="ru">Приложения KDE</name>
- <name xml:lang="ta">KDE பயன்பாடுகள்</name>
- <name xml:lang="te">KDE అనువర్తనాలు</name>
- <name xml:lang="uk">Програми KDE</name>
- <name xml:lang="zh_CN">KDE 应用程序</name>
- <name xml:lang="zh_TW">KDE 應用程式</name>
- <description>A set of commonly used KDE Applications.</description>
- <description xml:lang="cs">Sada běžně používaných aplikací v prostředí KDE.</description>
- <description xml:lang="de">Eine Reihe häufig verwendeter KDE-Anwendungen.</description>
- <description xml:lang="es">Un set de las aplicaciones KDE más utilizadas.</description>
- <description xml:lang="fr">Ensemble d'applications KDE couramment utilisées.</description>
- <description xml:lang="gu">સામાન્ય રીતે વપરાતા KDE કાર્યક્રમોનો સમૂહ.</description>
- <description xml:lang="hi">बारंबार प्रयुक्त केडीई अनुप्रयोग.</description>
- <description xml:lang="it">Un set di applicazioni KDE usate frequentemente.</description>
- <description xml:lang="ja">よく使用する KDE アプリケーションセットです。</description>
- <description xml:lang="kn">ಸಾಮಾನ್ಯವಾಗಿ ಬಳಸಲಾಗುವ KDE ಅನ್ವಯಗಳ ಒಂದು ಸಂಗ್ರಹ.</description>
- <description xml:lang="ko">자주 사용하는 KDE 애플리케이션 모음입니다.</description>
- <description xml:lang="ml">സാധാരണമായി എപ്പോഴും ഉപയോഗിയ്ക്കുന്ന കെഡിഇ പ്രയോഗങ്ങള്‍.</description>
- <description xml:lang="mr">वारंवार वापरले जाणाऱ्या KDE ॲप्लिकेशन्स्चा संच.</description>
- <description xml:lang="or">ସାଧାରଣ ଭାବରେ ବ୍ୟବହୃତ KDE ପ୍ରୟୋଗଗୁଡ଼ିକର ଏକ ସେଟ।</description>
- <description xml:lang="pa">ਆਮ ਤੌਰ ਤੇ ਵਰਤੀਆਂ ਜਾਂਦੀਆਂ KDE ਐਪਲੀਕੇਸ਼ਨਾਂ ਦਾ ਇੱਕ ਸਮੂਹ।</description>
- <description xml:lang="pl">Zestaw często używanych aplikacji środowiska KDE.</description>
- <description xml:lang="pt_BR">Um conjunto de aplicativos do KDE mais utilizados.</description>
- <description xml:lang="ru">Набор популярных приложений KDE.</description>
- <description xml:lang="ta">பொதுவாகப் பயன்படுத்தப்படும் KDE பயன்பாடுகளின் தொகுப்பு.</description>
- <description xml:lang="te">ఉమ్మడిగా ఉపయోగించే KDE అనువర్తనాల సమితి.</description>
- <description xml:lang="uk">Набір типових програм KDE.</description>
- <description xml:lang="zh_CN">一组经常使用的 KDE 应用程序。</description>
- <description xml:lang="zh_TW">一組常用的 KDE 應用程式。</description>
- <default>false</default>
- <uservisible>false</uservisible>
- <packagelist>
- <packagereq type="mandatory">kcoloredit</packagereq>
- <packagereq type="mandatory">kdeartwork-screensavers</packagereq>
- <packagereq type="mandatory">kdenetwork-krdc</packagereq>
- <packagereq type="mandatory">kdenetwork-krfb</packagereq>
- <packagereq type="mandatory">kiconedit</packagereq>
- <packagereq type="mandatory">kolourpaint</packagereq>
- </packagelist>
- </group>
- <group>
- <id>kde-desktop</id>
- <name>KDE</name>
- <name xml:lang="af">KDE</name>
- <name x