From 333104df791ca3932a6bef6a1be0c29f47d0bc01 Mon Sep 17 00:00:00 2001 From: OpenStack Proposal Bot Date: Wed, 30 Mar 2016 06:27:12 +0000 Subject: [PATCH 01/14] Imported Translations from Zanata For more information about this automatic import see: https://wiki.openstack.org/wiki/Translations/Infrastructure Change-Id: Ifa2e9b27ef86f18b0d45fd6d49f1ccdc0ea6ba6c --- .../locale/de/LC_MESSAGES/ceilometer.po | 11 ++- .../locale/fr/LC_MESSAGES/ceilometer.po | 14 ++- .../locale/ko_KR/LC_MESSAGES/ceilometer.po | 98 ++++++++++++++++++- 3 files changed, 112 insertions(+), 11 deletions(-) diff --git a/ceilometer/locale/de/LC_MESSAGES/ceilometer.po b/ceilometer/locale/de/LC_MESSAGES/ceilometer.po index 7fe010bf48..4e9d3a2008 100644 --- a/ceilometer/locale/de/LC_MESSAGES/ceilometer.po +++ b/ceilometer/locale/de/LC_MESSAGES/ceilometer.po @@ -12,13 +12,13 @@ # Tom Cocozzello , 2016. #zanata msgid "" msgstr "" -"Project-Id-Version: ceilometer 6.0.0.0b4.dev50\n" +"Project-Id-Version: ceilometer 6.0.0.0rc3.dev2\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-03-19 00:57+0000\n" +"POT-Creation-Date: 2016-03-30 00:07+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2016-03-14 08:40+0000\n" +"PO-Revision-Date: 2016-03-29 07:52+0000\n" "Last-Translator: Monika Wolf \n" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -490,6 +490,11 @@ msgstr "XenAPI nicht installiert" msgid "YAML error reading Definitions file %(file)s" msgstr "YAML-Fehler beim Lesen von Definitionsdatei %(file)s." +msgid "alarms URLs is unavailable when Aodh is disabled or unavailable." +msgstr "" +"Alarm-URLs sind nicht verfügbar, wenn Aodh inaktiviert oder nicht verfügbar " +"ist." + #, python-format msgid "could not get CPU time for %(id)s: %(e)s" msgstr "Abruf von CPU-Zeit nicht möglich für %(id)s: %(e)s" diff --git a/ceilometer/locale/fr/LC_MESSAGES/ceilometer.po b/ceilometer/locale/fr/LC_MESSAGES/ceilometer.po index e4e65de9b0..74cc8bf0dd 100644 --- a/ceilometer/locale/fr/LC_MESSAGES/ceilometer.po +++ b/ceilometer/locale/fr/LC_MESSAGES/ceilometer.po @@ -23,18 +23,19 @@ # Corinne Verheyde , 2013 # OpenStack Infra , 2015. #zanata # Tom Cocozzello , 2015. #zanata +# Angelique Pillal , 2016. #zanata # Corinne Verheyde , 2016. #zanata # Tom Cocozzello , 2016. #zanata msgid "" msgstr "" -"Project-Id-Version: ceilometer 6.0.0.0b4.dev34\n" +"Project-Id-Version: ceilometer 6.0.0.0rc3.dev2\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-03-09 20:26+0000\n" +"POT-Creation-Date: 2016-03-30 00:07+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2016-03-09 05:03+0000\n" -"Last-Translator: Corinne Verheyde \n" +"PO-Revision-Date: 2016-03-29 08:24+0000\n" +"Last-Translator: Angelique Pillal \n" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "Generated-By: Babel 2.0\n" @@ -490,6 +491,11 @@ msgstr "XenAPI n'est pas installé" msgid "YAML error reading Definitions file %(file)s" msgstr "Erreur YAML lors de la lecture du fichier de définitions %(file)s" +msgid "alarms URLs is unavailable when Aodh is disabled or unavailable." +msgstr "" +"Les URL d'alarmes ne sont pas disponibles lorsque Aodh est désactivé ou non " +"disponible." + #, python-format msgid "could not get CPU time for %(id)s: %(e)s" msgstr "impossible d'obtenir le temps UC pour %(id)s : %(e)s" diff --git a/ceilometer/locale/ko_KR/LC_MESSAGES/ceilometer.po b/ceilometer/locale/ko_KR/LC_MESSAGES/ceilometer.po index 0a2c3b0c1f..1d367cae72 100644 --- a/ceilometer/locale/ko_KR/LC_MESSAGES/ceilometer.po +++ b/ceilometer/locale/ko_KR/LC_MESSAGES/ceilometer.po @@ -11,16 +11,17 @@ # Lucas Palm , 2015. #zanata # OpenStack Infra , 2015. #zanata # Lucas Palm , 2016. #zanata +# SeYeon Lee , 2016. #zanata msgid "" msgstr "" -"Project-Id-Version: ceilometer 6.0.0.0b4.dev6\n" +"Project-Id-Version: ceilometer 6.0.0.0rc3.dev2\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-03-04 20:29+0000\n" +"POT-Creation-Date: 2016-03-30 00:07+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2016-02-03 05:50+0000\n" -"Last-Translator: Lucas Palm \n" +"PO-Revision-Date: 2016-03-29 04:06+0000\n" +"Last-Translator: SeYeon Lee \n" "Language: ko-KR\n" "Plural-Forms: nplurals=1; plural=0;\n" "Generated-By: Babel 2.0\n" @@ -43,6 +44,10 @@ msgstr "%(table_name)s 테이블을 작성할 수 없음, 이미 존재합니다 msgid "Continue after error from %(name)s: %(error)s" msgstr "%(name)s에서 오류 후 계속: %(error)s" +#, python-format +msgid "Could not connect slave host: %s " +msgstr "슬레이브 호스트를 연결할 수 없음: %s " + #, python-format msgid "Could not connect to XenAPI: %s" msgstr "XenAPI를 연결할 수 없음: %s" @@ -155,6 +160,22 @@ msgstr "인스턴스 %(name)s (%(instance_id)s) 무시 중: %(error)s" msgid "Ignoring instance %(name)s: %(error)s" msgstr "인스턴스 %(name)s 무시 중: %(error)s" +#, python-format +msgid "Ignoring loadbalancer %(loadbalancer_id)s" +msgstr "로드 밸런서 %(loadbalancer_id)s 무시" + +#, python-format +msgid "Ignoring pool %(pool_id)s" +msgstr "풀 %(pool_id)s 무시" + +#, python-format +msgid "" +"Invalid YAML syntax in Definitions file %(file)s at line: %(line)s, column: " +"%(column)s." +msgstr "" +"다음에서 정의 파일 %(file)s의 올바르지 않은 YAML 구문: 행: %(line)s, 열: " +"%(column)s" + #, python-format msgid "Invalid period %(period)s: %(err)s" msgstr "올바르지 않은 기간 %(period)s: %(err)s" @@ -177,6 +198,10 @@ msgstr "여러 VM %s을(를) XenServer에서 찾음 " msgid "Must specify connection_url, and connection_password to use" msgstr "사용할 connection_url 및 connection_password를 지정해야 함 " +#, python-format +msgid "No plugin named %(plugin)s available for %(name)s" +msgstr "%(name)s에 대해 %(plugin)s(이)라는 플러그인을 사용할 수 없음" + msgid "Node Manager init failed" msgstr "노드 관리자 초기화 실패" @@ -192,10 +217,32 @@ msgstr "OpenDaylitght API가 %(status)s 리턴: %(reason)s" msgid "Opencontrail API returned %(status)s %(reason)s" msgstr "Opencontrail API가 %(status)s 리턴: %(reason)s" +#, python-format +msgid "" +"Operator %(operator)s is not supported. Only equality operator is available " +"for field %(field)s" +msgstr "" +"연산자 %(operator)s이(가) 지원되지 않습니다. 필드 %(field)s에는 등호 연산자" +"만 사용할 수 있습니다." + +#, python-format +msgid "" +"Operator %(operator)s is not supported. The supported operators are: " +"%(supported)s" +msgstr "" +"연산자 %(operator)s이(가) 지원되지 않습니다. 지원되는 연산자는 %(supported)s" +"입니다. " + #, python-format msgid "Order-by expression not valid: %s" msgstr "Order-by 표현식이 올바르지 않음: %s" +#, python-format +msgid "" +"Parse error in JSONPath specification '%(jsonpath)s' for %(name)s: %(err)s" +msgstr "" +" %(name)s에 대한 JSONPath 스펙 '%(jsonpath)s'의 구문 분석 오류: %(err)s" + msgid "Period must be positive." msgstr "기간은 양수여야 합니다. " @@ -217,10 +264,18 @@ msgid "" "%(smp)s" msgstr "파이프라인 %(pipeline)s: %(smp)s의 변환기 %(trans)s에서 오류 후 종료" +#, python-format +msgid "Plugin specified, but no plugin name supplied for %s" +msgstr "플러그인이 지정되지 않았지만, %s에 플러그인 이름이 제공되지 않음" + #, python-format msgid "Polling %(mtr)s sensor failed for %(cnt)s times!" msgstr "폴링 %(mtr)s 센서가 %(cnt)s번 실패했습니다!" +#, python-format +msgid "Polling %(name)s failed for %(cnt)s times!" +msgstr "폴링 %(name)s이(가) %(cnt)s번 실패했습니다!" + #, python-format msgid "Pollster for %s is disabled!" msgstr "%s의 의견조사자가 사용 안함으로 설정되어 있습니다!" @@ -280,6 +335,10 @@ msgstr "" "데이터 유형 %(type)s이(가) 지원되지 않습니다. 지원되는 데이터 유형 목록은 " "%(supported)s입니다." +#, python-format +msgid "The field 'fields' is required for %s" +msgstr "%s에 'fields' 필드 필요" + msgid "The path for the file publisher is required" msgstr "파일 공개자의 경로가 필요함" @@ -349,11 +408,26 @@ msgstr "알 수 없는 검색 확장자: %s" msgid "Unknown metadata type. Key (%s) will not be queryable." msgstr "알 수 없는 메타데이터 유형입니다. 키(%s)를 조회할 수 없습니다." +#, python-format +msgid "" +"Unknown status %(stat)s received on Load Balancer %(id)s, skipping sample" +msgstr "" +"로드 밸런서 %(id)s에서 알 수 없는 상태 %(stat)s이(가) 수신됨. 샘플 건너뛰기" + #, python-format msgid "Unknown status %(stat)s received on fw %(id)s,skipping sample" msgstr "" "fw %(id)s에서 알 수 없는 상태 %(stat)s이(가) 수신됨. 샘플을 건너뛰는 중" +#, python-format +msgid "Unknown status %(stat)s received on listener %(id)s, skipping sample" +msgstr "리스너 %(id)s에서 알 수 없는 상태 %(stat)s이(가) 수신됨. 샘플 건너뛰기" + +#, python-format +msgid "Unknown status %(stat)s received on member %(id)s, skipping sample" +msgstr "" +"멤버 %(id)s에서 알 수 없는 상태 %(stat)s이(가) 수신됨. 샘플을 건너뛰는 중" + #, python-format msgid "Unknown status %(stat)s received on pool %(id)s, skipping sample" msgstr "" @@ -364,6 +438,10 @@ msgid "Unknown status %(stat)s received on vip %(id)s, skipping sample" msgstr "" "vip %(id)s에서 알 수 없는 상태 %(stat)s이(가) 수신됨. 샘플을 건너뛰는 중" +#, python-format +msgid "Unknown status %(stat)s received on vpn %(id)s, skipping sample" +msgstr "vpn%(id)s에서 알 수 없는 상태 %(stat)s이(가) 수신됨. 샘플 건너뛰기" + #, python-format msgid "VM %s not found in VMware vSphere" msgstr "VM %s을(를) VMware vSphere에서 찾을 수 없음" @@ -378,10 +456,22 @@ msgstr "잘못된 센서 유형" msgid "XenAPI not installed" msgstr "XenAPI가 설치되지 않음" +#, python-format +msgid "YAML error reading Definitions file %(file)s" +msgstr "정의 파일 %(file)s을(를) 읽는 중에 YAML 오류 발생" + +msgid "alarms URLs is unavailable when Aodh is disabled or unavailable." +msgstr "" +"Aodh를 사용하지 않게 설정하거나 사용할 수 없는 경우 경보 URL을 사용할 수 없습" +"니다." + #, python-format msgid "could not get CPU time for %(id)s: %(e)s" msgstr "%(id)s의 CPU 시간을 가져올 수 없음: %(e)s" +msgid "direct option cannot be true when Gnocchi is enabled." +msgstr "Gnocchi를 사용할 때 직접 옵션은 true일 수 없습니다." + #, python-format msgid "dropping out of time order sample: %s" msgstr "시간 순서 샘플에서 벗어남: %s" From 1266e56da80dff8a6a5c7c572927679ee68a499c Mon Sep 17 00:00:00 2001 From: OpenStack Proposal Bot Date: Thu, 31 Mar 2016 06:36:04 +0000 Subject: [PATCH 02/14] Imported Translations from Zanata For more information about this automatic import see: https://wiki.openstack.org/wiki/Translations/Infrastructure Change-Id: I917d447a35c5d33e04fcf1bb37e62a6d6c73e6ea --- ceilometer/locale/zh_CN/LC_MESSAGES/ceilometer.po | 9 ++++++--- ceilometer/locale/zh_TW/LC_MESSAGES/ceilometer.po | 9 ++++++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/ceilometer/locale/zh_CN/LC_MESSAGES/ceilometer.po b/ceilometer/locale/zh_CN/LC_MESSAGES/ceilometer.po index 614b2e254f..d975eed51d 100644 --- a/ceilometer/locale/zh_CN/LC_MESSAGES/ceilometer.po +++ b/ceilometer/locale/zh_CN/LC_MESSAGES/ceilometer.po @@ -19,13 +19,13 @@ # Linda , 2016. #zanata msgid "" msgstr "" -"Project-Id-Version: ceilometer 6.0.0.0b4.dev50\n" +"Project-Id-Version: ceilometer 6.0.0.0rc4.dev1\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-03-19 00:57+0000\n" +"POT-Creation-Date: 2016-03-30 10:37+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2016-03-16 12:12+0000\n" +"PO-Revision-Date: 2016-03-31 03:32+0000\n" "Last-Translator: Linda \n" "Language: zh-CN\n" "Language-Team: Chinese (China)\n" @@ -443,6 +443,9 @@ msgstr "XenAPI没有安装" msgid "YAML error reading Definitions file %(file)s" msgstr "读取定义文件%(file)s时遇到YAML错误" +msgid "alarms URLs is unavailable when Aodh is disabled or unavailable." +msgstr "Aodh 被禁用或不可用时,警报 URL 不可用。" + #, python-format msgid "could not get CPU time for %(id)s: %(e)s" msgstr "无法为虚拟机%(id)s获取CPU时间:%(e)s" diff --git a/ceilometer/locale/zh_TW/LC_MESSAGES/ceilometer.po b/ceilometer/locale/zh_TW/LC_MESSAGES/ceilometer.po index c63189428c..714b393871 100644 --- a/ceilometer/locale/zh_TW/LC_MESSAGES/ceilometer.po +++ b/ceilometer/locale/zh_TW/LC_MESSAGES/ceilometer.po @@ -10,13 +10,13 @@ # Lucas Palm , 2016. #zanata msgid "" msgstr "" -"Project-Id-Version: ceilometer 6.0.0.0b4.dev50\n" +"Project-Id-Version: ceilometer 6.0.0.0rc4.dev1\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-03-19 00:57+0000\n" +"POT-Creation-Date: 2016-03-30 10:37+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2016-03-15 07:46+0000\n" +"PO-Revision-Date: 2016-03-31 03:41+0000\n" "Last-Translator: Jennifer \n" "Language: zh-TW\n" "Plural-Forms: nplurals=1; plural=0;\n" @@ -432,6 +432,9 @@ msgstr "未安裝 XenAPI" msgid "YAML error reading Definitions file %(file)s" msgstr "讀取定義檔 %(file)s 時發生 YAML 錯誤" +msgid "alarms URLs is unavailable when Aodh is disabled or unavailable." +msgstr "當已停用或無法使用 Aodh 時,無法使用警示 URL" + #, python-format msgid "could not get CPU time for %(id)s: %(e)s" msgstr "無法取得 %(id)s 的 CPU 時間:%(e)s" From c2b72462571b552f4055a8b887e6f974482e25a9 Mon Sep 17 00:00:00 2001 From: OpenStack Proposal Bot Date: Tue, 5 Apr 2016 06:28:19 +0000 Subject: [PATCH 03/14] Imported Translations from Zanata For more information about this automatic import see: https://wiki.openstack.org/wiki/Translations/Infrastructure Change-Id: I292454c7a9e46ee4003c6754fe8dc873af810037 --- ceilometer/locale/de/LC_MESSAGES/ceilometer.po | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/ceilometer/locale/de/LC_MESSAGES/ceilometer.po b/ceilometer/locale/de/LC_MESSAGES/ceilometer.po index 4e9d3a2008..bb56c7781e 100644 --- a/ceilometer/locale/de/LC_MESSAGES/ceilometer.po +++ b/ceilometer/locale/de/LC_MESSAGES/ceilometer.po @@ -6,19 +6,16 @@ # Carsten Duch , 2014 # Christian Berendt , 2014 # Ettore Atalan , 2014 -# OpenStack Infra , 2015. #zanata -# Tom Cocozzello , 2015. #zanata -# Monika Wolf , 2016. #zanata -# Tom Cocozzello , 2016. #zanata +# Frank Kloeker , 2016. #zanata msgid "" msgstr "" -"Project-Id-Version: ceilometer 6.0.0.0rc3.dev2\n" +"Project-Id-Version: ceilometer 6.0.0.0rc4.dev2\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-03-30 00:07+0000\n" +"POT-Creation-Date: 2016-03-31 08:41+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2016-03-29 07:52+0000\n" +"PO-Revision-Date: 2016-04-04 05:03+0000\n" "Last-Translator: Monika Wolf \n" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -210,7 +207,7 @@ msgid "No plugin named %(plugin)s available for %(name)s" msgstr "Kein Plug-in mit dem Namen %(plugin)s verfügbar für %(name)s." msgid "Node Manager init failed" -msgstr "Initialisierung von Node Manager fehlgeschlagen" +msgstr "Initialisierung von Knoten-Manager fehlgeschlagen" #, python-format msgid "Not Authorized to access %(aspect)s %(id)s" From de8272771eb8de7d2db44b8eee3cccef63622c0e Mon Sep 17 00:00:00 2001 From: OpenStack Proposal Bot Date: Thu, 21 Apr 2016 07:16:30 +0000 Subject: [PATCH 04/14] Imported Translations from Zanata For more information about this automatic import see: https://wiki.openstack.org/wiki/Translations/Infrastructure Change-Id: I7ce09e36757c6da5e3e37fb38f8a2cbb449ae9d2 --- ceilometer/locale/ceilometer-log-error.pot | 12 ++-- ceilometer/locale/ceilometer-log-info.pot | 32 ++++----- ceilometer/locale/ceilometer-log-warning.pot | 14 ++-- ceilometer/locale/ceilometer.pot | 10 +-- .../ko_KR/LC_MESSAGES/ceilometer-log-error.po | 18 ++--- .../ko_KR/LC_MESSAGES/ceilometer-log-info.po | 10 +-- .../LC_MESSAGES/ceilometer-log-warning.po | 20 +++--- .../locale/ko_KR/LC_MESSAGES/ceilometer.po | 67 +++++++++---------- .../locale/zh_CN/LC_MESSAGES/ceilometer.po | 55 ++++++++------- .../locale/zh_TW/LC_MESSAGES/ceilometer.po | 33 +++++---- 10 files changed, 133 insertions(+), 138 deletions(-) diff --git a/ceilometer/locale/ceilometer-log-error.pot b/ceilometer/locale/ceilometer-log-error.pot index a0aacd1666..ffa5f25a75 100644 --- a/ceilometer/locale/ceilometer-log-error.pot +++ b/ceilometer/locale/ceilometer-log-error.pot @@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ceilometer 6.0.0.0b4.dev6\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-03-07 06:08+0000\n" +"Project-Id-Version: ceilometer 6.0.1.dev3\n" +"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" +"POT-Creation-Date: 2016-04-21 07:16+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,7 +17,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.2.0\n" -#: ceilometer/collector.py:176 +#: ceilometer/collector.py:163 #, python-format msgid "Dispatcher failed to handle the %s, requeue it." msgstr "" @@ -118,8 +118,8 @@ msgstr "" #: ceilometer/event/storage/impl_elasticsearch.py:110 #: ceilometer/event/storage/impl_hbase.py:121 -#: ceilometer/event/storage/impl_sqlalchemy.py:203 -#: ceilometer/event/storage/impl_sqlalchemy.py:205 +#: ceilometer/event/storage/impl_sqlalchemy.py:207 +#: ceilometer/event/storage/impl_sqlalchemy.py:209 #: ceilometer/event/storage/pymongo_base.py:69 #, python-format msgid "Failed to record event: %s" diff --git a/ceilometer/locale/ceilometer-log-info.pot b/ceilometer/locale/ceilometer-log-info.pot index 091dc5303a..bed5888c8f 100644 --- a/ceilometer/locale/ceilometer-log-info.pot +++ b/ceilometer/locale/ceilometer-log-info.pot @@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ceilometer 6.0.0.0b3.dev49\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-02-08 06:51+0000\n" +"Project-Id-Version: ceilometer 6.0.1.dev3\n" +"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" +"POT-Creation-Date: 2016-04-21 07:16+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,21 +17,21 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.2.0\n" -#: ceilometer/coordination.py:87 +#: ceilometer/coordination.py:86 msgid "Coordination backend started successfully." msgstr "" -#: ceilometer/coordination.py:136 +#: ceilometer/coordination.py:135 #, python-format msgid "Joined partitioning group %s" msgstr "" -#: ceilometer/coordination.py:157 +#: ceilometer/coordination.py:156 #, python-format msgid "Left partitioning group %s" msgstr "" -#: ceilometer/declarative.py:165 +#: ceilometer/declarative.py:174 #, python-format msgid "Definitions: %s" msgstr "" @@ -64,17 +64,17 @@ msgstr "" msgid "Detected change in pipeline configuration." msgstr "" -#: ceilometer/agent/manager.py:178 +#: ceilometer/agent/manager.py:177 #, python-format msgid "Skip pollster %(name)s, no %(p_context)sresources found this cycle" msgstr "" -#: ceilometer/agent/manager.py:183 +#: ceilometer/agent/manager.py:182 #, python-format msgid "Polling pollster %(poll)s in the context of %(src)s" msgstr "" -#: ceilometer/agent/manager.py:487 +#: ceilometer/agent/manager.py:486 msgid "Reconfiguring polling tasks." msgstr "" @@ -111,7 +111,7 @@ msgid "Nothing to clean, database event time to live is disabled" msgstr "" #: ceilometer/event/storage/impl_elasticsearch.py:107 -#: ceilometer/event/storage/impl_sqlalchemy.py:201 +#: ceilometer/event/storage/impl_sqlalchemy.py:205 #: ceilometer/event/storage/pymongo_base.py:67 #, python-format msgid "Duplicate event detected, skipping it: %s" @@ -122,7 +122,7 @@ msgstr "" msgid "Dropping event data with TTL %d" msgstr "" -#: ceilometer/event/storage/impl_sqlalchemy.py:439 +#: ceilometer/event/storage/impl_sqlalchemy.py:443 #, python-format msgid "%d events are removed from database" msgstr "" @@ -142,21 +142,21 @@ msgstr "" msgid "Dropping metering data with TTL %d" msgstr "" -#: ceilometer/storage/impl_sqlalchemy.py:368 +#: ceilometer/storage/impl_sqlalchemy.py:372 #, python-format msgid "%d samples removed from database" msgstr "" -#: ceilometer/storage/impl_sqlalchemy.py:404 +#: ceilometer/storage/impl_sqlalchemy.py:408 msgid "Expired residual resource and meter definition data" msgstr "" -#: ceilometer/storage/mongo/utils.py:259 +#: ceilometer/storage/mongo/utils.py:260 #, python-format msgid "Connecting to %(db)s on %(nodelist)s" msgstr "" -#: ceilometer/storage/mongo/utils.py:462 +#: ceilometer/storage/mongo/utils.py:463 #, python-format msgid "Index %s will be recreate." msgstr "" diff --git a/ceilometer/locale/ceilometer-log-warning.pot b/ceilometer/locale/ceilometer-log-warning.pot index cc27936492..4af95da7cd 100644 --- a/ceilometer/locale/ceilometer-log-warning.pot +++ b/ceilometer/locale/ceilometer-log-warning.pot @@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ceilometer 6.0.0.0b4.dev34\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-03-11 06:17+0000\n" +"Project-Id-Version: ceilometer 6.0.1.dev3\n" +"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" +"POT-Creation-Date: 2016-04-21 07:16+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -60,21 +60,21 @@ msgid "" "with False" msgstr "" -#: ceilometer/api/controllers/v2/root.py:123 +#: ceilometer/api/controllers/v2/root.py:128 msgid "Can't connect to keystone, assuming gnocchi is disabled and retry later" msgstr "" -#: ceilometer/api/controllers/v2/root.py:127 +#: ceilometer/api/controllers/v2/root.py:132 msgid "" "ceilometer-api started with gnocchi enabled. The resources/meters/samples" " URLs are disabled." msgstr "" -#: ceilometer/api/controllers/v2/root.py:149 +#: ceilometer/api/controllers/v2/root.py:154 msgid "Can't connect to keystone, assuming aodh is disabled and retry later." msgstr "" -#: ceilometer/api/controllers/v2/root.py:152 +#: ceilometer/api/controllers/v2/root.py:157 msgid "" "ceilometer-api started with aodh enabled. Alarms URLs will be redirected " "to aodh endpoint." diff --git a/ceilometer/locale/ceilometer.pot b/ceilometer/locale/ceilometer.pot index fbb221f191..180a557ae2 100644 --- a/ceilometer/locale/ceilometer.pot +++ b/ceilometer/locale/ceilometer.pot @@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ceilometer 6.0.0.0rc2.dev9\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-03-29 06:16+0000\n" +"Project-Id-Version: ceilometer 6.0.1.dev3\n" +"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" +"POT-Creation-Date: 2016-04-21 07:16+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,12 +17,12 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.2.0\n" -#: ceilometer/collector.py:134 +#: ceilometer/collector.py:123 #, python-format msgid "UDP: Cannot decode data sent by %s" msgstr "" -#: ceilometer/collector.py:141 +#: ceilometer/collector.py:130 msgid "UDP: Unable to store meter" msgstr "" diff --git a/ceilometer/locale/ko_KR/LC_MESSAGES/ceilometer-log-error.po b/ceilometer/locale/ko_KR/LC_MESSAGES/ceilometer-log-error.po index bc2a6736ba..b0256ef0b6 100644 --- a/ceilometer/locale/ko_KR/LC_MESSAGES/ceilometer-log-error.po +++ b/ceilometer/locale/ko_KR/LC_MESSAGES/ceilometer-log-error.po @@ -1,13 +1,13 @@ -# SeYeon Lee , 2016. #zanata +# Sungjin Kang , 2016. #zanata msgid "" msgstr "" -"Project-Id-Version: ceilometer 6.0.0.0rc2.dev1\n" +"Project-Id-Version: ceilometer 6.0.1.dev3\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-03-20 20:02+0000\n" +"POT-Creation-Date: 2016-04-07 10:59+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2016-03-21 03:28+0000\n" +"PO-Revision-Date: 2016-04-07 03:38+0000\n" "Last-Translator: SeYeon Lee \n" "Language-Team: Korean (South Korea)\n" "Language: ko-KR\n" @@ -27,7 +27,7 @@ msgid "Dispatcher failed to handle the %s, requeue it." msgstr "디스패처에서 %s을(를) 처리하지 못하여 다시 대기열에 둡니다." msgid "Error connecting to coordination backend." -msgstr "조정 백엔드에 연결하는 중에 오류가 발생했습니다." +msgstr "조정 백엔드를 연결하는 중에 오류가 발생했습니다." msgid "Error getting group membership info from coordination backend." msgstr "조정 백엔드에서 그룹 멤버십 정보를 가져오는 중에 오류가 발생했습니다." @@ -39,14 +39,14 @@ msgstr "" #, python-format msgid "Error loading meter definition : %(err)s" -msgstr "미터 정의 로드 오류 : %(err)s" +msgstr "측정 정의 로드 오류 : %(err)s" #, python-format msgid "Error processing event and it will be dropped: %s" msgstr "이벤트 처리 중 오류가 발생하므로 삭제됨: %s" msgid "Error sending a heartbeat to coordination backend." -msgstr "하트비트를 조정 백엔드에 보내는 중에 오류가 발생했습니다." +msgstr "하트비트를 조정 백엔드에서 보내는 중에 오류가 발생했습니다." msgid "Fail to process a notification" msgstr "알림을 처리하는 데 실패" @@ -63,11 +63,11 @@ msgstr "Kafka 서비스에 연결하는 데 실패: %s" #, python-format msgid "Failed to connect to db, purpose %(purpose)s re-try later: %(err)s" -msgstr "db에 연결하는 데 실패, %(purpose)s 용도를 나중에 다시 시도: %(err)s" +msgstr "DB에 연결하는 데 실패, %(purpose)s 용도를 나중에 다시 시도: %(err)s" #, python-format msgid "Failed to connect to db, purpose %(purpose)s retry later: %(err)s" -msgstr "db에 연결하는 데 실패, %(purpose)s 용도를 나중에 다시 시도: %(err)s" +msgstr "DB에 연결하는 데 실패, %(purpose)s 용도를 나중에 다시 시도: %(err)s" #, python-format msgid "Failed to load resource due to error %s" diff --git a/ceilometer/locale/ko_KR/LC_MESSAGES/ceilometer-log-info.po b/ceilometer/locale/ko_KR/LC_MESSAGES/ceilometer-log-info.po index 933cf6a8d6..4511135ad9 100644 --- a/ceilometer/locale/ko_KR/LC_MESSAGES/ceilometer-log-info.po +++ b/ceilometer/locale/ko_KR/LC_MESSAGES/ceilometer-log-info.po @@ -1,13 +1,13 @@ -# SeYeon Lee , 2016. #zanata +# Sungjin Kang , 2016. #zanata msgid "" msgstr "" -"Project-Id-Version: ceilometer 6.0.0.0rc2.dev1\n" +"Project-Id-Version: ceilometer 6.0.1.dev3\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-03-20 20:02+0000\n" +"POT-Creation-Date: 2016-04-07 10:58+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2016-03-21 03:56+0000\n" +"PO-Revision-Date: 2016-04-07 03:39+0000\n" "Last-Translator: SeYeon Lee \n" "Language-Team: Korean (South Korea)\n" "Language: ko-KR\n" @@ -106,7 +106,7 @@ msgstr "알림 에이전트와 리스너를 다시 로드합니다." #, python-format msgid "Skip pollster %(name)s, no %(p_context)sresources found this cycle" -msgstr "pollster %(name)s 건너뛰기, %(p_context)s 자원에서 이 주기를 발견함" +msgstr "Pollster %(name)s 건너뛰기, %(p_context)s 자원에서 이 주기를 발견함" #, python-format msgid "Starting server in PID %s" diff --git a/ceilometer/locale/ko_KR/LC_MESSAGES/ceilometer-log-warning.po b/ceilometer/locale/ko_KR/LC_MESSAGES/ceilometer-log-warning.po index 2b77a9dbd4..64ded38785 100644 --- a/ceilometer/locale/ko_KR/LC_MESSAGES/ceilometer-log-warning.po +++ b/ceilometer/locale/ko_KR/LC_MESSAGES/ceilometer-log-warning.po @@ -1,13 +1,13 @@ -# SeYeon Lee , 2016. #zanata +# Sungjin Kang , 2016. #zanata msgid "" msgstr "" -"Project-Id-Version: ceilometer 6.0.0.0rc2.dev1\n" +"Project-Id-Version: ceilometer 6.0.1.dev3\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-03-20 20:02+0000\n" +"POT-Creation-Date: 2016-04-07 10:59+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2016-03-21 04:18+0000\n" +"PO-Revision-Date: 2016-04-07 03:34+0000\n" "Last-Translator: SeYeon Lee \n" "Language-Team: Korean (South Korea)\n" "Language: ko-KR\n" @@ -16,12 +16,12 @@ msgstr "" msgid "Can't connect to keystone, assuming aodh is disabled and retry later." msgstr "" -"keystone에 연결할 수 없습니다 . aodh가 사용되지 않는다고 가정하여 나중에 다" +"Keystone에 연결할 수 없습니다 . Aodh가 사용되지 않는다고 가정하여 나중에 다" "시 시도합니다." msgid "Can't connect to keystone, assuming gnocchi is disabled and retry later" msgstr "" -"keystone에 연결할 수 없습니다. gnocchi가 사용되지 않는다고 가정하여 나중에 다" +"Keystone에 연결할 수 없습니다. Gnocchi가 사용되지 않는다고 가정하여 나중에 다" "시 시도합니다." msgid "" @@ -60,7 +60,7 @@ msgid "" "Failed to parse date from set fields, both fields %(start)s and %(end)s must " "be datetime: %(err)s" msgstr "" -"설정 필드에서 데이터를 구문 분석하는 데 실패, 두 필드 %(start)s 및 %(end)s은" +"설정 필드에서 데이터를 구문 분석하는 데 실패, 두 필드 %(start)s 와 %(end)s은" "(는) 모두 datetime임: %(err)s" #, python-format @@ -92,7 +92,7 @@ msgstr " %(name)s, %(service_type)s 서비스 건너뛰기는 keystone에 등록 #, python-format msgid "Skipping duplicate meter definition %s" -msgstr "중복 미터 정의 %s 건너뛰기" +msgstr "중복 측정 정의 %s 건너뛰기" msgid "" "Timedelta plugin is required two timestamp fields to create timedelta value." @@ -104,14 +104,14 @@ msgid "" "ceilometer-api started with aodh enabled. Alarms URLs will be redirected to " "aodh endpoint." msgstr "" -"aodh가 사용된 상태로 ceilometer-api가 시작되었습니다. 알람 URL이 aodh 엔드포" +"Aodh가 사용된 상태로 ceilometer-api가 시작되었습니다. 알람 URL이 aodh 엔드포" "인트로 경로가 재지정됩니다." msgid "" "ceilometer-api started with gnocchi enabled. The resources/meters/samples " "URLs are disabled." msgstr "" -"gnocchi를 사용한 상태로 ceilometer-api가 시작되었습니다. 자원/미터/샘플 URL" +"Gnocchi를 사용한 상태로 ceilometer-api가 시작되었습니다. 자원/측정/샘플 URL" "을 사용하지 않습니다." #, python-format diff --git a/ceilometer/locale/ko_KR/LC_MESSAGES/ceilometer.po b/ceilometer/locale/ko_KR/LC_MESSAGES/ceilometer.po index 1d367cae72..e14d85ccd4 100644 --- a/ceilometer/locale/ko_KR/LC_MESSAGES/ceilometer.po +++ b/ceilometer/locale/ko_KR/LC_MESSAGES/ceilometer.po @@ -8,20 +8,17 @@ # Seunghyo Chun , 2013 # Sungjin Kang , 2013 # Sungjin Kang , 2013 -# Lucas Palm , 2015. #zanata -# OpenStack Infra , 2015. #zanata -# Lucas Palm , 2016. #zanata -# SeYeon Lee , 2016. #zanata +# Sungjin Kang , 2016. #zanata msgid "" msgstr "" -"Project-Id-Version: ceilometer 6.0.0.0rc3.dev2\n" +"Project-Id-Version: ceilometer 6.0.1.dev3\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-03-30 00:07+0000\n" +"POT-Creation-Date: 2016-04-07 10:58+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2016-03-29 04:06+0000\n" -"Last-Translator: SeYeon Lee \n" +"PO-Revision-Date: 2016-04-07 03:48+0000\n" +"Last-Translator: Lucas Palm \n" "Language: ko-KR\n" "Plural-Forms: nplurals=1; plural=0;\n" "Generated-By: Babel 2.0\n" @@ -66,7 +63,7 @@ msgstr "VM %s CPU 이용률을 가져올 수 없음" #, python-format msgid "Couldn't obtain IP address of instance %s" -msgstr "%s 인스턴스의 IP 주소를 얻을 수 없음" +msgstr "%s 인스턴스 IP 주소를 얻을 수 없음" msgid "" "Dispatcher target was not set, no meter will be posted. Set the target in " @@ -92,7 +89,7 @@ msgid "Error parsing HTTP response: %s" msgstr "HTTP 응답 구문 분석 중 오류 발생: %s" msgid "Error stopping pollster." -msgstr "의견조사자를 중지하는 중에 오류가 발생했습니다. " +msgstr "pollster를 중지하는 중에 오류가 발생했습니다. " msgid "Event" msgstr "이벤트" @@ -109,15 +106,15 @@ msgid "" "Failed to inspect data of instance , domain state " "is SHUTOFF." msgstr "" -"인스턴스 <이름=%(name)s, id=%(id)s>의 데이터 검사 실패, 도메인 상태가 SHUTOFF" -"입니다." +"인스턴스 데이터 검사 실패, 도메인 상태가 SHUTOFF입" +"니다." #, python-format msgid "" "Failed to inspect memory usage of %(instance_uuid)s, can not get info from " "libvirt: %(error)s" msgstr "" -"%(instance_uuid)s의 메모리 사용량 검사 실패, libvirt에서 정보를 가져올 수 없" +"%(instance_uuid)s 메모리 사용량 검사 실패, libvirt에서 정보를 가져올 수 없" "음: %(error)s" #, python-format @@ -125,16 +122,16 @@ msgid "" "Failed to inspect memory usage of instance , can " "not get info from libvirt." msgstr "" -"인스턴스 <이름=%(name)s, id=%(id)s>의 메모리 사용량 검사 실패, libvirt에서 정" -"보를 가져올 수 없습니다." +"인스턴스 메모리 사용량 검사 실패, libvirt에서 정보" +"를 가져올 수 없습니다." #, python-format msgid "Failed to load any notification handlers for %s" -msgstr "%s의 알림 핸들러 로드 실패" +msgstr "%s 알림 핸들러 로드 실패" #, python-format msgid "Failed to parse the timestamp value %s" -msgstr "시간소인 값 %s 구문 분석 실패" +msgstr "Timestamp 값 %s 구문 분석 실패" #, python-format msgid "Failed to publish %d datapoints, dropping them" @@ -196,7 +193,7 @@ msgid "Multiple VM %s found in XenServer" msgstr "여러 VM %s을(를) XenServer에서 찾음 " msgid "Must specify connection_url, and connection_password to use" -msgstr "사용할 connection_url 및 connection_password를 지정해야 함 " +msgstr "사용할 connection_url와 connection_password를 지정해야 함 " #, python-format msgid "No plugin named %(plugin)s available for %(name)s" @@ -235,7 +232,7 @@ msgstr "" #, python-format msgid "Order-by expression not valid: %s" -msgstr "Order-by 표현식이 올바르지 않음: %s" +msgstr "정렬 표현식이 올바르지 않음: %s" #, python-format msgid "" @@ -248,21 +245,23 @@ msgstr "기간은 양수여야 합니다. " #, python-format msgid "Pipeline %(pipeline)s: %(status)s after error from publisher %(pub)s" -msgstr "파이프라인 %(pipeline)s: 공개자 %(pub)s에서 오류 후 %(status)s" +msgstr "파이프라인 %(pipeline)s: Publisher %(pub)s에서 오류 후 %(status)s" #, python-format msgid "Pipeline %(pipeline)s: Continue after error from publisher %(pub)s" -msgstr "파이프라인 %(pipeline)s: 공개자 %(pub)s에서 오류 후 계속" +msgstr "파이프라인 %(pipeline)s: Publisher %(pub)s에서 오류 후 계속" #, python-format msgid "Pipeline %(pipeline)s: Error flushing transformer %(trans)s" -msgstr "파이프라인 %(pipeline)s: 변환기 %(trans)s을(를) 비우는 중 오류 발생" +msgstr "" +"파이프라인 %(pipeline)s: Transformer %(trans)s을(를) 비우는 중 오류 발생" #, python-format msgid "" "Pipeline %(pipeline)s: Exit after error from transformer %(trans)s for " "%(smp)s" -msgstr "파이프라인 %(pipeline)s: %(smp)s의 변환기 %(trans)s에서 오류 후 종료" +msgstr "" +"파이프라인 %(pipeline)s: %(smp)s의 transformer %(trans)s에서 오류 후 종료" #, python-format msgid "Plugin specified, but no plugin name supplied for %s" @@ -278,12 +277,12 @@ msgstr "폴링 %(name)s이(가) %(cnt)s번 실패했습니다!" #, python-format msgid "Pollster for %s is disabled!" -msgstr "%s의 의견조사자가 사용 안함으로 설정되어 있습니다!" +msgstr "%s pollster가 사용 안함으로 설정되어 있습니다!" #, python-format msgid "Prevent pollster %(name)s for polling source %(source)s anymore!" msgstr "" -"의견조사자 %(name)s이(가) 소스 %(source)s를 더 이상 폴링하지 않도록 하십시오!" +"Pollster %(name)s이(가) 소스 %(source)s를 더 이상 폴링하지 않도록 하십시오!" #, python-format msgid "" @@ -325,7 +324,7 @@ msgstr "문자열 %s이(가) 올바른 등시간이 아님" msgid "" "The Yaml file that defines mapping between samples and gnocchi resources/" "metrics" -msgstr "샘플과 gnocchi resources/ 메트릭 간 맵핑을 정의하는 Yaml 파일" +msgstr "샘플과 gnocchi resources/ metric 간 맵핑을 정의하는 Yaml 파일" #, python-format msgid "" @@ -368,7 +367,7 @@ msgstr "%(expr)s 표현식을 평가할 수 없음: %(exc)s" #, python-format msgid "Unable to load publisher %s" -msgstr "공개자 %s을(를) 로드할 수 없음" +msgstr "Publisher %s을(를) 로드할 수 없음" #, python-format msgid "Unable to load the hypervisor inspector: %s" @@ -379,15 +378,15 @@ msgid "" "Unable to reconnect to the primary mongodb after %(retries)d retries. Giving " "up." msgstr "" -"%(retries)d회 재시도한 이후에는 1차 mongodb에 다시 연결할 수 없습니다. 포기하" -"는 중입니다." +"%(retries)d 회 재시도한 이후에는 1차 mongodb에 다시 연결할 수 없습니다. 포기" +"하는 중입니다." #, python-format msgid "" "Unable to reconnect to the primary mongodb: %(errmsg)s. Trying again in " "%(retry_interval)d seconds." msgstr "" -"1차 mongodb에 다시 연결할 수 없음: %(errmsg)s. %(retry_interval)d초 후에 다" +"1차 mongodb에 다시 연결할 수 없음: %(errmsg)s. %(retry_interval)d 초 후에 다" "시 시도합니다." msgid "Unable to send sample over UDP" @@ -436,11 +435,11 @@ msgstr "" #, python-format msgid "Unknown status %(stat)s received on vip %(id)s, skipping sample" msgstr "" -"vip %(id)s에서 알 수 없는 상태 %(stat)s이(가) 수신됨. 샘플을 건너뛰는 중" +"vIP %(id)s에서 알 수 없는 상태 %(stat)s이(가) 수신됨. 샘플을 건너뛰는 중" #, python-format msgid "Unknown status %(stat)s received on vpn %(id)s, skipping sample" -msgstr "vpn%(id)s에서 알 수 없는 상태 %(stat)s이(가) 수신됨. 샘플 건너뛰기" +msgstr "VPN %(id)s에서 알 수 없는 상태 %(stat)s이(가) 수신됨. 샘플 건너뛰기" #, python-format msgid "VM %s not found in VMware vSphere" @@ -481,7 +480,7 @@ msgid "dropping sample with no predecessor: %s" msgstr "선행 작업이 없는 샘플 삭제: %s" msgid "ipmitool output length mismatch" -msgstr "ipmitool 출력 길이 불일치" +msgstr "Ipmitool 출력 길이 불일치" msgid "max_bytes and backup_count should be numbers." msgstr "max_bytes 및 backup_count는 숫자여야 합니다." @@ -498,4 +497,4 @@ msgid "parse IPMI sensor data failed,unknown sensor type" msgstr "IPMI 센서 데이터 구문 분석에 실패했음, 알 수 없는 센서 유형" msgid "running ipmitool failure" -msgstr "ipmitool 실행 실패" +msgstr "Ipmitool 실행 실패" diff --git a/ceilometer/locale/zh_CN/LC_MESSAGES/ceilometer.po b/ceilometer/locale/zh_CN/LC_MESSAGES/ceilometer.po index d975eed51d..81b05ba50a 100644 --- a/ceilometer/locale/zh_CN/LC_MESSAGES/ceilometer.po +++ b/ceilometer/locale/zh_CN/LC_MESSAGES/ceilometer.po @@ -12,20 +12,18 @@ # Yu Zhang, 2013 # 颜海峰 , 2014 # English translations for ceilometer. -# Lucas Palm , 2015. #zanata # OpenStack Infra , 2015. #zanata -# Alex Eng , 2016. #zanata # Daisy , 2016. #zanata # Linda , 2016. #zanata msgid "" msgstr "" -"Project-Id-Version: ceilometer 6.0.0.0rc4.dev1\n" +"Project-Id-Version: ceilometer 6.0.1.dev3\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-03-30 10:37+0000\n" +"POT-Creation-Date: 2016-04-07 10:58+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2016-03-31 03:32+0000\n" +"PO-Revision-Date: 2016-04-19 05:12+0000\n" "Last-Translator: Linda \n" "Language: zh-CN\n" "Language-Team: Chinese (China)\n" @@ -35,7 +33,7 @@ msgstr "" #, python-format msgid "%(entity)s %(id)s Not Found" -msgstr "无法找到%(entity)s %(id)s " +msgstr "无法找到 %(entity)s %(id)s " #, python-format msgid "Arithmetic transformer must use at least one meter in expression '%s'" @@ -47,7 +45,7 @@ msgstr "表%(table_name)s已经存在,无法创建。忽略此错误继续执 #, python-format msgid "Continue after error from %(name)s: %(error)s" -msgstr "遇到错误%(name)s:%(error)s,继续执行" +msgstr "%(name)s 出错:%(error)s,继续执行" #, python-format msgid "Could not connect slave host: %s " @@ -87,12 +85,12 @@ msgid "" "Error from libvirt while looking up instance : " "[Error Code %(error_code)s] %(ex)s" msgstr "" -"查找实例 <名称为 %(name)s,标识为 %(id)s> 时,libvirt 中出错:[错误代码 " +"查找实例 时,libvirt 中出错:[错误代码 " "%(error_code)s] %(ex)s" #, python-format msgid "Error parsing HTTP response: %s" -msgstr "解析HTTP响应失败: %s" +msgstr "解析 HTTP 响应失败:%s" msgid "Error stopping pollster." msgstr "停止轮询程序时出错。" @@ -105,7 +103,7 @@ msgstr "表达式计算结果为NaN!" #, python-format msgid "Failed to import extension for %(name)s: %(error)s" -msgstr "无法为%(name)s引入扩展:%(error)s" +msgstr "未能导入 %(name)s 的扩展:%(error)s" #, python-format msgid "" @@ -132,7 +130,7 @@ msgstr "" #, python-format msgid "Failed to load any notification handlers for %s" -msgstr "无法为%s加载任何通知处理器" +msgstr "无法为 %s 加载任何通知处理器" #, python-format msgid "Failed to parse the timestamp value %s" @@ -174,7 +172,8 @@ msgstr "正在忽略池 %(pool_id)s" msgid "" "Invalid YAML syntax in Definitions file %(file)s at line: %(line)s, column: " "%(column)s." -msgstr "定义文件%(file)s中有非法YAML语法,行:%(line)s,列%(column)s。" +msgstr "" +"定义文件 %(file)s 的第 %(line)s 行和第 %(column)s 列中有无效 YAML 语法。" #, python-format msgid "Invalid period %(period)s: %(err)s" @@ -200,14 +199,14 @@ msgstr "使用时必须指定connection_url和connection_password" #, python-format msgid "No plugin named %(plugin)s available for %(name)s" -msgstr "未对 %(name)s 提供名为 %(plugin)s 的插件" +msgstr "未对 %(name)s 提供名为 %(plugin)s 的插件" msgid "Node Manager init failed" msgstr "节点管理器初始化失败" #, python-format msgid "Not Authorized to access %(aspect)s %(id)s" -msgstr "权限不足以访问%(aspect)s %(id)s" +msgstr "未授权访问 %(aspect)s %(id)s" #, python-format msgid "OpenDaylitght API returned %(status)s %(reason)s" @@ -236,7 +235,7 @@ msgstr "orderby表达式不合法:%s" #, python-format msgid "" "Parse error in JSONPath specification '%(jsonpath)s' for %(name)s: %(err)s" -msgstr "对 %(name)s 指定的 JSONPath(即“%(jsonpath)s”)存在解析错误:%(err)s" +msgstr "%(name)s 的 JSONPath 规范“%(jsonpath)s”中存在解析错误:%(err)s" msgid "Period must be positive." msgstr "period 参数必须是正数" @@ -244,21 +243,21 @@ msgstr "period 参数必须是正数" #, python-format msgid "Pipeline %(pipeline)s: %(status)s after error from publisher %(pub)s" msgstr "" -"管道 %(pipeline)s:在发布程序 %(pub)s 中发生错误之后,处于 %(status)s 状态" +"管道 %(pipeline)s:发布程序 %(pub)s 中发生错误之后,处于 %(status)s 状态" #, python-format msgid "Pipeline %(pipeline)s: Continue after error from publisher %(pub)s" -msgstr "流水线%(pipeline)s:发布器%(pub)s报错,继续执行" +msgstr "管道 %(pipeline)s:发布器 %(pub)s 出错,继续执行" #, python-format msgid "Pipeline %(pipeline)s: Error flushing transformer %(trans)s" -msgstr "流水线%(pipeline)s:变形器%(trans)s清空数据时出错" +msgstr "管道 %(pipeline)s:清空变形器 %(trans)s 时出错" #, python-format msgid "" "Pipeline %(pipeline)s: Exit after error from transformer %(trans)s for " "%(smp)s" -msgstr "流水线%(pipeline)s:数据%(smp)s的变形器%(trans)s遇到错误,退出" +msgstr "管道 %(pipeline)s:%(smp)s 的变形器%(trans)s 出错,退出" #, python-format msgid "Plugin specified, but no plugin name supplied for %s" @@ -311,7 +310,7 @@ msgstr "样本应包括在请求主体中" #, python-format msgid "Skip loading extension for %s" -msgstr "跳过为%s加载扩展" +msgstr "跳过 %s 的加载扩展" #, python-format msgid "String %s is not a valid isotime" @@ -326,7 +325,7 @@ msgstr "用于定义样本与 gnocchi 资源/度量值之间的映射的Yaml 文 msgid "" "The data type %(type)s is not supported. The supported data type list is: " "%(supported)s" -msgstr "数据类型%(type)s不被支持。支持的数据类型列表:%(supported)s" +msgstr "数据类型 %(type)s 不受支持。受支持的数据类型列表是:%(supported)s" #, python-format msgid "The field 'fields' is required for %s" @@ -337,10 +336,10 @@ msgstr "文件发布器必须设置文件路径" #, python-format msgid "UDP: Cannot decode data sent by %s" -msgstr "UDP: 无法解码由 %s 发送的数据" +msgstr "UDP:无法解码由 %s 发送的数据" msgid "UDP: Unable to store meter" -msgstr "UDP: 无法存储计量器" +msgstr "UDP:无法存储计量器" #, python-format msgid "Unable to connect to the database server: %(errmsg)s." @@ -349,7 +348,7 @@ msgstr "无法连接到数据库服务器:%(errmsg)s。" #, python-format msgid "" "Unable to convert the value %(value)s to the expected data type %(type)s." -msgstr "无法转换%(value)s到预期的数据类型%(type)s。" +msgstr "无法将值 %(value)s 转换为预期的数据类型 %(type)s。" #, python-format msgid "Unable to discover resources: %s" @@ -361,7 +360,7 @@ msgstr "无法计算表达式%(expr)s:%(exc)s" #, python-format msgid "Unable to load publisher %s" -msgstr "无法加载发布器%s" +msgstr "无法加载发布器 %s" #, python-format msgid "Unable to load the hypervisor inspector: %s" @@ -386,11 +385,11 @@ msgstr "无法通过UDP发送采样" #, python-format msgid "" "Unexpected exception converting %(value)s to the expected data type %(type)s." -msgstr "在转换%(value)s到预期的数据类型%(type)s时发生了未预料的异常。" +msgstr "将 %(value)s 转换为预期的数据类型 %(type)s 时发生了意外的异常。" #, python-format msgid "Unknown discovery extension: %s" -msgstr "未知的发现器插件:%s" +msgstr "未知的发现扩展:%s" #, python-format msgid "Unknown metadata type. Key (%s) will not be queryable." @@ -441,7 +440,7 @@ msgstr "XenAPI没有安装" #, python-format msgid "YAML error reading Definitions file %(file)s" -msgstr "读取定义文件%(file)s时遇到YAML错误" +msgstr "读取定义文件 %(file)s 时遇到 YAML 错误" msgid "alarms URLs is unavailable when Aodh is disabled or unavailable." msgstr "Aodh 被禁用或不可用时,警报 URL 不可用。" diff --git a/ceilometer/locale/zh_TW/LC_MESSAGES/ceilometer.po b/ceilometer/locale/zh_TW/LC_MESSAGES/ceilometer.po index 714b393871..25ca23b9bb 100644 --- a/ceilometer/locale/zh_TW/LC_MESSAGES/ceilometer.po +++ b/ceilometer/locale/zh_TW/LC_MESSAGES/ceilometer.po @@ -4,19 +4,16 @@ # # Translators: # Stefano Maffulli , 2013 -# Lucas Palm , 2015. #zanata -# OpenStack Infra , 2015. #zanata # Jennifer , 2016. #zanata -# Lucas Palm , 2016. #zanata msgid "" msgstr "" -"Project-Id-Version: ceilometer 6.0.0.0rc4.dev1\n" +"Project-Id-Version: ceilometer 6.0.1.dev3\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-03-30 10:37+0000\n" +"POT-Creation-Date: 2016-04-07 10:58+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2016-03-31 03:41+0000\n" +"PO-Revision-Date: 2016-04-15 07:53+0000\n" "Last-Translator: Jennifer \n" "Language: zh-TW\n" "Plural-Forms: nplurals=1; plural=0;\n" @@ -67,7 +64,7 @@ msgstr "無法取得實例 %s 的 IP 位址" msgid "" "Dispatcher target was not set, no meter will be posted. Set the target in " "the ceilometer.conf file" -msgstr "未設定分派器目標,將不公佈任何計量。請在ceilometer.conf 檔中設定目標。" +msgstr "未設定分派器目標,將不公佈任何計量。請在ceilometer.conf 檔中設定目標" #, python-format msgid "Dropping Notification %(type)s (uuid:%(msgid)s)" @@ -92,7 +89,7 @@ msgid "Event" msgstr "事件" msgid "Expression evaluated to a NaN value!" -msgstr "表示式已求值為非數字值!" +msgstr "表示式求值結果為非數字值!" #, python-format msgid "Failed to import extension for %(name)s: %(error)s" @@ -109,14 +106,14 @@ msgid "" "Failed to inspect memory usage of %(instance_uuid)s, can not get info from " "libvirt: %(error)s" msgstr "" -"無法檢查 %(instance_uuid)s 的記憶體用量,無法從 libVirt 取得資訊:%(error)s" +"無法檢查 %(instance_uuid)s 的記憶體用量,無法從 libvirt 取得資訊:%(error)s" #, python-format msgid "" "Failed to inspect memory usage of instance , can " "not get info from libvirt." msgstr "" -"無法檢查實例 <名稱=%(name)s,ID=%(id)s> 的記憶體用量,無法從 libVirt 取得資" +"無法檢查實例 <名稱=%(name)s,ID=%(id)s> 的記憶體用量,無法從 libvirt 取得資" "訊。" #, python-format @@ -163,22 +160,22 @@ msgstr "正在忽略儲存區 %(pool_id)s" msgid "" "Invalid YAML syntax in Definitions file %(file)s at line: %(line)s, column: " "%(column)s." -msgstr "定義檔 %(file)s 第 %(line)s 行第 %(column)s 列中的 YAML 語法無效。" +msgstr "定義檔 %(file)s 第 %(line)s 行第 %(column)s 直欄中的 YAML 語法無效。" #, python-format msgid "Invalid period %(period)s: %(err)s" -msgstr "期間 %(period)s 無效:%(err)s" +msgstr "時間段 %(period)s 無效:%(err)s" #, python-format msgid "Invalid trait type '%(type)s' for trait %(trait)s" -msgstr "特徵 %(trait)s 的特徵類型 '%(type)s' 無效" +msgstr "特質 %(trait)s 的特質類型 '%(type)s' 無效" msgid "Limit must be positive" msgstr "限制值必須是正數" #, python-format msgid "More than one event with id %s returned from storage driver" -msgstr "從儲存體驅動程式傳回了多個 ID 為 %s 的事件" +msgstr "從儲存體驅動程式傳回了多於一個 ID 為 %s 的事件" #, python-format msgid "Multiple VM %s found in XenServer" @@ -228,7 +225,7 @@ msgid "" msgstr "%(name)s 的 JSONPath 規格 '%(jsonpath)s' 中發生剖析錯誤:%(err)s" msgid "Period must be positive." -msgstr "期間必須是正數。" +msgstr "時間段必須是正數。" #, python-format msgid "Pipeline %(pipeline)s: %(status)s after error from publisher %(pub)s" @@ -246,7 +243,7 @@ msgstr "管線 %(pipeline)s:清除轉換器 %(trans)s 時發生錯誤" msgid "" "Pipeline %(pipeline)s: Exit after error from transformer %(trans)s for " "%(smp)s" -msgstr "管線 %(pipeline)s:%(smp)s 的轉換器 %(trans)s傳回錯誤後結束" +msgstr "管線 %(pipeline)s:%(smp)s 的轉換器 %(trans)s 傳回錯誤後結束" #, python-format msgid "Plugin specified, but no plugin name supplied for %s" @@ -258,7 +255,7 @@ msgstr "輪詢 %(mtr)s 感應器已失敗 %(cnt)s 次!" #, python-format msgid "Polling %(name)s failed for %(cnt)s times!" -msgstr "輪詢 %(name)s 失敗了 %(cnt)s 次!" +msgstr "輪詢 %(name)s 已失敗 %(cnt)s 次!" #, python-format msgid "Pollster for %s is disabled!" @@ -308,7 +305,7 @@ msgstr "字串 %s 不是有效的 ISO 時間" msgid "" "The Yaml file that defines mapping between samples and gnocchi resources/" "metrics" -msgstr "用來在範例與 gnocchi 資源/度量之間定義對映的Yaml 檔案" +msgstr "用來定義範例與 gnocchi 資源/度量之間之對映的Yaml 檔案" #, python-format msgid "" From 6292e0e42b8d4602e08a876a53141c3ddbdcbb58 Mon Sep 17 00:00:00 2001 From: Kirill Bespalov Date: Wed, 20 Apr 2016 17:23:02 +0300 Subject: [PATCH 05/14] Fix notification listeners usage Closes-Bug: #1570468 Create the single notification pipeline listener and to aggregate targets and endpoints in it. In this implementation the incoming notification msg will be dispatched in a relevant endpoint by its own filter rule based on publisher id of a notifier, which sent this message. Each pipeline notifier has a conforming publisher id based on a pipeline name in which it to produce messages. Change-Id: If8c1c6838fd291ef8dbdd4d27c78fe5a36522178 (cherry picked from commit 726b2d4d67ada3df07f36ecfd81b0cf72881e159) --- ceilometer/notification.py | 79 +++++++++---------- ceilometer/pipeline.py | 2 + .../tests/functional/test_notification.py | 58 ++++++++++---- 3 files changed, 82 insertions(+), 57 deletions(-) diff --git a/ceilometer/notification.py b/ceilometer/notification.py index d9e4cafc20..b14317db16 100644 --- a/ceilometer/notification.py +++ b/ceilometer/notification.py @@ -110,7 +110,7 @@ class NotificationService(service_base.BaseService): notifiers.append(oslo_messaging.Notifier( transport, driver=cfg.CONF.publisher_notifier.telemetry_driver, - publisher_id='ceilometer.notification', + publisher_id=pipe.name, topic='%s-%s-%s' % (self.NOTIFICATION_IPC, pipe.name, x))) return notifiers @@ -146,7 +146,12 @@ class NotificationService(service_base.BaseService): super(NotificationService, self).start() self.partition_coordinator = None self.coord_lock = threading.Lock() - self.listeners, self.pipeline_listeners = [], [] + + self.listeners = [] + + # NOTE(kbespalov): for the pipeline queues used a single amqp host + # hence only one listener is required + self.pipeline_listener = None self.pipeline_manager = pipeline.setup_pipeline() @@ -174,7 +179,6 @@ class NotificationService(service_base.BaseService): self.event_pipe_manager = self._get_event_pipeline_manager( self.transport) - self.listeners, self.pipeline_listeners = [], [] self._configure_main_queue_listeners(self.pipe_manager, self.event_pipe_manager) @@ -188,7 +192,7 @@ class NotificationService(service_base.BaseService): self.tg.add_timer(cfg.CONF.coordination.check_watchers, self.partition_coordinator.run_watchers) # configure pipelines after all coordination is configured. - self._configure_pipeline_listeners() + self._configure_pipeline_listener() if not cfg.CONF.notification.disable_non_metric_meters: LOG.warning(_LW('Non-metric meters may be collected. It is highly ' @@ -243,9 +247,9 @@ class NotificationService(service_base.BaseService): self.listeners.append(listener) def _refresh_agent(self, event): - self._configure_pipeline_listeners(True) + self._configure_pipeline_listener() - def _configure_pipeline_listeners(self, reuse_listeners=False): + def _configure_pipeline_listener(self): with self.coord_lock: ev_pipes = [] if cfg.CONF.notification.store_events: @@ -256,40 +260,35 @@ class NotificationService(service_base.BaseService): self.group_id, range(cfg.CONF.notification.pipeline_processing_queues)) - queue_set = {} + endpoints = [] + targets = [] + + for pipe in pipelines: + if isinstance(pipe, pipeline.EventPipeline): + endpoints.append(pipeline.EventPipelineEndpoint(self.ctxt, + pipe)) + else: + endpoints.append(pipeline.SamplePipelineEndpoint(self.ctxt, + pipe)) + for pipe_set, pipe in itertools.product(partitioned, pipelines): - queue_set['%s-%s-%s' % - (self.NOTIFICATION_IPC, pipe.name, pipe_set)] = pipe + LOG.debug('Pipeline endpoint: %s from set: %s', + pipe.name, pipe_set) + topic = '%s-%s-%s' % (self.NOTIFICATION_IPC, + pipe.name, pipe_set) + targets.append(oslo_messaging.Target(topic=topic)) - if reuse_listeners: - topics = queue_set.keys() - kill_list = [] - for listener in self.pipeline_listeners: - if listener.dispatcher.targets[0].topic in topics: - queue_set.pop(listener.dispatcher.targets[0].topic) - else: - kill_list.append(listener) - for listener in kill_list: - utils.kill_listeners([listener]) - self.pipeline_listeners.remove(listener) - else: - utils.kill_listeners(self.pipeline_listeners) - self.pipeline_listeners = [] + if self.pipeline_listener: + self.pipeline_listener.stop() + self.pipeline_listener.wait() - for topic, pipe in queue_set.items(): - LOG.debug('Pipeline endpoint: %s from set: %s', pipe.name, - pipe_set) - pipe_endpoint = (pipeline.EventPipelineEndpoint - if isinstance(pipe, pipeline.EventPipeline) - else pipeline.SamplePipelineEndpoint) - listener = messaging.get_batch_notification_listener( - transport, - [oslo_messaging.Target(topic=topic)], - [pipe_endpoint(self.ctxt, pipe)], - batch_size=cfg.CONF.notification.batch_size, - batch_timeout=cfg.CONF.notification.batch_timeout) - listener.start() - self.pipeline_listeners.append(listener) + self.pipeline_listener = messaging.get_batch_notification_listener( + transport, + targets, + endpoints, + batch_size=cfg.CONF.notification.batch_size, + batch_timeout=cfg.CONF.notification.batch_timeout) + self.pipeline_listener.start() def stop(self): if getattr(self, 'partition_coordinator', None): @@ -297,8 +296,8 @@ class NotificationService(service_base.BaseService): listeners = [] if getattr(self, 'listeners', None): listeners.extend(self.listeners) - if getattr(self, 'pipeline_listeners', None): - listeners.extend(self.pipeline_listeners) + if getattr(self, 'pipeline_listener', None): + listeners.append(self.pipeline_listener) utils.kill_listeners(listeners) super(NotificationService, self).stop() @@ -321,4 +320,4 @@ class NotificationService(service_base.BaseService): # re-start the pipeline listeners if workload partitioning # is enabled. if cfg.CONF.notification.workload_partitioning: - self._configure_pipeline_listeners() + self._configure_pipeline_listener() diff --git a/ceilometer/pipeline.py b/ceilometer/pipeline.py index af20f3ab20..ebb091b74b 100644 --- a/ceilometer/pipeline.py +++ b/ceilometer/pipeline.py @@ -81,6 +81,8 @@ class PipelineException(Exception): class PipelineEndpoint(object): def __init__(self, context, pipeline): + self.filter_rule = oslo_messaging.NotificationFilter( + publisher_id=pipeline.name) self.publish_context = PublishContext(context, [pipeline]) @abc.abstractmethod diff --git a/ceilometer/tests/functional/test_notification.py b/ceilometer/tests/functional/test_notification.py index 32259f56b7..fc688a1dcd 100644 --- a/ceilometer/tests/functional/test_notification.py +++ b/ceilometer/tests/functional/test_notification.py @@ -257,7 +257,6 @@ class BaseRealNotification(tests_base.BaseTestCase): if (len(self.publisher.samples) >= self.expected_samples and len(self.publisher.events) >= self.expected_events): break - self.assertNotEqual(self.srv.listeners, self.srv.pipeline_listeners) self.srv.stop() resources = list(set(s.resource_id for s in self.publisher.samples)) @@ -387,31 +386,56 @@ class TestRealNotificationHA(BaseRealNotification): fake_publisher_cls.return_value = self.publisher self._check_notification_service() - def test_reset_listeners_on_refresh(self): + def test_reset_listener_on_refresh(self): self.srv.start() - listeners = self.srv.pipeline_listeners - self.assertEqual(20, len(listeners)) - self.srv._configure_pipeline_listeners() - self.assertEqual(20, len(self.srv.pipeline_listeners)) - for listener in listeners: - self.assertNotIn(listeners, set(self.srv.pipeline_listeners)) + listener = self.srv.pipeline_listener + self.assertEqual(20, + len(self.srv.pipeline_listener.dispatcher.targets)) + self.srv._configure_pipeline_listener() + self.assertEqual(20, + len(self.srv.pipeline_listener.dispatcher.targets)) + self.assertIsNot(listener, self.srv.pipeline_listener) self.srv.stop() - def test_retain_common_listeners_on_refresh(self): + def test_retain_common_targets_on_refresh(self): with mock.patch('ceilometer.coordination.PartitionCoordinator' '.extract_my_subset', return_value=[1, 2]): self.srv.start() - self.assertEqual(4, len(self.srv.pipeline_listeners)) - listeners = [listener for listener in self.srv.pipeline_listeners] + listened_before = [target.topic for target in + self.srv.pipeline_listener.dispatcher.targets] + self.assertEqual(4, len(listened_before)) with mock.patch('ceilometer.coordination.PartitionCoordinator' '.extract_my_subset', return_value=[1, 3]): self.srv._refresh_agent(None) - self.assertEqual(4, len(self.srv.pipeline_listeners)) - for listener in listeners: - if listener.dispatcher.targets[0].topic.endswith('1'): - self.assertIn(listener, set(self.srv.pipeline_listeners)) - else: - self.assertNotIn(listener, set(self.srv.pipeline_listeners)) + listened_after = [target.topic for target in + self.srv.pipeline_listener.dispatcher.targets] + self.assertEqual(4, len(listened_after)) + common = set(listened_before) & set(listened_after) + for topic in common: + self.assertTrue(topic.endswith('1')) + self.srv.stop() + + def test_notify_to_relevant_endpoint(self): + self.srv.start() + dispatcher = self.srv.pipeline_listener.dispatcher + self.assertIsNotEmpty(dispatcher.targets) + + endpoints = {} + + for endpoint in dispatcher.endpoints: + self.assertEqual(1, len(endpoint.publish_context.pipelines)) + pipe = list(endpoint.publish_context.pipelines)[0] + endpoints[pipe.name] = endpoint + + notifiers = [] + notifiers.extend(self.srv.pipe_manager.transporters[0][2]) + notifiers.extend(self.srv.event_pipe_manager.transporters[0][2]) + for notifier in notifiers: + filter_rule = endpoints[notifier.publisher_id].filter_rule + self.assertEqual(True, filter_rule.match(None, + notifier.publisher_id, + None, None, None)) + self.srv.stop() @mock.patch('oslo_messaging.Notifier.sample') From 75c48c06abd28fbb52315411651ecbcdeb73b1d0 Mon Sep 17 00:00:00 2001 From: ZhiQiang Fan Date: Tue, 10 May 2016 18:47:13 +0800 Subject: [PATCH 06/14] fix CI failure due to oslo.messaging 5.0.0 Recently, oslo.messaging does a refactor [1] which causes get_batch_notification_listener returns a new type BatchNotificationServer instead of previous MessageHandlingServer, they have different attributes, so our test code which relies on MessageHandlingServer fails in CI gate. This patch makes test code not rely on oslo.messaging details. [1] https://github.com/openstack/oslo.messaging/commit/990d894eaf0d18941b56d89bff2bca51de375640 Conflicts: ceilometer/tests/functional/test_notification.py Change-Id: Id588bb4c22ac819617c87de021cdf580c4e0d0f5 Closes-Bug: #1580930 (cherry picked from commit 23d5c9f648d8352aa205fbe46ba9796a5424874f) --- .../tests/functional/test_notification.py | 52 ++++++++++++------- 1 file changed, 34 insertions(+), 18 deletions(-) diff --git a/ceilometer/tests/functional/test_notification.py b/ceilometer/tests/functional/test_notification.py index fc688a1dcd..7ca0e549e6 100644 --- a/ceilometer/tests/functional/test_notification.py +++ b/ceilometer/tests/functional/test_notification.py @@ -156,10 +156,8 @@ class TestNotification(tests_base.BaseTestCase): self.srv.listeners[0].dispatcher.endpoints[0]) @mock.patch('ceilometer.pipeline.setup_pipeline', mock.MagicMock()) - @mock.patch.object(oslo_messaging.MessageHandlingServer, 'start', - mock.MagicMock()) - @mock.patch('ceilometer.event.endpoint.EventsNotificationEndpoint') - def test_unique_consumers(self, fake_event_endpoint_class): + @mock.patch('oslo_messaging.get_batch_notification_listener') + def test_unique_consumers(self, mock_listener): def fake_get_notifications_manager_dup_targets(pm): plugin = instance.Instance(pm) @@ -171,7 +169,10 @@ class TestNotification(tests_base.BaseTestCase): '_get_notifications_manager') as get_nm: get_nm.side_effect = fake_get_notifications_manager_dup_targets self.srv.start() - self.assertEqual(1, len(self.srv.listeners[0].dispatcher.targets)) + self.assertEqual(1, len(mock_listener.call_args_list)) + args, kwargs = mock_listener.call_args + self.assertEqual(1, len(args[1])) + self.assertIsInstance(args[1][0], oslo_messaging.Target) class BaseRealNotification(tests_base.BaseTestCase): @@ -386,43 +387,58 @@ class TestRealNotificationHA(BaseRealNotification): fake_publisher_cls.return_value = self.publisher self._check_notification_service() - def test_reset_listener_on_refresh(self): + @mock.patch('oslo_messaging.get_batch_notification_listener') + def test_reset_listener_on_refresh(self, mock_listener): + mock_listener.side_effect = [ + mock.MagicMock(), # main listener + mock.MagicMock(), # pipeline listener + mock.MagicMock(), # refresh pipeline listener + ] + self.srv.start() + + def _check_listener_targets(): + args, kwargs = mock_listener.call_args + self.assertEqual(20, len(args[1])) + self.assertIsInstance(args[1][0], oslo_messaging.Target) + + _check_listener_targets() + listener = self.srv.pipeline_listener - self.assertEqual(20, - len(self.srv.pipeline_listener.dispatcher.targets)) self.srv._configure_pipeline_listener() - self.assertEqual(20, - len(self.srv.pipeline_listener.dispatcher.targets)) self.assertIsNot(listener, self.srv.pipeline_listener) + _check_listener_targets() + self.srv.stop() - def test_retain_common_targets_on_refresh(self): + @mock.patch('oslo_messaging.get_batch_notification_listener') + def test_retain_common_targets_on_refresh(self, mock_listener): with mock.patch('ceilometer.coordination.PartitionCoordinator' '.extract_my_subset', return_value=[1, 2]): self.srv.start() listened_before = [target.topic for target in - self.srv.pipeline_listener.dispatcher.targets] + mock_listener.call_args[0][1]] self.assertEqual(4, len(listened_before)) with mock.patch('ceilometer.coordination.PartitionCoordinator' '.extract_my_subset', return_value=[1, 3]): self.srv._refresh_agent(None) listened_after = [target.topic for target in - self.srv.pipeline_listener.dispatcher.targets] + mock_listener.call_args[0][1]] self.assertEqual(4, len(listened_after)) common = set(listened_before) & set(listened_after) for topic in common: self.assertTrue(topic.endswith('1')) self.srv.stop() - def test_notify_to_relevant_endpoint(self): + @mock.patch('oslo_messaging.get_batch_notification_listener') + def test_notify_to_relevant_endpoint(self, mock_listener): self.srv.start() - dispatcher = self.srv.pipeline_listener.dispatcher - self.assertIsNotEmpty(dispatcher.targets) + + targets = mock_listener.call_args[0][1] + self.assertIsNotEmpty(targets) endpoints = {} - - for endpoint in dispatcher.endpoints: + for endpoint in mock_listener.call_args[0][2]: self.assertEqual(1, len(endpoint.publish_context.pipelines)) pipe = list(endpoint.publish_context.pipelines)[0] endpoints[pipe.name] = endpoint From 9cf0397973650d872665433721739bf8210f8dd9 Mon Sep 17 00:00:00 2001 From: ZhiQiang Fan Date: Wed, 27 Apr 2016 23:46:19 +0800 Subject: [PATCH 07/14] [Trivial] Update Neutron resource status list According to https://github.com/openstack/neutron/blob/master/neutron/plugins/common/constants.py there are more status values than the list we currently use, we should update it, otherwise volume will be default -1 Note: update unit test code because we recognize new status now. Change-Id: Ic6a42fb8a77c6e4fa7ce41cb16ab021cf77f567c (cherry picked from commit c6022ffcee8a202aebda41681e3b32321fbbed85) --- ceilometer/network/services/base.py | 5 +++++ ceilometer/tests/unit/network/services/test_fwaas.py | 2 +- ceilometer/tests/unit/network/services/test_lbaas.py | 6 +++--- ceilometer/tests/unit/network/services/test_vpnaas.py | 2 +- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/ceilometer/network/services/base.py b/ceilometer/network/services/base.py index 0123300580..4aa666bdc4 100644 --- a/ceilometer/network/services/base.py +++ b/ceilometer/network/services/base.py @@ -21,6 +21,11 @@ STATUS = { 'inactive': 0, 'active': 1, 'pending_create': 2, + 'down': 3, + 'created': 4, + 'pending_update': 5, + 'pending_delete': 6, + 'error': 7, } diff --git a/ceilometer/tests/unit/network/services/test_fwaas.py b/ceilometer/tests/unit/network/services/test_fwaas.py index 8aa55f1441..4d2365f2f8 100644 --- a/ceilometer/tests/unit/network/services/test_fwaas.py +++ b/ceilometer/tests/unit/network/services/test_fwaas.py @@ -85,7 +85,7 @@ class TestFirewallPollster(_BaseTestFWPollster): samples = list(self.pollster.get_samples( self.manager, {}, resources=self.fake_get_fw_service())) - self.assertEqual(3, len(samples)) + self.assertEqual(4, len(samples)) for field in self.pollster.FIELDS: self.assertEqual(self.fake_get_fw_service()[0][field], samples[0].resource_metadata[field]) diff --git a/ceilometer/tests/unit/network/services/test_lbaas.py b/ceilometer/tests/unit/network/services/test_lbaas.py index d8a4339085..0ee4d875c1 100644 --- a/ceilometer/tests/unit/network/services/test_lbaas.py +++ b/ceilometer/tests/unit/network/services/test_lbaas.py @@ -137,7 +137,7 @@ class TestLBPoolPollster(_BaseTestLBPollster): samples = list(self.pollster.get_samples( self.manager, {}, resources=self.fake_get_pools())) - self.assertEqual(3, len(samples)) + self.assertEqual(4, len(samples)) for field in self.pollster.FIELDS: self.assertEqual(self.fake_get_pools()[0][field], samples[0].resource_metadata[field]) @@ -260,7 +260,7 @@ class TestLBVipPollster(_BaseTestLBPollster): samples = list(self.pollster.get_samples( self.manager, {}, resources=self.fake_get_vips())) - self.assertEqual(3, len(samples)) + self.assertEqual(4, len(samples)) for field in self.pollster.FIELDS: self.assertEqual(self.fake_get_vips()[0][field], samples[0].resource_metadata[field]) @@ -353,7 +353,7 @@ class TestLBMemberPollster(_BaseTestLBPollster): samples = list(self.pollster.get_samples( self.manager, {}, self.fake_get_members())) - self.assertEqual(3, len(samples)) + self.assertEqual(4, len(samples)) for field in self.pollster.FIELDS: self.assertEqual(self.fake_get_members()[0][field], samples[0].resource_metadata[field]) diff --git a/ceilometer/tests/unit/network/services/test_vpnaas.py b/ceilometer/tests/unit/network/services/test_vpnaas.py index 880f82faf9..86e4098a4b 100644 --- a/ceilometer/tests/unit/network/services/test_vpnaas.py +++ b/ceilometer/tests/unit/network/services/test_vpnaas.py @@ -89,7 +89,7 @@ class TestVPNServicesPollster(_BaseTestVPNPollster): samples = list(self.pollster.get_samples( self.manager, {}, resources=self.fake_get_vpn_service())) - self.assertEqual(3, len(samples)) + self.assertEqual(4, len(samples)) for field in self.pollster.FIELDS: self.assertEqual(self.fake_get_vpn_service()[0][field], samples[0].resource_metadata[field]) From 9ba3c494042b6d77a38a95978579363c27882430 Mon Sep 17 00:00:00 2001 From: OpenStack Proposal Bot Date: Wed, 18 May 2016 13:42:54 +0000 Subject: [PATCH 08/14] Updated from global requirements Change-Id: I07d21892a14818a6cef459ef0d73e3d7ee877987 --- requirements.txt | 2 +- test-requirements.txt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/requirements.txt b/requirements.txt index 15d199affe..5b3158cfb1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -29,7 +29,7 @@ oslo.utils>=3.5.0 # Apache-2.0 pysnmp<5.0.0,>=4.2.3 # BSD python-ceilometerclient>=2.2.1 # Apache-2.0 python-glanceclient>=2.0.0 # Apache-2.0 -python-keystoneclient!=1.8.0,!=2.1.0,>=1.6.0 # Apache-2.0 +python-keystoneclient!=1.8.0,!=2.1.0,<3.0.0,>=1.6.0 # Apache-2.0 keystoneauth1>=2.1.0 # Apache-2.0 python-neutronclient!=4.1.0,>=2.6.0 # Apache-2.0 python-novaclient!=2.33.0,>=2.29.0 # Apache-2.0 diff --git a/test-requirements.txt b/test-requirements.txt index 6ffbce0432..3ddf02b3ab 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -4,11 +4,11 @@ # Hacking already pins down pep8, pyflakes and flake8 hacking<0.11,>=0.10.0 -Babel>=1.3 # BSD +Babel!=2.3.0,!=2.3.1,!=2.3.2,!=2.3.3,>=1.3 # BSD contextlib2>=0.4.0 # PSF License coverage>=3.6 # Apache-2.0 elasticsearch<2.0,>=1.3.0 # Apache-2.0 -fixtures>=1.3.1 # Apache-2.0/BSD +fixtures<2.0,>=1.3.1 # Apache-2.0/BSD happybase!=0.7,>=0.5;python_version=='2.7' # MIT mock>=1.2 # BSD PyMySQL>=0.6.2 # MIT License From 1c0b83cbbb2eace581ad86c42e7e60f0d0537bf2 Mon Sep 17 00:00:00 2001 From: Emilien Macchi Date: Wed, 18 May 2016 16:36:42 +0200 Subject: [PATCH 09/14] tempest_plugin: drop telemetry decorator Since [1], 'telemetry' service does not exist and Tempest plugin is now broken: InvalidServiceTag: Invalid service tag Details: telemetry is not a valid service This patch update the test_object_storage_telemetry_middleware test to match with the Tempest cleanup. [1] https://github.com/openstack/tempest/commit/e4796f8de446aaaafa83902d1fb2d613331436cf Change-Id: I2ae71b722826a4e377a4926c943d1dbce3b1ed9f (cherry picked from commit aa32401c32ab41ec202ab8a440e22046e8c827c4) --- .../scenario/test_object_storage_telemetry_middleware.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ceilometer/tests/tempest/scenario/test_object_storage_telemetry_middleware.py b/ceilometer/tests/tempest/scenario/test_object_storage_telemetry_middleware.py index 4bb287d0b5..f4a1b1d9bc 100644 --- a/ceilometer/tests/tempest/scenario/test_object_storage_telemetry_middleware.py +++ b/ceilometer/tests/tempest/scenario/test_object_storage_telemetry_middleware.py @@ -139,7 +139,7 @@ class TestObjectStorageTelemetry(test.BaseTestCase): return obj_name @test.idempotent_id('6d6b88e5-3e38-41bc-b34a-79f713a6cb85') - @test.services('object_storage', 'telemetry') + @test.services('object_storage') def test_swift_middleware_notifies(self): container_name = self.create_container() obj_name = self.upload_object_to_container(container_name) From 9d2864fa04d874d6923322e362c53d55a4a5400d Mon Sep 17 00:00:00 2001 From: OpenStack Proposal Bot Date: Fri, 20 May 2016 07:19:43 +0000 Subject: [PATCH 10/14] Imported Translations from Zanata For more information about this automatic import see: https://wiki.openstack.org/wiki/Translations/Infrastructure Change-Id: I5e06b8fa21b79beedfd68b7668c9470be4c9244c --- ceilometer/locale/ceilometer-log-error.pot | 181 ------ ceilometer/locale/ceilometer-log-info.pot | 163 ----- ceilometer/locale/ceilometer-log-warning.pot | 164 ----- ceilometer/locale/ceilometer.pot | 570 ------------------ .../de/LC_MESSAGES/ceilometer-log-error.po | 6 +- .../de/LC_MESSAGES/ceilometer-log-info.po | 13 +- .../de/LC_MESSAGES/ceilometer-log-warning.po | 6 +- .../locale/de/LC_MESSAGES/ceilometer.po | 6 +- .../es/LC_MESSAGES/ceilometer-log-error.po | 6 +- .../es/LC_MESSAGES/ceilometer-log-info.po | 6 +- .../locale/es/LC_MESSAGES/ceilometer.po | 136 +++-- .../locale/fr/LC_MESSAGES/ceilometer.po | 211 +++---- .../locale/it/LC_MESSAGES/ceilometer.po | 6 +- .../locale/ja/LC_MESSAGES/ceilometer.po | 6 +- .../ko_KR/LC_MESSAGES/ceilometer-log-error.po | 12 +- .../ko_KR/LC_MESSAGES/ceilometer-log-info.po | 6 +- .../LC_MESSAGES/ceilometer-log-warning.po | 6 +- .../locale/ko_KR/LC_MESSAGES/ceilometer.po | 6 +- .../locale/pt_BR/LC_MESSAGES/ceilometer.po | 107 ++-- .../locale/ru/LC_MESSAGES/ceilometer.po | 6 +- .../locale/zh_CN/LC_MESSAGES/ceilometer.po | 136 ++--- .../locale/zh_TW/LC_MESSAGES/ceilometer.po | 12 +- 22 files changed, 348 insertions(+), 1423 deletions(-) delete mode 100644 ceilometer/locale/ceilometer-log-error.pot delete mode 100644 ceilometer/locale/ceilometer-log-info.pot delete mode 100644 ceilometer/locale/ceilometer-log-warning.pot delete mode 100644 ceilometer/locale/ceilometer.pot diff --git a/ceilometer/locale/ceilometer-log-error.pot b/ceilometer/locale/ceilometer-log-error.pot deleted file mode 100644 index ffa5f25a75..0000000000 --- a/ceilometer/locale/ceilometer-log-error.pot +++ /dev/null @@ -1,181 +0,0 @@ -# Translations template for ceilometer. -# Copyright (C) 2016 ORGANIZATION -# This file is distributed under the same license as the ceilometer project. -# FIRST AUTHOR , 2016. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: ceilometer 6.0.1.dev3\n" -"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" -"POT-Creation-Date: 2016-04-21 07:16+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.2.0\n" - -#: ceilometer/collector.py:163 -#, python-format -msgid "Dispatcher failed to handle the %s, requeue it." -msgstr "" - -#: ceilometer/coordination.py:50 -msgid "" -"Group ID: %{group_id}s, Members: %{members}s, Me: %{me}s: Current agent " -"is not part of group and cannot take tasks" -msgstr "" - -#: ceilometer/coordination.py:88 ceilometer/coordination.py:100 -msgid "Error connecting to coordination backend." -msgstr "" - -#: ceilometer/coordination.py:115 -msgid "Error sending a heartbeat to coordination backend." -msgstr "" - -#: ceilometer/coordination.py:146 -#, python-format -msgid "Error joining partitioning group %s, re-trying" -msgstr "" - -#: ceilometer/coordination.py:198 -msgid "Error getting group membership info from coordination backend." -msgstr "" - -#: ceilometer/service_base.py:118 -#, python-format -msgid "Unable to load changed pipeline: %s" -msgstr "" - -#: ceilometer/service_base.py:140 -#, python-format -msgid "Unable to load changed event pipeline: %s" -msgstr "" - -#: ceilometer/agent/manager.py:467 -#, python-format -msgid "Skipping %(name)s, keystone issue: %(exc)s" -msgstr "" - -#: ceilometer/agent/plugin_base.py:109 -msgid "Fail to process notification" -msgstr "" - -#: ceilometer/api/hooks.py:65 -#, python-format -msgid "Failed to connect to db, purpose %(purpose)s retry later: %(err)s" -msgstr "" - -#: ceilometer/compute/pollsters/memory.py:108 -#, python-format -msgid "Could not get Resident Memory Usage for %(id)s: %(e)s" -msgstr "" - -#: ceilometer/dispatcher/database.py:54 -#, python-format -msgid "Failed to connect to db, purpose %(purpose)s re-try later: %(err)s" -msgstr "" - -#: ceilometer/dispatcher/database.py:97 -#, python-format -msgid "Failed to record metering data: %s" -msgstr "" - -#: ceilometer/dispatcher/database.py:128 -#, python-format -msgid "Error processing event and it will be dropped: %s" -msgstr "" - -#: ceilometer/dispatcher/gnocchi.py:102 -#, python-format -msgid "Required field %s not specified" -msgstr "" - -#: ceilometer/dispatcher/gnocchi.py:105 -#, python-format -msgid "Required field %(field)s should be a %(type)s" -msgstr "" - -#: ceilometer/dispatcher/gnocchi.py:234 -msgid "Failed to connect to Gnocchi." -msgstr "" - -#: ceilometer/dispatcher/gnocchi.py:250 -#, python-format -msgid "Failed to load resource due to error %s" -msgstr "" - -#: ceilometer/dispatcher/http.py:126 -msgid "Status Code: %{code}s. Failed todispatch event: %{event}s" -msgstr "" - -#: ceilometer/event/endpoint.py:69 -msgid "Fail to process a notification" -msgstr "" - -#: ceilometer/event/storage/impl_elasticsearch.py:110 -#: ceilometer/event/storage/impl_hbase.py:121 -#: ceilometer/event/storage/impl_sqlalchemy.py:207 -#: ceilometer/event/storage/impl_sqlalchemy.py:209 -#: ceilometer/event/storage/pymongo_base.py:69 -#, python-format -msgid "Failed to record event: %s" -msgstr "" - -#: ceilometer/hardware/pollsters/generic.py:69 -#, python-format -msgid "Missing field %s" -msgstr "" - -#: ceilometer/hardware/pollsters/generic.py:72 -#, python-format -msgid "Unrecognized type value %s" -msgstr "" - -#: ceilometer/hardware/pollsters/generic.py:107 -msgid "Passed resource dict must contain keys resource_id and resource_url." -msgstr "" - -#: ceilometer/hardware/pollsters/generic.py:126 -#, python-format -msgid "Cannot load inspector %(name)s: %(err)s" -msgstr "" - -#: ceilometer/hardware/pollsters/generic.py:149 -#, python-format -msgid "Skip invalid resource %s" -msgstr "" - -#: ceilometer/hardware/pollsters/generic.py:177 -#, python-format -msgid "inspector call failed for %(ident)s host %(host)s: %(err)s" -msgstr "" - -#: ceilometer/hardware/pollsters/generic.py:227 -#: ceilometer/meter/notifications.py:197 -#, python-format -msgid "Error loading meter definition : %(err)s" -msgstr "" - -#: ceilometer/meter/notifications.py:65 -#, python-format -msgid "Required fields %s not specified" -msgstr "" - -#: ceilometer/meter/notifications.py:74 -#, python-format -msgid "Invalid type %s specified" -msgstr "" - -#: ceilometer/publisher/kafka_broker.py:83 -#, python-format -msgid "Failed to connect to Kafka service: %s" -msgstr "" - -#: ceilometer/publisher/messaging.py:168 -msgid "Failed to retry to send sample data with max_retry times" -msgstr "" - diff --git a/ceilometer/locale/ceilometer-log-info.pot b/ceilometer/locale/ceilometer-log-info.pot deleted file mode 100644 index bed5888c8f..0000000000 --- a/ceilometer/locale/ceilometer-log-info.pot +++ /dev/null @@ -1,163 +0,0 @@ -# Translations template for ceilometer. -# Copyright (C) 2016 ORGANIZATION -# This file is distributed under the same license as the ceilometer project. -# FIRST AUTHOR , 2016. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: ceilometer 6.0.1.dev3\n" -"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" -"POT-Creation-Date: 2016-04-21 07:16+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.2.0\n" - -#: ceilometer/coordination.py:86 -msgid "Coordination backend started successfully." -msgstr "" - -#: ceilometer/coordination.py:135 -#, python-format -msgid "Joined partitioning group %s" -msgstr "" - -#: ceilometer/coordination.py:156 -#, python-format -msgid "Left partitioning group %s" -msgstr "" - -#: ceilometer/declarative.py:174 -#, python-format -msgid "Definitions: %s" -msgstr "" - -#: ceilometer/notification.py:306 -msgid "Reloading notification agent and listeners." -msgstr "" - -#: ceilometer/pipeline.py:409 -#, python-format -msgid "" -"Pipeline %(pipeline)s: Setup transformer instance %(name)s with parameter" -" %(param)s" -msgstr "" - -#: ceilometer/pipeline.py:705 ceilometer/pipeline.py:767 -msgid "detected decoupled pipeline config format" -msgstr "" - -#: ceilometer/pipeline.py:791 ceilometer/pipeline.py:810 -#, python-format -msgid "Pipeline config: %s" -msgstr "" - -#: ceilometer/service_base.py:86 -msgid "Pipeline configuration file has been updated." -msgstr "" - -#: ceilometer/service_base.py:92 -msgid "Detected change in pipeline configuration." -msgstr "" - -#: ceilometer/agent/manager.py:177 -#, python-format -msgid "Skip pollster %(name)s, no %(p_context)sresources found this cycle" -msgstr "" - -#: ceilometer/agent/manager.py:182 -#, python-format -msgid "Polling pollster %(poll)s in the context of %(src)s" -msgstr "" - -#: ceilometer/agent/manager.py:486 -msgid "Reconfiguring polling tasks." -msgstr "" - -#: ceilometer/api/app.py:109 -#, python-format -msgid "Starting server in PID %s" -msgstr "" - -#: ceilometer/api/app.py:110 -msgid "Configuration:" -msgstr "" - -#: ceilometer/api/app.py:114 -#, python-format -msgid "serving on 0.0.0.0:%(sport)s, view at http://127.0.0.1:%(vport)s" -msgstr "" - -#: ceilometer/api/app.py:118 -#, python-format -msgid "serving on http://%(host)s:%(port)s" -msgstr "" - -#: ceilometer/api/controllers/v2/utils.py:47 -#, python-format -msgid "No limit value provided, result set will be limited to %(limit)d." -msgstr "" - -#: ceilometer/cmd/storage.py:44 -msgid "Nothing to clean, database metering time to live is disabled" -msgstr "" - -#: ceilometer/cmd/storage.py:53 -msgid "Nothing to clean, database event time to live is disabled" -msgstr "" - -#: ceilometer/event/storage/impl_elasticsearch.py:107 -#: ceilometer/event/storage/impl_sqlalchemy.py:205 -#: ceilometer/event/storage/pymongo_base.py:67 -#, python-format -msgid "Duplicate event detected, skipping it: %s" -msgstr "" - -#: ceilometer/event/storage/impl_log.py:33 -#, python-format -msgid "Dropping event data with TTL %d" -msgstr "" - -#: ceilometer/event/storage/impl_sqlalchemy.py:443 -#, python-format -msgid "%d events are removed from database" -msgstr "" - -#: ceilometer/publisher/messaging.py:93 -#, python-format -msgid "Publishing policy set to %s" -msgstr "" - -#: ceilometer/storage/impl_log.py:41 -#, python-format -msgid "metering data %(counter_name)s for %(resource_id)s: %(counter_volume)s" -msgstr "" - -#: ceilometer/storage/impl_log.py:53 -#, python-format -msgid "Dropping metering data with TTL %d" -msgstr "" - -#: ceilometer/storage/impl_sqlalchemy.py:372 -#, python-format -msgid "%d samples removed from database" -msgstr "" - -#: ceilometer/storage/impl_sqlalchemy.py:408 -msgid "Expired residual resource and meter definition data" -msgstr "" - -#: ceilometer/storage/mongo/utils.py:260 -#, python-format -msgid "Connecting to %(db)s on %(nodelist)s" -msgstr "" - -#: ceilometer/storage/mongo/utils.py:463 -#, python-format -msgid "Index %s will be recreate." -msgstr "" - diff --git a/ceilometer/locale/ceilometer-log-warning.pot b/ceilometer/locale/ceilometer-log-warning.pot deleted file mode 100644 index 4af95da7cd..0000000000 --- a/ceilometer/locale/ceilometer-log-warning.pot +++ /dev/null @@ -1,164 +0,0 @@ -# Translations template for ceilometer. -# Copyright (C) 2016 ORGANIZATION -# This file is distributed under the same license as the ceilometer project. -# FIRST AUTHOR , 2016. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: ceilometer 6.0.1.dev3\n" -"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" -"POT-Creation-Date: 2016-04-21 07:16+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.2.0\n" - -#: ceilometer/coordination.py:186 -msgid "" -"Cannot extract tasks because agent failed to join group properly. " -"Rejoining group." -msgstr "" - -#: ceilometer/notification.py:194 -msgid "" -"Non-metric meters may be collected. It is highly advisable to disable " -"these meters using ceilometer.conf or the pipeline.yaml" -msgstr "" - -#: ceilometer/pipeline.py:582 -#, python-format -msgid "" -"metering data %(counter_name)s for %(resource_id)s @ %(timestamp)s has no" -" volume (volume: None), the sample will be dropped" -msgstr "" - -#: ceilometer/pipeline.py:595 -#, python-format -msgid "" -"metering data %(counter_name)s for %(resource_id)s @ %(timestamp)s has " -"volume which is not a number (volume: %(counter_volume)s), the sample " -"will be dropped" -msgstr "" - -#: ceilometer/agent/manager.py:452 -#, python-format -msgid "Skipping %(name)s, %(service_type)s service is not registered in keystone" -msgstr "" - -#: ceilometer/agent/discovery/endpoint.py:44 -#, python-format -msgid "No endpoints found for service %s" -msgstr "" - -#: ceilometer/api/app.py:75 -msgid "" -"pecan_debug cannot be enabled, if workers is > 1, the value is overrided " -"with False" -msgstr "" - -#: ceilometer/api/controllers/v2/root.py:128 -msgid "Can't connect to keystone, assuming gnocchi is disabled and retry later" -msgstr "" - -#: ceilometer/api/controllers/v2/root.py:132 -msgid "" -"ceilometer-api started with gnocchi enabled. The resources/meters/samples" -" URLs are disabled." -msgstr "" - -#: ceilometer/api/controllers/v2/root.py:154 -msgid "Can't connect to keystone, assuming aodh is disabled and retry later." -msgstr "" - -#: ceilometer/api/controllers/v2/root.py:157 -msgid "" -"ceilometer-api started with aodh enabled. Alarms URLs will be redirected " -"to aodh endpoint." -msgstr "" - -#: ceilometer/cmd/polling.py:55 -#, python-format -msgid "Duplicated values: %s found in CLI options, auto de-duplicated" -msgstr "" - -#: ceilometer/compute/pollsters/memory.py:56 -#: ceilometer/compute/pollsters/memory.py:99 -#, python-format -msgid "" -"Cannot inspect data of %(pollster)s for %(instance_id)s, non-fatal " -"reason: %(exc)s" -msgstr "" - -#: ceilometer/dispatcher/__init__.py:68 -#, python-format -msgid "Failed to load any dispatchers for %s" -msgstr "" - -#: ceilometer/dispatcher/database.py:102 -#, python-format -msgid "message signature invalid, discarding message: %r" -msgstr "" - -#: ceilometer/dispatcher/database.py:131 ceilometer/dispatcher/http.py:130 -#, python-format -msgid "event signature invalid, discarding event: %s" -msgstr "" - -#: ceilometer/dispatcher/gnocchi.py:215 -#, python-format -msgid "unable to configure oslo_cache: %s" -msgstr "" - -#: ceilometer/event/trait_plugins.py:126 -#, python-format -msgid "" -"split plugin is deprecated, add \".`split(%(sep)s, %(segment)d, " -"%(max_split)d)`\" to your jsonpath instead" -msgstr "" - -#: ceilometer/event/trait_plugins.py:216 -msgid "" -"Timedelta plugin is required two timestamp fields to create timedelta " -"value." -msgstr "" - -#: ceilometer/event/trait_plugins.py:224 -#, python-format -msgid "" -"Failed to parse date from set fields, both fields %(start)s and %(end)s " -"must be datetime: %(err)s" -msgstr "" - -#: ceilometer/hardware/pollsters/generic.py:65 -#, python-format -msgid "Ignore unrecognized field %s" -msgstr "" - -#: ceilometer/meter/notifications.py:189 -#, python-format -msgid "Skipping duplicate meter definition %s" -msgstr "" - -#: ceilometer/network/floatingip.py:66 -#, python-format -msgid "Invalid status, skipping IP address %s" -msgstr "" - -#: ceilometer/transformer/conversions.py:88 -#, python-format -msgid "Dropping out of time order sample: %s" -msgstr "" - -#: ceilometer/transformer/conversions.py:94 -msgid "Negative delta detected, dropping value" -msgstr "" - -#: ceilometer/transformer/conversions.py:100 -#, python-format -msgid "Dropping sample with no predecessor: %s" -msgstr "" - diff --git a/ceilometer/locale/ceilometer.pot b/ceilometer/locale/ceilometer.pot deleted file mode 100644 index 180a557ae2..0000000000 --- a/ceilometer/locale/ceilometer.pot +++ /dev/null @@ -1,570 +0,0 @@ -# Translations template for ceilometer. -# Copyright (C) 2016 ORGANIZATION -# This file is distributed under the same license as the ceilometer project. -# FIRST AUTHOR , 2016. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: ceilometer 6.0.1.dev3\n" -"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" -"POT-Creation-Date: 2016-04-21 07:16+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.2.0\n" - -#: ceilometer/collector.py:123 -#, python-format -msgid "UDP: Cannot decode data sent by %s" -msgstr "" - -#: ceilometer/collector.py:130 -msgid "UDP: Unable to store meter" -msgstr "" - -#: ceilometer/declarative.py:44 -#, python-format -msgid "The field 'fields' is required for %s" -msgstr "" - -#: ceilometer/declarative.py:57 -#, python-format -msgid "Plugin specified, but no plugin name supplied for %s" -msgstr "" - -#: ceilometer/declarative.py:66 -#, python-format -msgid "No plugin named %(plugin)s available for %(name)s" -msgstr "" - -#: ceilometer/declarative.py:92 -#, python-format -msgid "Parse error in JSONPath specification '%(jsonpath)s' for %(name)s: %(err)s" -msgstr "" - -#: ceilometer/declarative.py:157 -#, python-format -msgid "" -"Invalid YAML syntax in Definitions file %(file)s at line: %(line)s, " -"column: %(column)s." -msgstr "" - -#: ceilometer/declarative.py:163 -#, python-format -msgid "YAML error reading Definitions file %(file)s" -msgstr "" - -#: ceilometer/notification.py:206 -#, python-format -msgid "Failed to load any notification handlers for %s" -msgstr "" - -#: ceilometer/pipeline.py:390 -#, python-format -msgid "Unable to load publisher %s" -msgstr "" - -#: ceilometer/pipeline.py:428 -#, python-format -msgid "Pipeline %(pipeline)s: %(status)s after error from publisher %(pub)s" -msgstr "" - -#: ceilometer/pipeline.py:458 -#, python-format -msgid "" -"Pipeline %(pipeline)s: Exit after error from transformer %(trans)s for " -"%(smp)s" -msgstr "" - -#: ceilometer/pipeline.py:495 -#, python-format -msgid "Pipeline %(pipeline)s: Continue after error from publisher %(pub)s" -msgstr "" - -#: ceilometer/pipeline.py:511 -#, python-format -msgid "Pipeline %(pipeline)s: Error flushing transformer %(trans)s" -msgstr "" - -#: ceilometer/agent/manager.py:207 -#, python-format -msgid "Prevent pollster %(name)s for polling source %(source)s anymore!" -msgstr "" - -#: ceilometer/agent/manager.py:213 -#, python-format -msgid "Continue after error from %(name)s: %(error)s" -msgstr "" - -#: ceilometer/agent/manager.py:289 -#, python-format -msgid "Skip loading extension for %s" -msgstr "" - -#: ceilometer/agent/manager.py:292 -#, python-format -msgid "Failed to import extension for %(name)s: %(error)s" -msgstr "" - -#: ceilometer/agent/manager.py:470 -#, python-format -msgid "Unable to discover resources: %s" -msgstr "" - -#: ceilometer/agent/manager.py:472 -#, python-format -msgid "Unknown discovery extension: %s" -msgstr "" - -#: ceilometer/agent/manager.py:481 -msgid "Error stopping pollster." -msgstr "" - -#: ceilometer/api/middleware.py:102 -#, python-format -msgid "Error parsing HTTP response: %s" -msgstr "" - -#: ceilometer/api/controllers/v2/base.py:50 -#, python-format -msgid "%(entity)s %(id)s Not Found" -msgstr "" - -#: ceilometer/api/controllers/v2/base.py:59 -#, python-format -msgid "Not Authorized to access %(aspect)s %(id)s" -msgstr "" - -#: ceilometer/api/controllers/v2/base.py:220 -#, python-format -msgid "Unable to convert the value %(value)s to the expected data type %(type)s." -msgstr "" - -#: ceilometer/api/controllers/v2/base.py:225 -#, python-format -msgid "" -"The data type %(type)s is not supported. The supported data type list is:" -" %(supported)s" -msgstr "" - -#: ceilometer/api/controllers/v2/base.py:230 -#, python-format -msgid "" -"Unexpected exception converting %(value)s to the expected data type " -"%(type)s." -msgstr "" - -#: ceilometer/api/controllers/v2/events.py:190 -#, python-format -msgid "" -"Operator %(operator)s is not supported. The supported operators are: " -"%(supported)s" -msgstr "" - -#: ceilometer/api/controllers/v2/events.py:196 -#, python-format -msgid "" -"Operator %(operator)s is not supported. Only equality operator is " -"available for field %(field)s" -msgstr "" - -#: ceilometer/api/controllers/v2/events.py:303 -msgid "Event" -msgstr "" - -#: ceilometer/api/controllers/v2/events.py:306 -#, python-format -msgid "More than one event with id %s returned from storage driver" -msgstr "" - -#: ceilometer/api/controllers/v2/meters.py:308 -msgid "Samples should be included in request body" -msgstr "" - -#: ceilometer/api/controllers/v2/meters.py:394 -msgid "Period must be positive." -msgstr "" - -#: ceilometer/api/controllers/v2/meters.py:423 -#, python-format -msgid "Invalid period %(period)s: %(err)s" -msgstr "" - -#: ceilometer/api/controllers/v2/query.py:203 -#, python-format -msgid "Filter expression not valid: %s" -msgstr "" - -#: ceilometer/api/controllers/v2/query.py:218 -#, python-format -msgid "Order-by expression not valid: %s" -msgstr "" - -#: ceilometer/api/controllers/v2/query.py:316 -#, python-format -msgid "String %s is not a valid isotime" -msgstr "" - -#: ceilometer/api/controllers/v2/query.py:317 -#, python-format -msgid "Failed to parse the timestamp value %s" -msgstr "" - -#: ceilometer/api/controllers/v2/resources.py:128 -msgid "Resource" -msgstr "" - -#: ceilometer/api/controllers/v2/root.py:66 -msgid "alarms URLs is unavailable when Aodh is disabled or unavailable." -msgstr "" - -#: ceilometer/api/controllers/v2/root.py:169 -msgid "direct option cannot be true when Gnocchi is enabled." -msgstr "" - -#: ceilometer/api/controllers/v2/samples.py:144 -msgid "Sample" -msgstr "" - -#: ceilometer/api/controllers/v2/utils.py:50 -msgid "Limit must be positive" -msgstr "" - -#: ceilometer/compute/pollsters/cpu.py:61 -#, python-format -msgid "could not get CPU time for %(id)s: %(e)s" -msgstr "" - -#: ceilometer/compute/pollsters/cpu.py:92 -#, python-format -msgid "Could not get CPU Util for %(id)s: %(e)s" -msgstr "" - -#: ceilometer/compute/pollsters/disk.py:174 -#: ceilometer/compute/pollsters/disk.py:312 -#: ceilometer/compute/pollsters/disk.py:447 -#: ceilometer/compute/pollsters/disk.py:517 -#: ceilometer/compute/pollsters/net.py:110 -#, python-format -msgid "Ignoring instance %(name)s: %(error)s" -msgstr "" - -#: ceilometer/compute/pollsters/disk.py:645 -#, python-format -msgid "Ignoring instance %(name)s (%(instance_id)s) : %(error)s" -msgstr "" - -#: ceilometer/compute/pollsters/memory.py:65 -#, python-format -msgid "Could not get Memory Usage for %(id)s: %(e)s" -msgstr "" - -#: ceilometer/compute/virt/inspector.py:314 -#, python-format -msgid "Unable to load the hypervisor inspector: %s" -msgstr "" - -#: ceilometer/compute/virt/libvirt/inspector.py:103 -#, python-format -msgid "" -"Error from libvirt while looking up instance : " -"[Error Code %(error_code)s] %(ex)s" -msgstr "" - -#: ceilometer/compute/virt/libvirt/inspector.py:123 -#, python-format -msgid "" -"Failed to inspect data of instance , domain " -"state is SHUTOFF." -msgstr "" - -#: ceilometer/compute/virt/libvirt/inspector.py:193 -#, python-format -msgid "" -"Failed to inspect memory usage of instance , " -"can not get info from libvirt." -msgstr "" - -#: ceilometer/compute/virt/libvirt/inspector.py:201 -#, python-format -msgid "" -"Failed to inspect memory usage of %(instance_uuid)s, can not get info " -"from libvirt: %(error)s" -msgstr "" - -#: ceilometer/compute/virt/vmware/inspector.py:106 -#: ceilometer/compute/virt/vmware/inspector.py:123 -#: ceilometer/compute/virt/vmware/inspector.py:155 -#: ceilometer/compute/virt/vmware/inspector.py:168 -#, python-format -msgid "VM %s not found in VMware vSphere" -msgstr "" - -#: ceilometer/compute/virt/xenapi/inspector.py:66 -msgid "XenAPI not installed" -msgstr "" - -#: ceilometer/compute/virt/xenapi/inspector.py:72 -msgid "Must specify connection_url, and connection_password to use" -msgstr "" - -#: ceilometer/compute/virt/xenapi/inspector.py:87 -#, python-format -msgid "Could not connect slave host: %s " -msgstr "" - -#: ceilometer/compute/virt/xenapi/inspector.py:90 -#, python-format -msgid "Could not connect to XenAPI: %s" -msgstr "" - -#: ceilometer/compute/virt/xenapi/inspector.py:113 -#, python-format -msgid "VM %s not found in XenServer" -msgstr "" - -#: ceilometer/compute/virt/xenapi/inspector.py:116 -#, python-format -msgid "Multiple VM %s found in XenServer" -msgstr "" - -#: ceilometer/compute/virt/xenapi/inspector.py:129 -#, python-format -msgid "Could not get VM %s CPU Utilization" -msgstr "" - -#: ceilometer/dispatcher/gnocchi.py:59 -msgid "" -"The Yaml file that defines mapping between samples and gnocchi " -"resources/metrics" -msgstr "" - -#: ceilometer/dispatcher/http.py:76 -msgid "" -"Dispatcher target was not set, no meter will be posted. Set the target in" -" the ceilometer.conf file" -msgstr "" - -#: ceilometer/dispatcher/http.py:104 -#, python-format -msgid "Failed to record metering data: %s" -msgstr "" - -#: ceilometer/dispatcher/http.py:107 -#, python-format -msgid "message signature invalid, discarding message: %r" -msgstr "" - -#: ceilometer/event/converter.py:62 -#, python-format -msgid "Invalid trait type '%(type)s' for trait %(trait)s" -msgstr "" - -#: ceilometer/event/converter.py:106 -#, python-format -msgid "Required field %s not specified" -msgstr "" - -#: ceilometer/event/converter.py:283 -#, python-format -msgid "Dropping Notification %(type)s (uuid:%(msgid)s)" -msgstr "" - -#: ceilometer/hardware/discovery.py:95 -#, python-format -msgid "Couldn't obtain IP address of instance %s" -msgstr "" - -#: ceilometer/ipmi/platform/intel_node_manager.py:300 -msgid "Node Manager init failed" -msgstr "" - -#: ceilometer/ipmi/platform/ipmi_sensor.py:101 -msgid "Wrong sensor type" -msgstr "" - -#: ceilometer/ipmi/platform/ipmitool.py:39 -msgid "parse IPMI sensor data failed,unknown sensor type" -msgstr "" - -#: ceilometer/ipmi/platform/ipmitool.py:80 -msgid "parse IPMI sensor data failed,No data retrieved from given input" -msgstr "" - -#: ceilometer/ipmi/platform/ipmitool.py:102 -msgid "ipmitool output length mismatch" -msgstr "" - -#: ceilometer/ipmi/platform/ipmitool.py:128 -msgid "running ipmitool failure" -msgstr "" - -#: ceilometer/ipmi/pollsters/node.py:66 -#, python-format -msgid "Polling %(name)s failed for %(cnt)s times!" -msgstr "" - -#: ceilometer/ipmi/pollsters/node.py:71 ceilometer/ipmi/pollsters/sensor.py:74 -#, python-format -msgid "Pollster for %s is disabled!" -msgstr "" - -#: ceilometer/ipmi/pollsters/sensor.py:68 -#, python-format -msgid "Polling %(mtr)s sensor failed for %(cnt)s times!" -msgstr "" - -#: ceilometer/network/services/fwaas.py:48 -#, python-format -msgid "Unknown status %(stat)s received on fw %(id)s,skipping sample" -msgstr "" - -#: ceilometer/network/services/lbaas.py:88 -#, python-format -msgid "Unknown status %(stat)s received on pool %(id)s, skipping sample" -msgstr "" - -#: ceilometer/network/services/lbaas.py:136 -#, python-format -msgid "Unknown status %(stat)s received on vip %(id)s, skipping sample" -msgstr "" - -#: ceilometer/network/services/lbaas.py:177 -#, python-format -msgid "Unknown status %(stat)s received on member %(id)s, skipping sample" -msgstr "" - -#: ceilometer/network/services/lbaas.py:297 -#, python-format -msgid "Ignoring pool %(pool_id)s" -msgstr "" - -#: ceilometer/network/services/lbaas.py:307 -#, python-format -msgid "Ignoring loadbalancer %(loadbalancer_id)s" -msgstr "" - -#: ceilometer/network/services/lbaas.py:412 -#, python-format -msgid "Unknown status %(stat)s received on listener %(id)s, skipping sample" -msgstr "" - -#: ceilometer/network/services/lbaas.py:456 -#, python-format -msgid "Unknown status %(stat)s received on Load Balancer %(id)s, skipping sample" -msgstr "" - -#: ceilometer/network/services/vpnaas.py:49 -#, python-format -msgid "Unknown status %(stat)s received on vpn %(id)s, skipping sample" -msgstr "" - -#: ceilometer/network/statistics/opencontrail/client.py:58 -#, python-format -msgid "Opencontrail API returned %(status)s %(reason)s" -msgstr "" - -#: ceilometer/network/statistics/opendaylight/client.py:232 -#: ceilometer/tests/unit/network/statistics/opendaylight/test_client.py:146 -#, python-format -msgid "OpenDaylitght API returned %(status)s %(reason)s" -msgstr "" - -#: ceilometer/network/statistics/opendaylight/driver.py:169 -msgid "Request failed to connect to OpenDaylight with NorthBound REST API" -msgstr "" - -#: ceilometer/objectstore/rgw_client.py:48 -#, python-format -msgid "RGW AdminOps API returned %(status)s %(reason)s" -msgstr "" - -#: ceilometer/publisher/file.py:62 -msgid "The path for the file publisher is required" -msgstr "" - -#: ceilometer/publisher/file.py:76 -msgid "max_bytes and backup_count should be numbers." -msgstr "" - -#: ceilometer/publisher/messaging.py:95 -#, python-format -msgid "Publishing policy is unknown (%s) force to default" -msgstr "" - -#: ceilometer/publisher/messaging.py:147 -#, python-format -msgid "Publisher max local_queue length is exceeded, dropping %d oldest samples" -msgstr "" - -#: ceilometer/publisher/messaging.py:159 -#, python-format -msgid "Failed to publish %d datapoints, queue them" -msgstr "" - -#: ceilometer/publisher/messaging.py:163 -#, python-format -msgid "Failed to publish %d datapoints, dropping them" -msgstr "" - -#: ceilometer/publisher/udp.py:67 -msgid "Unable to send sample over UDP" -msgstr "" - -#: ceilometer/storage/impl_sqlalchemy.py:314 -#, python-format -msgid "Unknown metadata type. Key (%s) will not be queryable." -msgstr "" - -#: ceilometer/storage/hbase/utils.py:474 -#, python-format -msgid "Cannot create table %(table_name)s it already exists. Ignoring error" -msgstr "" - -#: ceilometer/storage/mongo/utils.py:270 -#, python-format -msgid "Unable to connect to the database server: %(errmsg)s." -msgstr "" - -#: ceilometer/storage/mongo/utils.py:412 -#, python-format -msgid "" -"Unable to reconnect to the primary mongodb after %(retries)d retries. " -"Giving up." -msgstr "" - -#: ceilometer/storage/mongo/utils.py:416 -#, python-format -msgid "" -"Unable to reconnect to the primary mongodb: %(errmsg)s. Trying again in " -"%(retry_interval)d seconds." -msgstr "" - -#: ceilometer/transformer/arithmetic.py:57 -#, python-format -msgid "Arithmetic transformer must use at least one meter in expression '%s'" -msgstr "" - -#: ceilometer/transformer/arithmetic.py:79 -msgid "Expression evaluated to a NaN value!" -msgstr "" - -#: ceilometer/transformer/arithmetic.py:95 -#, python-format -msgid "Unable to evaluate expression %(expr)s: %(exc)s" -msgstr "" - -#: ceilometer/transformer/conversions.py:198 -#, python-format -msgid "dropping out of time order sample: %s" -msgstr "" - -#: ceilometer/transformer/conversions.py:216 -#, python-format -msgid "dropping sample with no predecessor: %s" -msgstr "" - diff --git a/ceilometer/locale/de/LC_MESSAGES/ceilometer-log-error.po b/ceilometer/locale/de/LC_MESSAGES/ceilometer-log-error.po index a6a8036a4b..54d0f08228 100644 --- a/ceilometer/locale/de/LC_MESSAGES/ceilometer-log-error.po +++ b/ceilometer/locale/de/LC_MESSAGES/ceilometer-log-error.po @@ -1,9 +1,9 @@ # Monika Wolf , 2016. #zanata msgid "" msgstr "" -"Project-Id-Version: ceilometer 6.0.0.0b4.dev6\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-03-04 20:29+0000\n" +"Project-Id-Version: ceilometer 6.0.1.dev11\n" +"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" +"POT-Creation-Date: 2016-05-19 11:00+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff --git a/ceilometer/locale/de/LC_MESSAGES/ceilometer-log-info.po b/ceilometer/locale/de/LC_MESSAGES/ceilometer-log-info.po index 848ce7d99c..b74cf4b10f 100644 --- a/ceilometer/locale/de/LC_MESSAGES/ceilometer-log-info.po +++ b/ceilometer/locale/de/LC_MESSAGES/ceilometer-log-info.po @@ -1,15 +1,14 @@ -# Monika Wolf , 2016. #zanata -# Robert Simai , 2016. #zanata +# Frank Kloeker , 2016. #zanata msgid "" msgstr "" -"Project-Id-Version: ceilometer 6.0.0.0b4.dev21\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-03-08 04:34+0000\n" +"Project-Id-Version: ceilometer 6.0.1.dev11\n" +"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" +"POT-Creation-Date: 2016-05-19 11:00+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2016-03-07 04:27+0000\n" -"Last-Translator: Robert Simai \n" +"PO-Revision-Date: 2016-04-04 05:06+0000\n" +"Last-Translator: Monika Wolf \n" "Language-Team: German\n" "Language: de\n" "X-Generator: Zanata 3.7.3\n" diff --git a/ceilometer/locale/de/LC_MESSAGES/ceilometer-log-warning.po b/ceilometer/locale/de/LC_MESSAGES/ceilometer-log-warning.po index 27051b2134..5e92cac3cc 100644 --- a/ceilometer/locale/de/LC_MESSAGES/ceilometer-log-warning.po +++ b/ceilometer/locale/de/LC_MESSAGES/ceilometer-log-warning.po @@ -1,9 +1,9 @@ # Monika Wolf , 2016. #zanata msgid "" msgstr "" -"Project-Id-Version: ceilometer 6.0.0.0b4.dev34\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-03-09 20:26+0000\n" +"Project-Id-Version: ceilometer 6.0.1.dev11\n" +"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" +"POT-Creation-Date: 2016-05-19 11:00+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff --git a/ceilometer/locale/de/LC_MESSAGES/ceilometer.po b/ceilometer/locale/de/LC_MESSAGES/ceilometer.po index bb56c7781e..19ecdbc402 100644 --- a/ceilometer/locale/de/LC_MESSAGES/ceilometer.po +++ b/ceilometer/locale/de/LC_MESSAGES/ceilometer.po @@ -9,9 +9,9 @@ # Frank Kloeker , 2016. #zanata msgid "" msgstr "" -"Project-Id-Version: ceilometer 6.0.0.0rc4.dev2\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-03-31 08:41+0000\n" +"Project-Id-Version: ceilometer 6.0.1.dev11\n" +"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" +"POT-Creation-Date: 2016-05-19 11:00+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff --git a/ceilometer/locale/es/LC_MESSAGES/ceilometer-log-error.po b/ceilometer/locale/es/LC_MESSAGES/ceilometer-log-error.po index a569ac703f..574773c541 100644 --- a/ceilometer/locale/es/LC_MESSAGES/ceilometer-log-error.po +++ b/ceilometer/locale/es/LC_MESSAGES/ceilometer-log-error.po @@ -1,9 +1,9 @@ # Eugènia Torrella , 2016. #zanata msgid "" msgstr "" -"Project-Id-Version: ceilometer 6.0.0.0b4.dev50\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-03-19 00:57+0000\n" +"Project-Id-Version: ceilometer 6.0.1.dev11\n" +"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" +"POT-Creation-Date: 2016-05-19 11:00+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff --git a/ceilometer/locale/es/LC_MESSAGES/ceilometer-log-info.po b/ceilometer/locale/es/LC_MESSAGES/ceilometer-log-info.po index 689a85e37f..0b6645f174 100644 --- a/ceilometer/locale/es/LC_MESSAGES/ceilometer-log-info.po +++ b/ceilometer/locale/es/LC_MESSAGES/ceilometer-log-info.po @@ -1,9 +1,9 @@ # Eugènia Torrella , 2016. #zanata msgid "" msgstr "" -"Project-Id-Version: ceilometer 6.0.0.0b4.dev50\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-03-19 00:57+0000\n" +"Project-Id-Version: ceilometer 6.0.1.dev11\n" +"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" +"POT-Creation-Date: 2016-05-19 11:00+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff --git a/ceilometer/locale/es/LC_MESSAGES/ceilometer.po b/ceilometer/locale/es/LC_MESSAGES/ceilometer.po index e4c35b6c6b..534ce22aa8 100644 --- a/ceilometer/locale/es/LC_MESSAGES/ceilometer.po +++ b/ceilometer/locale/es/LC_MESSAGES/ceilometer.po @@ -5,19 +5,16 @@ # Translators: # Rafael Rivero , 2015 # Marian Tort , 2015. #zanata -# OpenStack Infra , 2015. #zanata -# Tom Cocozzello , 2015. #zanata # Eugènia Torrella , 2016. #zanata -# Tom Cocozzello , 2016. #zanata msgid "" msgstr "" -"Project-Id-Version: ceilometer 6.0.0.0rc2.dev7\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-03-23 09:32+0000\n" +"Project-Id-Version: ceilometer 6.0.1.dev11\n" +"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" +"POT-Creation-Date: 2016-05-19 11:00+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2016-03-24 11:03+0000\n" +"PO-Revision-Date: 2016-04-24 07:03+0000\n" "Last-Translator: Eugènia Torrella \n" "Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -27,7 +24,7 @@ msgstr "" #, python-format msgid "%(entity)s %(id)s Not Found" -msgstr "%(entity)s %(id)s No encontrado" +msgstr "No se ha encontrado %(entity)s %(id)s" #, python-format msgid "Arithmetic transformer must use at least one meter in expression '%s'" @@ -46,15 +43,15 @@ msgstr "Continuar después de error desde %(name)s: %(error)s" #, python-format msgid "Could not connect slave host: %s " -msgstr "No se ha podido conectar con el host esclavo: %s" +msgstr "No se ha podido conectar el host esclavo: %s" #, python-format msgid "Could not connect to XenAPI: %s" -msgstr "No se puede conectar a XenAPI: %s" +msgstr "No se ha podido conectar con XenAPI: %s" #, python-format msgid "Could not get CPU Util for %(id)s: %(e)s" -msgstr "No se ha podido obtener CPU Util para %(id)s: %(e)s" +msgstr "No se ha podido obtener la utilización de CPU para %(id)s: %(e)s" #, python-format msgid "Could not get Memory Usage for %(id)s: %(e)s" @@ -62,7 +59,7 @@ msgstr "No se ha podido obtener el uso de memoria para %(id)s: %(e)s" #, python-format msgid "Could not get VM %s CPU Utilization" -msgstr "No se puede obtener la utilización de CPU de VM %s" +msgstr "No se ha podido obtener la utilización de CPU de la VM %s" #, python-format msgid "Couldn't obtain IP address of instance %s" @@ -72,8 +69,8 @@ msgid "" "Dispatcher target was not set, no meter will be posted. Set the target in " "the ceilometer.conf file" msgstr "" -"No se ha establecido el destino de asignador, no se enviará ningún medidor. " -"Establezca el destino en el archivo ceilometer.conf" +"No se ha definido el destino del asignador, no se enviará ningún medidor. " +"Defina el destino en el archivo ceilometer.conf" #, python-format msgid "Dropping Notification %(type)s (uuid:%(msgid)s)" @@ -89,10 +86,10 @@ msgstr "" #, python-format msgid "Error parsing HTTP response: %s" -msgstr "Error analizándo respuesta HTTP: %s." +msgstr "Error al analizar la respuesta HTTP: %s." msgid "Error stopping pollster." -msgstr "Error al detener el pollster." +msgstr "Error al detener el sondeador." msgid "Event" msgstr "Suceso" @@ -130,15 +127,15 @@ msgstr "" #, python-format msgid "Failed to load any notification handlers for %s" -msgstr "No se ha podido cargar ningún manejador de notificación para %s" +msgstr "No se ha podido cargar ningún manejador de notificaciones para %s" #, python-format msgid "Failed to parse the timestamp value %s" -msgstr "No se ha podido analizar el valor de indicación de fecha y hora %s" +msgstr "No se ha podido analizar el valor de la indicación de fecha y hora %s" #, python-format msgid "Failed to publish %d datapoints, dropping them" -msgstr "No se han podido publicar los puntos de datos %d, descartándolos" +msgstr "No se han podido publicar los puntos de datos %d, se descartarán" #, python-format msgid "Failed to publish %d datapoints, queue them" @@ -146,7 +143,7 @@ msgstr "No se han podido publicar los puntos de datos %d, póngalos en cola" #, python-format msgid "Failed to record metering data: %s" -msgstr "No se ha podido registrar los datos de medición: %s" +msgstr "No se han podido registrar los datos de medición: %s" #, python-format msgid "Filter expression not valid: %s" @@ -173,12 +170,12 @@ msgid "" "Invalid YAML syntax in Definitions file %(file)s at line: %(line)s, column: " "%(column)s." msgstr "" -"Sintaxis de YAML no válida en archivo de definiciones %(file)s en la línea: " +"Sintaxis de YAML no válida en archivo de definiciones %(file)s, en la línea: " "%(line)s, columna: %(column)s." #, python-format msgid "Invalid period %(period)s: %(err)s" -msgstr "Periodo no válido %(period)s: %(err)s" +msgstr "Período no válido %(period)s: %(err)s" #, python-format msgid "Invalid trait type '%(type)s' for trait %(trait)s" @@ -190,7 +187,8 @@ msgstr "El límite debe ser positivo" #, python-format msgid "More than one event with id %s returned from storage driver" msgstr "" -"Se ha devuelto más de un suceso con el %s del controlador de almacenamiento" +"Se ha devuelto más de un suceso con el id %s del controlador de " +"almacenamiento" #, python-format msgid "Multiple VM %s found in XenServer" @@ -198,7 +196,8 @@ msgstr "Se han encontrado varias VM %s en XenServer" msgid "Must specify connection_url, and connection_password to use" msgstr "" -"Debe especificar el url_conexión y la contraseña_conexión para utilizar" +"Debe especificar los valores de connection_url y connection_password a " +"utilizar" #, python-format msgid "No plugin named %(plugin)s available for %(name)s" @@ -209,7 +208,7 @@ msgstr "El inicio de Gestor de nodos ha fallado" #, python-format msgid "Not Authorized to access %(aspect)s %(id)s" -msgstr "No está autorizado para acceder a %(aspect)s %(id)s" +msgstr "No tiene autorización para acceder a %(aspect)s %(id)s" #, python-format msgid "OpenDaylitght API returned %(status)s %(reason)s" @@ -224,26 +223,26 @@ msgid "" "Operator %(operator)s is not supported. Only equality operator is available " "for field %(field)s" msgstr "" -"El operador %(operator)s no se admite. Solo hay disponible el operador de " -"igualdad para el campo %(field)s" +"El operador %(operator)s no se admite. En el campo %(field)s solo se puede " +"utilizar el operador de igualdad" #, python-format msgid "" "Operator %(operator)s is not supported. The supported operators are: " "%(supported)s" msgstr "" -"El operador %(operator)s no está admitido. Los operadores admitidos son: " +"El operador %(operator)s no se admite. Los operadores admitidos son: " "%(supported)s" #, python-format msgid "Order-by expression not valid: %s" -msgstr "Expresión de ordenar por no válida: %s" +msgstr "Expresión de Ordenar por no válida: %s" #, python-format msgid "" "Parse error in JSONPath specification '%(jsonpath)s' for %(name)s: %(err)s" msgstr "" -"Error de análisis en especificación de JSONPath '%(jsonpath)s' para " +"Error de análisis en la especificación de JSONPath '%(jsonpath)s' para " "%(name)s: %(err)s" msgid "Period must be positive." @@ -258,7 +257,7 @@ msgstr "" #, python-format msgid "Pipeline %(pipeline)s: Continue after error from publisher %(pub)s" msgstr "" -"Interconexión %(pipeline)s: Continúe tras el error de la aplicación de " +"Interconexión %(pipeline)s: Continuar tras error de la aplicación de " "publicación %(pub)s" #, python-format @@ -270,7 +269,7 @@ msgid "" "Pipeline %(pipeline)s: Exit after error from transformer %(trans)s for " "%(smp)s" msgstr "" -"Interconexión %(pipeline)s: Salga tras error del transformador %(trans)s " +"Interconexión %(pipeline)s: Salir tras error del transformador %(trans)s " "para %(smp)s" #, python-format @@ -281,7 +280,7 @@ msgstr "" #, python-format msgid "Polling %(mtr)s sensor failed for %(cnt)s times!" -msgstr "¡El sensor de sondeo %(mtr)s ha fallado %(cnt)s veces!" +msgstr "El sondeo al sensor %(mtr)s ha fallado %(cnt)s veces." #, python-format msgid "Polling %(name)s failed for %(cnt)s times!" @@ -289,24 +288,24 @@ msgstr "El sondeo %(name)s ha fallado %(cnt)s veces." #, python-format msgid "Pollster for %s is disabled!" -msgstr "¡El Pollster para %s está inhabilitado!" +msgstr "El sondeador de %s está deshabilitado." #, python-format msgid "Prevent pollster %(name)s for polling source %(source)s anymore!" -msgstr "¡Impedir pollster %(name)s para el origen de sondeo %(source)s ahora!" +msgstr "" +"Impedir que el sondeador %(name)s actúe más en el origen de sondeo %(source)s" #, python-format msgid "" "Publisher max local_queue length is exceeded, dropping %d oldest samples" msgstr "" -"Se supera la longitud máxima de aplicación de publicación local_queue, " -"descartando los ejemplos más antiguos %d" +"Se ha superado la longitud máxima de aplicación de publicación local_queue, " +"se descartarán los ejemplos más antiguos %d" #, python-format msgid "Publishing policy is unknown (%s) force to default" msgstr "" -"No se conoce la política de publicación (%s) forzar para tomar el valor " -"predeterminado" +"No se conoce la política de publicación (%s), forzar al valor predeterminado" #, python-format msgid "RGW AdminOps API returned %(status)s %(reason)s" @@ -314,12 +313,12 @@ msgstr "La API de RGW AdminOps ha devuelto %(status)s %(reason)s" msgid "Request failed to connect to OpenDaylight with NorthBound REST API" msgstr "" -"La solicitud no ha podido conectar con OpenDaylight con la API REST " -"NorthBound" +"Ha fallado la solicitud de establecer conexión con OpenDaylight con la API " +"REST NorthBound" #, python-format msgid "Required field %s not specified" -msgstr "Campo necesario %s no especificado" +msgstr "No se ha especificado el campo obligatorio %s" msgid "Resource" msgstr "Recurso" @@ -328,30 +327,30 @@ msgid "Sample" msgstr "Muestra" msgid "Samples should be included in request body" -msgstr "Los ejemplos se deben incluir en el cuerpo de la solicitud" +msgstr "Se deben incluir ejemplos en el cuerpo de la solicitud" #, python-format msgid "Skip loading extension for %s" -msgstr "Omitir la extensión de carga para %s" +msgstr "Omitir la carga de la extensión de %s" #, python-format msgid "String %s is not a valid isotime" -msgstr "La serie %s no es una hora iso válida" +msgstr "La cadena %s no es una hora ISO válida" msgid "" "The Yaml file that defines mapping between samples and gnocchi resources/" "metrics" msgstr "" -"El archivo Yaml que define la correlación entre los ejemplos y recursos/" -"métricas gnocchi" +"El archivo Yaml que define la correlación entre los ejemplos y los recursos/" +"métricas de gnocchi" #, python-format msgid "" "The data type %(type)s is not supported. The supported data type list is: " "%(supported)s" msgstr "" -"El tipo de datos %(type)s no es compatible. La lista de tipo de datos " -"admitido es: %(supported)s" +"El tipo de datos %(type)s no es compatible. La lista de tipos de datos " +"admitidos es: %(supported)s" #, python-format msgid "The field 'fields' is required for %s" @@ -359,11 +358,11 @@ msgstr "El campo 'campos' es obligatorio para %s" msgid "The path for the file publisher is required" msgstr "" -"La vía de acceso para la aplicación de publicación de archivos es necesaria" +"La vía de acceso para la aplicación de publicación de archivos es obligatoria" #, python-format msgid "UDP: Cannot decode data sent by %s" -msgstr "UDP: no se pueden decodificar los datos enviados por %s" +msgstr "UDP: no se pueden descodificar los datos enviados por %s" msgid "UDP: Unable to store meter" msgstr "UDP: no se puede almacenar el medidor" @@ -401,7 +400,7 @@ msgid "" "up." msgstr "" "No se ha podido volver a conectar con la mongodb primaria después de " -"%(retries)d intentos. Se va a abandonar." +"%(retries)d intentos. Abandonando." #, python-format msgid "" @@ -418,7 +417,7 @@ msgstr "No se ha podido enviar una muestra sobre UDP" msgid "" "Unexpected exception converting %(value)s to the expected data type %(type)s." msgstr "" -"Excepción inesperada al convertir %(value)s al tipo de dato esperado " +"Excepción inesperada al convertir %(value)s al tipo de datos esperado " "%(type)s." #, python-format @@ -463,22 +462,22 @@ msgstr "" #, python-format msgid "Unknown status %(stat)s received on vip %(id)s, skipping sample" msgstr "" -"Se ha recibido un estado desconocido %(stat)s en vip %(id)s, se omitirá el " -"ejemplo" +"Se ha recibido un estado desconocido %(stat)s en el vip %(id)s, se omitirá " +"el ejemplo" #, python-format msgid "Unknown status %(stat)s received on vpn %(id)s, skipping sample" msgstr "" -"Se ha recibido un estado desconocido %(stat)s en vpn %(id)s, se omitirá el " -"ejemplo" +"Se ha recibido un estado desconocido %(stat)s en la vpn %(id)s, se omitirá " +"el ejemplo" #, python-format msgid "VM %s not found in VMware vSphere" -msgstr "VM %s no se ha encontrado en VMware vSphere" +msgstr "No se ha encontrado la VM %s en VMware vSphere" #, python-format msgid "VM %s not found in XenServer" -msgstr "No se han encontrado VM %s en XenServer" +msgstr "No se ha encontrado la VM %s en XenServer" msgid "Wrong sensor type" msgstr "Tipo de sensor incorrecto" @@ -490,9 +489,14 @@ msgstr "XenAPI no está instalado" msgid "YAML error reading Definitions file %(file)s" msgstr "Error de YAML al leer el archivo de definiciones %(file)s" +msgid "alarms URLs is unavailable when Aodh is disabled or unavailable." +msgstr "" +"Cuando Aodh está deshabilitado o no disponible, los URL de las alarmas no " +"están disponibles." + #, python-format msgid "could not get CPU time for %(id)s: %(e)s" -msgstr "no se ha podido obtener tiempo de CPU para %(id)s: %(e)s" +msgstr "no se ha podido obtener el tiempo de CPU para %(id)s: %(e)s" msgid "direct option cannot be true when Gnocchi is enabled." msgstr "" @@ -501,30 +505,30 @@ msgstr "" #, python-format msgid "dropping out of time order sample: %s" -msgstr "saliendo del ejemplo de orden de tiempo: %s" +msgstr "descartando el ejemplo de orden de plazo tiempo excedido: %s" #, python-format msgid "dropping sample with no predecessor: %s" msgstr "eliminando la muestra sin predecesor: %s" msgid "ipmitool output length mismatch" -msgstr "la longitud de salida de ipmitool no coincide" +msgstr "no coincidencia en la longitud de salida de ipmitool" msgid "max_bytes and backup_count should be numbers." msgstr "max_bytes y backup_count deben ser números." #, python-format msgid "message signature invalid, discarding message: %r" -msgstr "firma de mensaje no válida, descartando mensaje: %r" +msgstr "firma de mensaje no válida, descartando el mensaje: %r" msgid "parse IPMI sensor data failed,No data retrieved from given input" msgstr "" -"ha fallado el análisis de datos de sensor IPMI,no se ha recuperado ningún " -"dato de la entrada" +"ha fallado el análisis de datos de sensor IPMI, no se ha recuperado ningún " +"dato de la entrada indicada" msgid "parse IPMI sensor data failed,unknown sensor type" msgstr "" -"ha fallado el análisis de datos de sensor IPMI,tipo de sensor desconocido" +"ha fallado el análisis de datos de sensor IPMI, tipo de sensor desconocido" msgid "running ipmitool failure" msgstr "fallo de ejecución de ipmitool" diff --git a/ceilometer/locale/fr/LC_MESSAGES/ceilometer.po b/ceilometer/locale/fr/LC_MESSAGES/ceilometer.po index 74cc8bf0dd..7936a6a60f 100644 --- a/ceilometer/locale/fr/LC_MESSAGES/ceilometer.po +++ b/ceilometer/locale/fr/LC_MESSAGES/ceilometer.po @@ -21,21 +21,17 @@ # EVEILLARD , 2013 # Corinne Verheyde , 2013 # Corinne Verheyde , 2013 -# OpenStack Infra , 2015. #zanata -# Tom Cocozzello , 2015. #zanata -# Angelique Pillal , 2016. #zanata -# Corinne Verheyde , 2016. #zanata -# Tom Cocozzello , 2016. #zanata +# leroy , 2016. #zanata msgid "" msgstr "" -"Project-Id-Version: ceilometer 6.0.0.0rc3.dev2\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-03-30 00:07+0000\n" +"Project-Id-Version: ceilometer 6.0.1.dev11\n" +"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" +"POT-Creation-Date: 2016-05-19 11:00+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2016-03-29 08:24+0000\n" -"Last-Translator: Angelique Pillal \n" +"PO-Revision-Date: 2016-04-24 08:42+0000\n" +"Last-Translator: leroy \n" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "Generated-By: Babel 2.0\n" @@ -44,12 +40,12 @@ msgstr "" #, python-format msgid "%(entity)s %(id)s Not Found" -msgstr "%(entity)s %(id)s n'a pas été trouvé" +msgstr "%(entity)s %(id)s non trouvé" #, python-format msgid "Arithmetic transformer must use at least one meter in expression '%s'" msgstr "" -"Le transformateur arithmétique doit utiliser au moins un mètre dans " +"Le transformateur arithmétique doit utiliser au moins un compteur dans " "l'expression '%s'" #, python-format @@ -60,28 +56,27 @@ msgstr "" #, python-format msgid "Continue after error from %(name)s: %(error)s" -msgstr "Continue après l'erreur %(name)s: %(error)s " +msgstr "Continuer après l'erreur de %(name)s : %(error)s " #, python-format msgid "Could not connect slave host: %s " -msgstr "Impossible de se connecter à l'hôte slave: %s " +msgstr "Impossible de se connecter à l'hôte esclave : %s " #, python-format msgid "Could not connect to XenAPI: %s" -msgstr "Connexion impossible XenAPI: %s" +msgstr "Impossible de se connecter à XenAPI : %s" #, python-format msgid "Could not get CPU Util for %(id)s: %(e)s" -msgstr "Ne peut pas recevoir l'utilisation CPU pour %(id)s: %(e)s" +msgstr "Impossible d'obtenir l'utilisation UC pour %(id)s : %(e)s" #, python-format msgid "Could not get Memory Usage for %(id)s: %(e)s" -msgstr "" -"Impossible de récupérer l'utilisation de la mémoire pour %(id)s : %(e)s" +msgstr "Impossible d'obtenir l'utilisation de la mémoire pour %(id)s : %(e)s" #, python-format msgid "Could not get VM %s CPU Utilization" -msgstr "Impossible d'obtenir l'utilisation CPU de la VM %s" +msgstr "Impossible d'obtenir l'utilisation UC de la machine virtuelle %s" #, python-format msgid "Couldn't obtain IP address of instance %s" @@ -91,12 +86,12 @@ msgid "" "Dispatcher target was not set, no meter will be posted. Set the target in " "the ceilometer.conf file" msgstr "" -"La cible du répartiteur n'était pas définie, aucun compteur ne sera envoyé. " +"La cible du répartiteur n'était pas définie, aucun compteur ne sera publié. " "Définissez la cible dans le fichier ceilometer.conf" #, python-format msgid "Dropping Notification %(type)s (uuid:%(msgid)s)" -msgstr "Suppression du %(type)s de notification (uuid:%(msgid)s)" +msgstr "Suppression de la notification %(type)s (uuid : %(msgid)s)" #, python-format msgid "" @@ -108,7 +103,7 @@ msgstr "" #, python-format msgid "Error parsing HTTP response: %s" -msgstr "Erreur lors de l'analyse syntaxique de la réponse: %s" +msgstr "Erreur lors de l'analyse syntaxique de la réponse HTTP : %s" msgid "Error stopping pollster." msgstr "Erreur lors de l'arrêt du sondeur." @@ -117,18 +112,18 @@ msgid "Event" msgstr "Événement" msgid "Expression evaluated to a NaN value!" -msgstr "Expression évaluée avec une valeur not-a-number !" +msgstr "Expression évaluée avec une valeur NaN !" #, python-format msgid "Failed to import extension for %(name)s: %(error)s" -msgstr "Echec de l'importation de l'extension pour %(name)s: %(error)s" +msgstr "Échec de l'importation de l'extension pour %(name)s : %(error)s" #, python-format msgid "" "Failed to inspect data of instance , domain state " "is SHUTOFF." msgstr "" -"Echec de l'inspection des données de l'instance . " +"Échec de l'inspection des données de l'instance . " "Le domaine est à l'état SHUTOFF (INTERRUPTION)." #, python-format @@ -136,7 +131,7 @@ msgid "" "Failed to inspect memory usage of %(instance_uuid)s, can not get info from " "libvirt: %(error)s" msgstr "" -"Echec de l'inspection de l'utilisation de la mémoire de %(instance_uuid)s. " +"Échec de l'inspection de l'utilisation de la mémoire de %(instance_uuid)s. " "Impossible d'obtenir des informations de libvirt : %(error)s" #, python-format @@ -144,46 +139,45 @@ msgid "" "Failed to inspect memory usage of instance , can " "not get info from libvirt." msgstr "" -"Echec de l'inspection de l'utilisation de la mémoire de l'instance . Impossible d'obtenir des informations de libvirt." #, python-format msgid "Failed to load any notification handlers for %s" -msgstr "Échec du chargement de tous les gestionnaires de notification pour %s" +msgstr "Échec du chargement des gestionnaires de notification pour %s" #, python-format msgid "Failed to parse the timestamp value %s" -msgstr "Echec de l'analyse syntaxique de la valeur d'horodatage %s" +msgstr "Échec de l'analyse syntaxique de la valeur d'horodatage %s" #, python-format msgid "Failed to publish %d datapoints, dropping them" -msgstr "Echec de la publication des points de données %d. Suppression en cours" +msgstr "Échec de la publication de %d points de données. Suppression en cours" #, python-format msgid "Failed to publish %d datapoints, queue them" msgstr "" -"Echec de la publication des points de données %d. Mettez-les en file " -"d'attente" +"Échec de la publication de %d points de données. Mise en file d'attente" #, python-format msgid "Failed to record metering data: %s" -msgstr "Impossible d'enregistrer les données de mesure: %s" +msgstr "Impossible d'enregistrer les données de mesure : %s" #, python-format msgid "Filter expression not valid: %s" -msgstr "Filtre de l'expression n'est pas valide: %s" +msgstr "Expression de filtre non valide : %s" #, python-format msgid "Ignoring instance %(name)s (%(instance_id)s) : %(error)s" -msgstr "L'instance %(name)s est ignorée (%(instance_id)s) : %(error)s" +msgstr "Instance %(name)s ignorée (%(instance_id)s) : %(error)s" #, python-format msgid "Ignoring instance %(name)s: %(error)s" -msgstr "instance %(name)s: %(error)s ignoré" +msgstr "Instance %(name)s : %(error)s ignorée" #, python-format msgid "Ignoring loadbalancer %(loadbalancer_id)s" -msgstr "Loadbalancer %(loadbalancer_id)s ignoré" +msgstr "Équilibreur de charge %(loadbalancer_id)s ignoré" #, python-format msgid "Ignoring pool %(pool_id)s" @@ -210,27 +204,27 @@ msgstr "La limite doit être positive" #, python-format msgid "More than one event with id %s returned from storage driver" -msgstr "" -"Plus d'un événement avec l'identificateur %s a été renvoyé à partir du " -"pilote de stockage" +msgstr "Plusieurs événements avec l'ID %s retournés par le pilote de stockage" #, python-format msgid "Multiple VM %s found in XenServer" msgstr "Plusieurs machines virtuelles %s trouvées dans XenServer" msgid "Must specify connection_url, and connection_password to use" -msgstr "Il faut indiquer connection_url et connection_password pour utiliser" +msgstr "" +"connection_url et connection_password doivent être indiqués pour " +"l'utilisation de" #, python-format msgid "No plugin named %(plugin)s available for %(name)s" -msgstr "Aucun plugin nommé %(plugin)s n'est disponible pour %(name)s" +msgstr "Aucun plug-in nommé %(plugin)s n'est disponible pour %(name)s" msgid "Node Manager init failed" -msgstr "Echec de l'initialisation du gestionnaire de noeud" +msgstr "Échec de l'initialisation du gestionnaire de nœud" #, python-format msgid "Not Authorized to access %(aspect)s %(id)s" -msgstr "Non autorisé à accéder %(aspect)s %(id)s " +msgstr "Non autorisé à accéder à %(aspect)s %(id)s " #, python-format msgid "OpenDaylitght API returned %(status)s %(reason)s" @@ -245,27 +239,27 @@ msgid "" "Operator %(operator)s is not supported. Only equality operator is available " "for field %(field)s" msgstr "" -"Opérateur %(operator)s non supporté. Seul l'opérateur égalité est disponible " -"pour le champ %(field)s" +"Opérateur %(operator)s non pris en charge. Seul l'opérateur d'égalité est " +"disponible pour la zone %(field)s" #, python-format msgid "" "Operator %(operator)s is not supported. The supported operators are: " "%(supported)s" msgstr "" -"L'opérateur %(operator)s n'est pas supporté. Les opérateurs supportés sont: " -"%(supported)s" +"L'opérateur %(operator)s n'est pas pris en charge. Les opérateurs pris en " +"charge sont les suivants : %(supported)s" #, python-format msgid "Order-by expression not valid: %s" -msgstr "L'expression de tri n'est pas valide : %s" +msgstr "Expression Order-by non valide : %s" #, python-format msgid "" "Parse error in JSONPath specification '%(jsonpath)s' for %(name)s: %(err)s" msgstr "" -"Erreur d'analyse dans la spécification JSONPath '%(jsonpath)s' pour " -"%(name)s : %(err)s" +"Erreur d'analyse syntaxique dans la spécification JSONPath '%(jsonpath)s' " +"pour %(name)s : %(err)s" msgid "Period must be positive." msgstr "La période doit être positive." @@ -273,27 +267,28 @@ msgstr "La période doit être positive." #, python-format msgid "Pipeline %(pipeline)s: %(status)s after error from publisher %(pub)s" msgstr "" -"Pipeline %(pipeline)s : statut %(status)s après erreur du diffuseur %(pub)s" +"Pipeline %(pipeline)s : Statut %(status)s après erreur de l'éditeur %(pub)s" #, python-format msgid "Pipeline %(pipeline)s: Continue after error from publisher %(pub)s" -msgstr "Pipeline %(pipeline)s: Reprise après une erreur de l'éditeur %(pub)s" +msgstr "Pipeline %(pipeline)s : Reprise après une erreur de l'éditeur %(pub)s" #, python-format msgid "Pipeline %(pipeline)s: Error flushing transformer %(trans)s" -msgstr "Pipeline %(pipeline)s: Erreur à la purge du transformateur %(trans)s" +msgstr "" +"Pipeline %(pipeline)s : Erreur lors de la purge du transformateur %(trans)s" #, python-format msgid "" "Pipeline %(pipeline)s: Exit after error from transformer %(trans)s for " "%(smp)s" msgstr "" -"Pipeline %(pipeline)s: Sortie après erreur du transformateur %(trans)s pour " +"Pipeline %(pipeline)s : Sortie après erreur du transformateur %(trans)s pour " "%(smp)s" #, python-format msgid "Plugin specified, but no plugin name supplied for %s" -msgstr "Plugin spécifié, mais aucun nom de plugin n'est fourni pour %s" +msgstr "Plug-in spécifié, mais aucun nom de plug-in fourni pour %s" #, python-format msgid "Polling %(mtr)s sensor failed for %(cnt)s times!" @@ -301,26 +296,28 @@ msgstr "L'interrogation du capteur %(mtr)s a échoué %(cnt)s fois !" #, python-format msgid "Polling %(name)s failed for %(cnt)s times!" -msgstr "Sondage de %(name)s %(cnt)s fois en échec!" +msgstr "Échec du sondage de %(name)s pendant %(cnt)s fois !" #, python-format msgid "Pollster for %s is disabled!" -msgstr "Le pollster pour %s est désactivé !" +msgstr "Le sondeur pour %s est désactivé !" #, python-format msgid "Prevent pollster %(name)s for polling source %(source)s anymore!" -msgstr "Empêcher le pollster %(name)s d'interroger la source %(source)s !" +msgstr "Empêcher le sondeur %(name)s d'interroger la source %(source)s !" #, python-format msgid "" "Publisher max local_queue length is exceeded, dropping %d oldest samples" msgstr "" -"La longueur maximale de local_queue du diffuseur est dépassée, suppression " +"La longueur maximale de local_queue de l'éditeur est dépassée, suppression " "des %d échantillons les plus anciens" #, python-format msgid "Publishing policy is unknown (%s) force to default" -msgstr "La politique de publication est inconnue (%s) forcé le défaut" +msgstr "" +"La stratégie de publication est inconnue (%s), forcée sur stratégie par " +"défaut" #, python-format msgid "RGW AdminOps API returned %(status)s %(reason)s" @@ -328,58 +325,57 @@ msgstr "L'API AdminOps RGW a renvoyé %(status)s %(reason)s" msgid "Request failed to connect to OpenDaylight with NorthBound REST API" msgstr "" -"La demande n'a pas réussi à se connecter à OpenDaylight avec l'API REST " -"NorthBound" +"La demande n'a pas pu se connecter à OpenDaylight avec l'API REST NorthBound" #, python-format msgid "Required field %s not specified" -msgstr "Champ requis %s non spécifiée" +msgstr "Zone obligatoire %s non spécifiée" msgid "Resource" msgstr "Ressource" msgid "Sample" -msgstr "Echantillon" +msgstr "Échantillon" msgid "Samples should be included in request body" -msgstr "Des exemples doivent être inclus dans le corps de demande" +msgstr "Des exemples doivent être inclus dans le corps de la demande" #, python-format msgid "Skip loading extension for %s" -msgstr "Passer le chargement de l'extension pour %s" +msgstr "Omettre le chargement de l'extension pour %s" #, python-format msgid "String %s is not a valid isotime" -msgstr "La chaine de caractère %s n'est pas valide isotime" +msgstr "La chaine %s n'est pas un isotime valide" msgid "" "The Yaml file that defines mapping between samples and gnocchi resources/" "metrics" msgstr "" -"Fichier Yaml qui définit le mappage entre les exemples et les ressources " -"gnocchi /les métriques" +"Fichier Yaml qui définit le mappage entre les échantillons et les ressources/" +"métriques gnocchi" #, python-format msgid "" "The data type %(type)s is not supported. The supported data type list is: " "%(supported)s" msgstr "" -"Le type de données %(type)s n'est pas supporté. Les types de données " -"supportés sont: %(supported)s" +"Le type de données %(type)s n'est pas pris en charge. La liste de types de " +"données pris en charge est la suivante : %(supported)s" #, python-format msgid "The field 'fields' is required for %s" -msgstr "Le champ 'fields' est requis pour %s" +msgstr "La zone 'fields' est obligatoire pour %s" msgid "The path for the file publisher is required" -msgstr "Le chemin du éditeur de fichier est obligatoire " +msgstr "Le chemin de l'éditeur de fichier est obligatoire " #, python-format msgid "UDP: Cannot decode data sent by %s" -msgstr "UDP: Impossible de décoder les données envoyées par %s" +msgstr "UDP : Impossible de décoder les données envoyées par %s" msgid "UDP: Unable to store meter" -msgstr "UDP: Impossible de stocker les mesures" +msgstr "UDP: Impossible de stocker le compteur" #, python-format msgid "Unable to connect to the database server: %(errmsg)s." @@ -389,12 +385,12 @@ msgstr "Impossible de se connecter au serveur de base de données : %(errmsg)s." msgid "" "Unable to convert the value %(value)s to the expected data type %(type)s." msgstr "" -"Impossible de convertir la valeur %(value)s vers le type de données attendu " +"Impossible de convertir la valeur %(value)s dans le type de données attendu " "%(type)s." #, python-format msgid "Unable to discover resources: %s" -msgstr "Impossible de découvrir les ressources: %s" +msgstr "Impossible de découvrir les ressources : %s" #, python-format msgid "Unable to evaluate expression %(expr)s: %(exc)s" @@ -406,15 +402,15 @@ msgstr "Impossible de charger l'éditeur %s " #, python-format msgid "Unable to load the hypervisor inspector: %s" -msgstr "Impossible de télécharger l'inspecteur hypervisor: %s" +msgstr "Impossible de télécharger l'inspecteur d'hyperviseur : %s" #, python-format msgid "" "Unable to reconnect to the primary mongodb after %(retries)d retries. Giving " "up." msgstr "" -"Impossible de se reconnecter au serveur mongodb principal après %(retries)d " -"tentatives. Abandon." +"Impossible de se reconnecter au serveur mongodb principal au bout de " +"%(retries)d tentatives. Abandon." #, python-format msgid "" @@ -425,67 +421,71 @@ msgstr "" "Nouvelle tentative dans %(retry_interval)d secondes." msgid "Unable to send sample over UDP" -msgstr "Impossible d'envoyer l'échantillon en UDP" +msgstr "Impossible d'envoyer l'échantillon sur UDP" #, python-format msgid "" "Unexpected exception converting %(value)s to the expected data type %(type)s." msgstr "" "Exception inattendue lors de la conversion de %(value)s dans le type de " -"donnée attendue %(type)s." +"donnée attendu %(type)s." #, python-format msgid "Unknown discovery extension: %s" -msgstr "Découverte d'une extension inconnue: %s" +msgstr "Extension de découverte inconnue : %s" #, python-format msgid "Unknown metadata type. Key (%s) will not be queryable." -msgstr "Type de métadonnées inconnu, la clé (%s) n'est pas requêtable" +msgstr "Type de métadonnées inconnu. La clé (%s) ne peut pas être interrogée." #, python-format msgid "" "Unknown status %(stat)s received on Load Balancer %(id)s, skipping sample" msgstr "" -"Statut %(stat)s inconnu reçu sur le Load Balancer %(id)s, échantillon ignoré" +"Statut %(stat)s inconnu reçu sur l'équilibreur de charge %(id)s, " +"échantillon ignoré" #, python-format msgid "Unknown status %(stat)s received on fw %(id)s,skipping sample" -msgstr "Etat %(stat)s inconnu reçu sur le pare-feu %(id)s, échantillon ignoré" +msgstr "" +"Statut %(stat)s inconnu reçu sur le pare-feu %(id)s, échantillon ignoré" #, python-format msgid "Unknown status %(stat)s received on listener %(id)s, skipping sample" -msgstr "Etat %(stat)s inconnu reçu sur le listener %(id)s, échantillon ignoré" +msgstr "" +"Statut %(stat)s inconnu reçu sur le programme d'écoute %(id)s, échantillon " +"ignoré" #, python-format msgid "Unknown status %(stat)s received on member %(id)s, skipping sample" -msgstr "Etat %(stat)s inconnu reçu sur le membre %(id)s, échantillon ignoré" +msgstr "Statut %(stat)s inconnu reçu sur le membre %(id)s, échantillon ignoré" #, python-format msgid "Unknown status %(stat)s received on pool %(id)s, skipping sample" -msgstr "Etat %(stat)s inconnu reçu sur le pool %(id)s, échantillon ignoré" +msgstr "Statut %(stat)s inconnu reçu sur le pool %(id)s, échantillon ignoré" #, python-format msgid "Unknown status %(stat)s received on vip %(id)s, skipping sample" msgstr "" -"Etat %(stat)s inconnu reçu sur l'IP virtuelle %(id)s, échantillon ignoré" +"Statut %(stat)s inconnu reçu sur l'IP virtuelle %(id)s, échantillon ignoré" #, python-format msgid "Unknown status %(stat)s received on vpn %(id)s, skipping sample" -msgstr "Etat %(stat)s inconnu reçu sur le vpn %(id)s, échantillon ignoré" +msgstr "Statut %(stat)s inconnu reçu sur le VPN %(id)s, échantillon ignoré" #, python-format msgid "VM %s not found in VMware vSphere" -msgstr "La machine virtuelle %s est introuvable dans VMware vSphere" +msgstr "Machine virtuelle %s non trouvée dans VMware vSphere" #, python-format msgid "VM %s not found in XenServer" msgstr "VM %s non trouvé dans XenServer" msgid "Wrong sensor type" -msgstr "Type de détecteur incorrect" +msgstr "Type de détecteur erroné" msgid "XenAPI not installed" -msgstr "XenAPI n'est pas installé" +msgstr "XenAPI non installé" #, python-format msgid "YAML error reading Definitions file %(file)s" @@ -498,37 +498,38 @@ msgstr "" #, python-format msgid "could not get CPU time for %(id)s: %(e)s" -msgstr "impossible d'obtenir le temps UC pour %(id)s : %(e)s" +msgstr "ne peut pas obtenir le temps UC pour %(id)s : %(e)s" msgid "direct option cannot be true when Gnocchi is enabled." -msgstr "L'option directe ne peut pas être à vrai si Gnocchi est activé." +msgstr "" +"L'option directe ne peut pas être définie sur vrai si Gnocchi est activé." #, python-format msgid "dropping out of time order sample: %s" -msgstr "suppression de l'exemple de classement dans le temps : %s" +msgstr "suppression de l'échantillon de classement temporel : %s" #, python-format msgid "dropping sample with no predecessor: %s" -msgstr "abandon de l'échantillon sans prédécesseur: %s" +msgstr "abandon de l'échantillon sans prédécesseur : %s" msgid "ipmitool output length mismatch" -msgstr "Non-concordance de longueur de la sortie ipmitool" +msgstr "Non concordance de longueur de la sortie ipmitool" msgid "max_bytes and backup_count should be numbers." -msgstr "max_bytes et backup_count doivent etre des chiffres." +msgstr "max_bytes et backup_count doivent être des nombres." #, python-format msgid "message signature invalid, discarding message: %r" -msgstr "signature du message invalide, message ignoré: %r" +msgstr "signature de message non valide, message ignoré : %r" msgid "parse IPMI sensor data failed,No data retrieved from given input" msgstr "" -"Echec de l'analyse des données du détecteur IPMI, aucune donnée extraite à " +"Échec de l'analyse des données du détecteur IPMI. Aucune donnée extraite à " "partir de l'entrée fournie" msgid "parse IPMI sensor data failed,unknown sensor type" msgstr "" -"Echec de l'analyse des données du détecteur IPMI, type de détecteur inconnu" +"Échec de l'analyse des données du détecteur IPMI, type de détecteur inconnu" msgid "running ipmitool failure" -msgstr "Echec d'exécution d'ipmitool" +msgstr "Échec d'exécution d'ipmitool" diff --git a/ceilometer/locale/it/LC_MESSAGES/ceilometer.po b/ceilometer/locale/it/LC_MESSAGES/ceilometer.po index 4eaa740fe5..adaa6ffa33 100644 --- a/ceilometer/locale/it/LC_MESSAGES/ceilometer.po +++ b/ceilometer/locale/it/LC_MESSAGES/ceilometer.po @@ -9,9 +9,9 @@ # Tom Cocozzello , 2016. #zanata msgid "" msgstr "" -"Project-Id-Version: ceilometer 6.0.0.0rc2.dev1\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-03-20 20:02+0000\n" +"Project-Id-Version: ceilometer 6.0.1.dev11\n" +"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" +"POT-Creation-Date: 2016-05-19 11:00+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff --git a/ceilometer/locale/ja/LC_MESSAGES/ceilometer.po b/ceilometer/locale/ja/LC_MESSAGES/ceilometer.po index 3826510987..920026d717 100644 --- a/ceilometer/locale/ja/LC_MESSAGES/ceilometer.po +++ b/ceilometer/locale/ja/LC_MESSAGES/ceilometer.po @@ -10,9 +10,9 @@ # 笹原 昌美 , 2016. #zanata msgid "" msgstr "" -"Project-Id-Version: ceilometer 6.0.0.0rc2.dev9\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-03-28 22:52+0000\n" +"Project-Id-Version: ceilometer 6.0.1.dev11\n" +"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" +"POT-Creation-Date: 2016-05-19 11:00+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff --git a/ceilometer/locale/ko_KR/LC_MESSAGES/ceilometer-log-error.po b/ceilometer/locale/ko_KR/LC_MESSAGES/ceilometer-log-error.po index b0256ef0b6..ae5d54b985 100644 --- a/ceilometer/locale/ko_KR/LC_MESSAGES/ceilometer-log-error.po +++ b/ceilometer/locale/ko_KR/LC_MESSAGES/ceilometer-log-error.po @@ -1,13 +1,14 @@ +# SeYeon Lee , 2016. #zanata # Sungjin Kang , 2016. #zanata msgid "" msgstr "" -"Project-Id-Version: ceilometer 6.0.1.dev3\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-04-07 10:59+0000\n" +"Project-Id-Version: ceilometer 6.0.1.dev11\n" +"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" +"POT-Creation-Date: 2016-05-19 11:00+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2016-04-07 03:38+0000\n" +"PO-Revision-Date: 2016-04-25 02:00+0000\n" "Last-Translator: SeYeon Lee \n" "Language-Team: Korean (South Korea)\n" "Language: ko-KR\n" @@ -35,7 +36,8 @@ msgstr "조정 백엔드에서 그룹 멤버십 정보를 가져오는 중에 #, python-format msgid "Error joining partitioning group %s, re-trying" msgstr "" -"파티션 지정 그룹 %s을(를) 결합하는 중에 오류가 발생하여, 다시 시도 중입니다." +"파티션 지정 그룹 %s을(를) 결합하는 중에 오류가 발생하여 다시 시도하는 중입니" +"다." #, python-format msgid "Error loading meter definition : %(err)s" diff --git a/ceilometer/locale/ko_KR/LC_MESSAGES/ceilometer-log-info.po b/ceilometer/locale/ko_KR/LC_MESSAGES/ceilometer-log-info.po index 4511135ad9..758a1fb533 100644 --- a/ceilometer/locale/ko_KR/LC_MESSAGES/ceilometer-log-info.po +++ b/ceilometer/locale/ko_KR/LC_MESSAGES/ceilometer-log-info.po @@ -1,9 +1,9 @@ # Sungjin Kang , 2016. #zanata msgid "" msgstr "" -"Project-Id-Version: ceilometer 6.0.1.dev3\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-04-07 10:58+0000\n" +"Project-Id-Version: ceilometer 6.0.1.dev11\n" +"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" +"POT-Creation-Date: 2016-05-19 11:00+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff --git a/ceilometer/locale/ko_KR/LC_MESSAGES/ceilometer-log-warning.po b/ceilometer/locale/ko_KR/LC_MESSAGES/ceilometer-log-warning.po index 64ded38785..56f9d69f21 100644 --- a/ceilometer/locale/ko_KR/LC_MESSAGES/ceilometer-log-warning.po +++ b/ceilometer/locale/ko_KR/LC_MESSAGES/ceilometer-log-warning.po @@ -1,9 +1,9 @@ # Sungjin Kang , 2016. #zanata msgid "" msgstr "" -"Project-Id-Version: ceilometer 6.0.1.dev3\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-04-07 10:59+0000\n" +"Project-Id-Version: ceilometer 6.0.1.dev11\n" +"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" +"POT-Creation-Date: 2016-05-19 11:00+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff --git a/ceilometer/locale/ko_KR/LC_MESSAGES/ceilometer.po b/ceilometer/locale/ko_KR/LC_MESSAGES/ceilometer.po index e14d85ccd4..cbd8ed8560 100644 --- a/ceilometer/locale/ko_KR/LC_MESSAGES/ceilometer.po +++ b/ceilometer/locale/ko_KR/LC_MESSAGES/ceilometer.po @@ -11,9 +11,9 @@ # Sungjin Kang , 2016. #zanata msgid "" msgstr "" -"Project-Id-Version: ceilometer 6.0.1.dev3\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-04-07 10:58+0000\n" +"Project-Id-Version: ceilometer 6.0.1.dev11\n" +"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" +"POT-Creation-Date: 2016-05-19 11:00+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff --git a/ceilometer/locale/pt_BR/LC_MESSAGES/ceilometer.po b/ceilometer/locale/pt_BR/LC_MESSAGES/ceilometer.po index ac9b49104a..b607a31b0a 100644 --- a/ceilometer/locale/pt_BR/LC_MESSAGES/ceilometer.po +++ b/ceilometer/locale/pt_BR/LC_MESSAGES/ceilometer.po @@ -5,20 +5,16 @@ # Translators: # Gabriel Wainer, 2013 # Gabriel Wainer, 2013 -# Andreas Jaeger , 2015. #zanata -# Lucas Palm , 2015. #zanata -# OpenStack Infra , 2015. #zanata # Carlos Marques , 2016. #zanata -# Lucas Palm , 2016. #zanata msgid "" msgstr "" -"Project-Id-Version: ceilometer 6.0.0.0rc2.dev6\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-03-22 18:08+0000\n" +"Project-Id-Version: ceilometer 6.0.1.dev11\n" +"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" +"POT-Creation-Date: 2016-05-19 11:00+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2016-03-22 11:05+0000\n" +"PO-Revision-Date: 2016-05-03 10:38+0000\n" "Last-Translator: Carlos Marques \n" "Language: pt-BR\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" @@ -38,7 +34,7 @@ msgstr "" #, python-format msgid "Cannot create table %(table_name)s it already exists. Ignoring error" msgstr "" -"Não é possível criar a tabela %(table_name)s; ela já existe. Ignorando erro" +"Não é possível criar a tabela %(table_name)s; ela já existe. Ignorando o erro" #, python-format msgid "Continue after error from %(name)s: %(error)s" @@ -54,11 +50,11 @@ msgstr "Não foi possível conectar-se ao XenAPI: %s" #, python-format msgid "Could not get CPU Util for %(id)s: %(e)s" -msgstr "Não foi possível obter Uso de CPU para %(id)s: %(e)s" +msgstr "Não foi possível obter o Uso de CPU para %(id)s: %(e)s" #, python-format msgid "Could not get Memory Usage for %(id)s: %(e)s" -msgstr "Não foi possível obter de Uso de Memória para %(id)s: %(e)s" +msgstr "Não foi possível obter o Uso de Memória para %(id)s: %(e)s" #, python-format msgid "Could not get VM %s CPU Utilization" @@ -92,7 +88,7 @@ msgid "Error parsing HTTP response: %s" msgstr "Erro ao analisar a resposta de HTTP: %s" msgid "Error stopping pollster." -msgstr "Erro ao parar pesquisador. " +msgstr "Erro ao parar o pesquisador. " msgid "Event" msgstr "Evento" @@ -173,7 +169,7 @@ msgid "" "Invalid YAML syntax in Definitions file %(file)s at line: %(line)s, column: " "%(column)s." msgstr "" -"Sintaxe YAML inválida no arquivo de definições %(file)s na linha: %(line)s, " +"Sintaxe YAML inválida no arquivo Definitions %(file)s na linha: %(line)s, " "coluna: %(column)s." #, python-format @@ -185,7 +181,7 @@ msgid "Invalid trait type '%(type)s' for trait %(trait)s" msgstr "Tipo de traço inválido '%(type)s' para traço %(trait)s" msgid "Limit must be positive" -msgstr "Limite deve ser positivo" +msgstr "O limite deve ser positivo" #, python-format msgid "More than one event with id %s returned from storage driver" @@ -204,7 +200,7 @@ msgid "No plugin named %(plugin)s available for %(name)s" msgstr "Nenhum plug-in nomeado %(plugin)s disponível para %(name)s" msgid "Node Manager init failed" -msgstr "Inicialização do gerenciador de nó com falha" +msgstr "A inicialização do Gerenciador de Nós falhou" #, python-format msgid "Not Authorized to access %(aspect)s %(id)s" @@ -223,8 +219,8 @@ msgid "" "Operator %(operator)s is not supported. Only equality operator is available " "for field %(field)s" msgstr "" -"O operador %(operator)s não é suportado. Somente operador de igualdade está " -"disponível para o campo %(field)s" +"O operador %(operator)s não é suportado. Somente o operador de igualdade " +"está disponível para o campo %(field)s" #, python-format msgid "" @@ -246,7 +242,7 @@ msgstr "" "%(err)s" msgid "Period must be positive." -msgstr "Período deve ser positivo." +msgstr "O período deve ser positivo." #, python-format msgid "Pipeline %(pipeline)s: %(status)s after error from publisher %(pub)s" @@ -254,18 +250,18 @@ msgstr "Pipeline %(pipeline)s: %(status)s após erro do publicador %(pub)s" #, python-format msgid "Pipeline %(pipeline)s: Continue after error from publisher %(pub)s" -msgstr "Pipeline %(pipeline)s: Continue após erro do publicador %(pub)s" +msgstr "Pipeline %(pipeline)s: Continuar após erro do publicador %(pub)s" #, python-format msgid "Pipeline %(pipeline)s: Error flushing transformer %(trans)s" -msgstr "Pipeline %(pipeline)s: Erro ao limpar transformador %(trans)s" +msgstr "Pipeline %(pipeline)s: Erro ao limpar o transformador %(trans)s" #, python-format msgid "" "Pipeline %(pipeline)s: Exit after error from transformer %(trans)s for " "%(smp)s" msgstr "" -"Pipeline %(pipeline)s: Saia após erro do transformador %(trans)s para %(smp)s" +"Pipeline %(pipeline)s: Sair após erro do transformador %(trans)s para %(smp)s" #, python-format msgid "Plugin specified, but no plugin name supplied for %s" @@ -273,7 +269,7 @@ msgstr "Plug-in especificado, mas nenhum nome de plug-in fornecido para %s" #, python-format msgid "Polling %(mtr)s sensor failed for %(cnt)s times!" -msgstr "O sensor de pesquisa %(mtr)s falhou para %(cnt)s vezes!" +msgstr "O sensor de pesquisa %(mtr)s falhou %(cnt)s vezes!" #, python-format msgid "Polling %(name)s failed for %(cnt)s times!" @@ -285,26 +281,26 @@ msgstr "O pesquisador para %s está desativado!" #, python-format msgid "Prevent pollster %(name)s for polling source %(source)s anymore!" -msgstr "" -"Evite o pesquisador %(name)s para a origem de pesquisa %(source)s atualmente!" +msgstr "Impeça o pesquisador %(name)s de sondar a origem %(source)s novamente!" #, python-format msgid "" "Publisher max local_queue length is exceeded, dropping %d oldest samples" msgstr "" -"Comprimento máximo de local_queue do publicador foi excedido, descartando %d " -"amostras antigas" +"O comprimento máximo de local_queue do publicador foi excedido, descartando " +"%d amostras mais antigas" #, python-format msgid "Publishing policy is unknown (%s) force to default" -msgstr "Publicando política desconhecida (%s) força para o padrão" +msgstr "A política de publicação é desconhecida (%s), forçar para o padrão" #, python-format msgid "RGW AdminOps API returned %(status)s %(reason)s" msgstr "A API AdminOps RGW retornou %(status)s %(reason)s" msgid "Request failed to connect to OpenDaylight with NorthBound REST API" -msgstr "O pedido falhou ao conectar-se ao OpenDaylight com API REST NorthBound" +msgstr "" +"A solicitação falhou ao conectar-se ao OpenDaylight com a API REST NorthBound" #, python-format msgid "Required field %s not specified" @@ -325,14 +321,14 @@ msgstr "Ignorar a extensão de carregamento para %s" #, python-format msgid "String %s is not a valid isotime" -msgstr "Sequência %s não é um isotime válido" +msgstr "A sequência %s não é um isotime válido" msgid "" "The Yaml file that defines mapping between samples and gnocchi resources/" "metrics" msgstr "" -"O arquivo Yaml que define o mapeamento entre amostras e recursos gnocchi/" -"métrica" +"O arquivo Yaml que define o mapeamento entre amostras e recursos/métricas " +"gnocchi" #, python-format msgid "" @@ -351,10 +347,10 @@ msgstr "O caminho para o publicador do arquivo é necessário" #, python-format msgid "UDP: Cannot decode data sent by %s" -msgstr "UDP: Não pode decodificar dados enviados por %s" +msgstr "UDP: Não é possível decodificar dados enviados pelo %s" msgid "UDP: Unable to store meter" -msgstr "UDP: Não é possível armazenar medida" +msgstr "UDP: Não é possível armazenar o medidor" #, python-format msgid "Unable to connect to the database server: %(errmsg)s." @@ -364,7 +360,7 @@ msgstr "Não é possível conectar-se ao servidor de banco de dados: %(errmsg)s. msgid "" "Unable to convert the value %(value)s to the expected data type %(type)s." msgstr "" -"Não é possível converter o valor %(value)s para o tipo de dados esperado " +"Não é possível converter o valor %(value)s no tipo de dados esperado " "%(type)s." #, python-format @@ -377,18 +373,18 @@ msgstr "Não é possível avaliar expressão %(expr)s:%(exc)s" #, python-format msgid "Unable to load publisher %s" -msgstr "Impossível carregar publicador %s" +msgstr "Não é possível carregar o publicador %s" #, python-format msgid "Unable to load the hypervisor inspector: %s" -msgstr "Impossível carregar o inspetor do hypervisor: %s" +msgstr "Não é possível carregar o inspetor do hypervisor: %s" #, python-format msgid "" "Unable to reconnect to the primary mongodb after %(retries)d retries. Giving " "up." msgstr "" -"Não é possível se reconectar ao mongodb primário após %(retries)d novas " +"Não é possível reconectar-se ao mongodb primário após %(retries)d novas " "tentativas. Desistindo." #, python-format @@ -396,18 +392,17 @@ msgid "" "Unable to reconnect to the primary mongodb: %(errmsg)s. Trying again in " "%(retry_interval)d seconds." msgstr "" -"Não é possível se reconectar ao mongodb primário: %(errmsg)s. Tentando " +"Não é possível reconectar-se ao mongodb primário: %(errmsg)s. Tentando " "novamente em %(retry_interval)d segundos." msgid "Unable to send sample over UDP" -msgstr "Não é possível enviar amostra sobre UDP" +msgstr "Não é possível enviar a amostra sobre UDP" #, python-format msgid "" "Unexpected exception converting %(value)s to the expected data type %(type)s." msgstr "" -"Exceção inesperada convertendo %(value)s para o tipo de dado esperado " -"%(type)s." +"Exceção inesperada ao converter %(value)s no tipo de dados esperado %(type)s." #, python-format msgid "Unknown discovery extension: %s" @@ -415,7 +410,7 @@ msgstr "Extensão de descoberta desconhecida: %s" #, python-format msgid "Unknown metadata type. Key (%s) will not be queryable." -msgstr "Tipo de metada desconhecido. Chave (%s) não será consultável." +msgstr "Tipo de metadados desconhecido. A chave (%s) não será consultável." #, python-format msgid "" @@ -427,8 +422,7 @@ msgstr "" #, python-format msgid "Unknown status %(stat)s received on fw %(id)s,skipping sample" msgstr "" -"Status desconhecido %(stat)s recebido na largura da fonte %(id)s, ignorando " -"a amostra" +"Status desconhecido %(stat)s recebido no fw %(id)s, ignorando a amostra" #, python-format msgid "Unknown status %(stat)s received on listener %(id)s, skipping sample" @@ -443,7 +437,7 @@ msgstr "" #, python-format msgid "Unknown status %(stat)s received on pool %(id)s, skipping sample" msgstr "" -"Status desconhecido %(stat)s recebido no conjunto %(id)s, ignorando amostras" +"Status desconhecido %(stat)s recebido no conjunto %(id)s, ignorando a amostra" #, python-format msgid "Unknown status %(stat)s received on vip %(id)s, skipping sample" @@ -458,7 +452,7 @@ msgstr "" #, python-format msgid "VM %s not found in VMware vSphere" -msgstr "VM %s não localizado no VMware vSphere" +msgstr "Máquina virtual %s não localizada no VMware vSphere" #, python-format msgid "VM %s not found in XenServer" @@ -472,25 +466,30 @@ msgstr "XenAPI não instalado" #, python-format msgid "YAML error reading Definitions file %(file)s" -msgstr "Erro YAML ao ler o arquivo de definições %(file)s" +msgstr "Erro YAML ao ler o arquivo Definitions %(file)s" + +msgid "alarms URLs is unavailable when Aodh is disabled or unavailable." +msgstr "" +"A URL de alarmes está indisponível quando o Aodh está desativado ou " +"indisponível." #, python-format msgid "could not get CPU time for %(id)s: %(e)s" -msgstr "não pôde obter o tempo de CPU para %(id)s: %(e)s" +msgstr "não foi possível obter o tempo de CPU para %(id)s: %(e)s" msgid "direct option cannot be true when Gnocchi is enabled." msgstr "A opção direta não pode ser true quando o Gnocchi está ativado. " #, python-format msgid "dropping out of time order sample: %s" -msgstr "eliminando amostra fora de ordem de tempo: %s" +msgstr "eliminando amostra de pedido fora do prazo: %s" #, python-format msgid "dropping sample with no predecessor: %s" msgstr "descartando amostra sem predecessor: %s" msgid "ipmitool output length mismatch" -msgstr "incompatibilidade no comprimento da saída de ipmitool" +msgstr "incompatibilidade no comprimento da saída do ipmitool" msgid "max_bytes and backup_count should be numbers." msgstr "max_bytes e backup_count devem ser números." @@ -501,11 +500,11 @@ msgstr "assinatura de mensagem inválida, descartando mensagem: %r" msgid "parse IPMI sensor data failed,No data retrieved from given input" msgstr "" -"análise dos dados do sensor IPMI com falha, nenhum dado recuperado da " -"entrada fornecida" +"A análise dos dados do sensor IPMI falhou. Nenhum dado recuperado da entrada " +"fornecida" msgid "parse IPMI sensor data failed,unknown sensor type" -msgstr "análise dos dados do sensor IPMI com falha,tipo de sensor desconhecido" +msgstr "A análise dos dados do sensor IPMI falhou, tipo de sensor desconhecido" msgid "running ipmitool failure" -msgstr "executando falha de ipmitool" +msgstr "falha ao executar o ipmitool" diff --git a/ceilometer/locale/ru/LC_MESSAGES/ceilometer.po b/ceilometer/locale/ru/LC_MESSAGES/ceilometer.po index 3436a84b6d..ccf609c25d 100644 --- a/ceilometer/locale/ru/LC_MESSAGES/ceilometer.po +++ b/ceilometer/locale/ru/LC_MESSAGES/ceilometer.po @@ -9,9 +9,9 @@ # Lucas Palm , 2016. #zanata msgid "" msgstr "" -"Project-Id-Version: ceilometer 6.0.0.0b4.dev34\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-03-09 20:26+0000\n" +"Project-Id-Version: ceilometer 6.0.1.dev11\n" +"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" +"POT-Creation-Date: 2016-05-19 11:00+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff --git a/ceilometer/locale/zh_CN/LC_MESSAGES/ceilometer.po b/ceilometer/locale/zh_CN/LC_MESSAGES/ceilometer.po index 81b05ba50a..e5b66ff560 100644 --- a/ceilometer/locale/zh_CN/LC_MESSAGES/ceilometer.po +++ b/ceilometer/locale/zh_CN/LC_MESSAGES/ceilometer.po @@ -12,18 +12,16 @@ # Yu Zhang, 2013 # 颜海峰 , 2014 # English translations for ceilometer. -# OpenStack Infra , 2015. #zanata -# Daisy , 2016. #zanata # Linda , 2016. #zanata msgid "" msgstr "" -"Project-Id-Version: ceilometer 6.0.1.dev3\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-04-07 10:58+0000\n" +"Project-Id-Version: ceilometer 6.0.1.dev11\n" +"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" +"POT-Creation-Date: 2016-05-19 11:00+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2016-04-19 05:12+0000\n" +"PO-Revision-Date: 2016-04-29 04:40+0000\n" "Last-Translator: Linda \n" "Language: zh-CN\n" "Language-Team: Chinese (China)\n" @@ -37,11 +35,11 @@ msgstr "无法找到 %(entity)s %(id)s " #, python-format msgid "Arithmetic transformer must use at least one meter in expression '%s'" -msgstr "算术变形器在表达式'%s'中必须至少使用一个指标" +msgstr "算术变形器在表达式“%s”中必须至少使用一个指标" #, python-format msgid "Cannot create table %(table_name)s it already exists. Ignoring error" -msgstr "表%(table_name)s已经存在,无法创建。忽略此错误继续执行。" +msgstr "无法创建表 %(table_name)s,因为它已存在。忽略此错误" #, python-format msgid "Continue after error from %(name)s: %(error)s" @@ -53,32 +51,33 @@ msgstr "无法连接伺服主机:%s " #, python-format msgid "Could not connect to XenAPI: %s" -msgstr "无法连接到XenAPI:%s" +msgstr "无法连接到 XenAPI:%s" #, python-format msgid "Could not get CPU Util for %(id)s: %(e)s" -msgstr "无法为虚拟机%(id)s获取CPU使用率:%(e)s" +msgstr "无法获取 %(id)s 的 CPU 使用率:%(e)s" #, python-format msgid "Could not get Memory Usage for %(id)s: %(e)s" -msgstr "无法为%(id)s获取内存使用信息:%(e)s" +msgstr "无法获取 %(id)s 的内存使用情况:%(e)s" #, python-format msgid "Could not get VM %s CPU Utilization" -msgstr "无法获取虚拟机%s的CPU使用率" +msgstr "无法获取 VM %s CPU 使用率" #, python-format msgid "Couldn't obtain IP address of instance %s" -msgstr "无法为实例%s获取IP地址" +msgstr "无法获取实例 %s 的 IP 地址" msgid "" "Dispatcher target was not set, no meter will be posted. Set the target in " "the ceilometer.conf file" -msgstr "分发器目标未设置,没有指标将被发送。在ceilometer.conf文件中设置目标。" +msgstr "" +"未设置分发器目标,将不会发布测量数据。请在 ceilometer.conf 文件中设置目标。" #, python-format msgid "Dropping Notification %(type)s (uuid:%(msgid)s)" -msgstr "正在丢弃通知%(type)s (uuid:%(msgid)s)" +msgstr "正在删除通知 %(type)s (uuid:%(msgid)s)" #, python-format msgid "" @@ -99,7 +98,7 @@ msgid "Event" msgstr "事件" msgid "Expression evaluated to a NaN value!" -msgstr "表达式计算结果为NaN!" +msgstr "表达式计算结果为 NaN 值!" #, python-format msgid "Failed to import extension for %(name)s: %(error)s" @@ -109,15 +108,14 @@ msgstr "未能导入 %(name)s 的扩展:%(error)s" msgid "" "Failed to inspect data of instance , domain state " "is SHUTOFF." -msgstr "" -"为虚拟机获取监控数据失败了,虚拟机状态为SHUTOFF" +msgstr "未能检查到实例 的数据,域状态为 SHUTOFF。" #, python-format msgid "" "Failed to inspect memory usage of %(instance_uuid)s, can not get info from " "libvirt: %(error)s" msgstr "" -"为虚拟机%(instance_uuid)s采集内存使用指标失败了,无法从libvirt获取信息:" +"未能检查到 %(instance_uuid)s 的内存使用情况,无法从 libvirt 获取信息:" "%(error)s" #, python-format @@ -125,8 +123,8 @@ msgid "" "Failed to inspect memory usage of instance , can " "not get info from libvirt." msgstr "" -"为虚拟机采集内存使用指标失败了,无法从libvirt获取信" -"息。" +"未能检查到实例 的内存使用情况,无法从 libvirt 获取" +"信息。" #, python-format msgid "Failed to load any notification handlers for %s" @@ -134,31 +132,31 @@ msgstr "无法为 %s 加载任何通知处理器" #, python-format msgid "Failed to parse the timestamp value %s" -msgstr "解析时间戳%s失败" +msgstr "未能解析时间戳记值 %s" #, python-format msgid "Failed to publish %d datapoints, dropping them" -msgstr "发布%d个数据点时失败,正在将其丢弃" +msgstr "未能发布 %d 个数据点,正在将其删除" #, python-format msgid "Failed to publish %d datapoints, queue them" -msgstr "发布%d个数据点时失败,将其入队" +msgstr "未能发布 %d 个数据点,将其入队" #, python-format msgid "Failed to record metering data: %s" -msgstr "无法保存监控数据:%s" +msgstr "无法记录测量数据:%s" #, python-format msgid "Filter expression not valid: %s" -msgstr "过滤表达式不合法:%s" +msgstr "过滤表达式无效:%s" #, python-format msgid "Ignoring instance %(name)s (%(instance_id)s) : %(error)s" -msgstr "忽略虚拟机%(name)s (%(instance_id)s) : %(error)s" +msgstr "忽略实例 %(name)s (%(instance_id)s):%(error)s" #, python-format msgid "Ignoring instance %(name)s: %(error)s" -msgstr "忽略虚拟机%(name)s:%(error)s" +msgstr "忽略实例 %(name)s:%(error)s" #, python-format msgid "Ignoring loadbalancer %(loadbalancer_id)s" @@ -177,25 +175,25 @@ msgstr "" #, python-format msgid "Invalid period %(period)s: %(err)s" -msgstr "非法的间隔%(period)s: %(err)s" +msgstr "无效的时间段 %(period)s:%(err)s" #, python-format msgid "Invalid trait type '%(type)s' for trait %(trait)s" -msgstr "特征%(trait)s包含了不合法的特征类型'%(type)s' " +msgstr "特征 %(trait)s 包含了无效法的特征类型“%(type)s” " msgid "Limit must be positive" -msgstr "limit必须是正数" +msgstr "limit 必须是正数" #, python-format msgid "More than one event with id %s returned from storage driver" -msgstr "从数据库返回了多个id为%s的事件" +msgstr "从存储库驱动程序返回了多个标识为 %s 的事件" #, python-format msgid "Multiple VM %s found in XenServer" -msgstr "多个虚拟机%s在XenServer中被找到" +msgstr "在 XenServer 中找到多个 VM %s" msgid "Must specify connection_url, and connection_password to use" -msgstr "使用时必须指定connection_url和connection_password" +msgstr "使用时必须指定 connection_url 和 connection_password" #, python-format msgid "No plugin named %(plugin)s available for %(name)s" @@ -210,11 +208,11 @@ msgstr "未授权访问 %(aspect)s %(id)s" #, python-format msgid "OpenDaylitght API returned %(status)s %(reason)s" -msgstr "OpenDaylight接口返回状态%(status)s,原因%(reason)s" +msgstr "OpenDaylitght API 返回了状态 %(status)s %(reason)s" #, python-format msgid "Opencontrail API returned %(status)s %(reason)s" -msgstr "Opencontrail接口返回状态%(status)s,原因%(reason)s" +msgstr "Opencontrail API 返回了 %(status)s %(reason)s" #, python-format msgid "" @@ -230,7 +228,7 @@ msgstr "运算符 %(operator)s 不受支持。受支持的运算符为:%(suppo #, python-format msgid "Order-by expression not valid: %s" -msgstr "orderby表达式不合法:%s" +msgstr "排序依据表达式无效:%s" #, python-format msgid "" @@ -238,7 +236,7 @@ msgid "" msgstr "%(name)s 的 JSONPath 规范“%(jsonpath)s”中存在解析错误:%(err)s" msgid "Period must be positive." -msgstr "period 参数必须是正数" +msgstr "时间段必须是正数。" #, python-format msgid "Pipeline %(pipeline)s: %(status)s after error from publisher %(pub)s" @@ -261,11 +259,11 @@ msgstr "管道 %(pipeline)s:%(smp)s 的变形器%(trans)s 出错,退出" #, python-format msgid "Plugin specified, but no plugin name supplied for %s" -msgstr "指定了插件,但未对 %s 提供插件名" +msgstr "指定了插件,但没有为 %s 提供插件名" #, python-format msgid "Polling %(mtr)s sensor failed for %(cnt)s times!" -msgstr "拉取%(mtr)s传感器失败了%(cnt)s次!" +msgstr "轮询 %(mtr)s 传感器已失败 %(cnt)s 次!" #, python-format msgid "Polling %(name)s failed for %(cnt)s times!" @@ -273,7 +271,7 @@ msgstr "轮询 %(name)s 已失败 %(cnt)s 次!" #, python-format msgid "Pollster for %s is disabled!" -msgstr "%s的采集器被禁用" +msgstr "已禁用 %s 的采集器!" #, python-format msgid "Prevent pollster %(name)s for polling source %(source)s anymore!" @@ -282,28 +280,28 @@ msgstr "请阻止轮询程序 %(name)s 再轮询源 %(source)s!" #, python-format msgid "" "Publisher max local_queue length is exceeded, dropping %d oldest samples" -msgstr "发布的数据量超过本地队列最大长度,正在丢弃最老的%d个数据" +msgstr "超过发布器的本地队列最大长度,正在删除最旧的 %d 个样本" #, python-format msgid "Publishing policy is unknown (%s) force to default" -msgstr "未知的发布策略(%s),强制使用默认策略" +msgstr "未知的发布策略 (%s),强制使用缺省值" #, python-format msgid "RGW AdminOps API returned %(status)s %(reason)s" -msgstr "RGW AdminOps接口返回%(status)s %(reason)s" +msgstr "RGW AdminOps API 返回了 %(status)s %(reason)s" msgid "Request failed to connect to OpenDaylight with NorthBound REST API" -msgstr "请求无法连接到OpenDaylight的北向REST接口" +msgstr "请求无法连接到带有 NorthBound REST API 的 OpenDaylight" #, python-format msgid "Required field %s not specified" -msgstr "必填项%s没有填写" +msgstr "未指定所需字段 %s" msgid "Resource" msgstr "资源" msgid "Sample" -msgstr "数据" +msgstr "样本" msgid "Samples should be included in request body" msgstr "样本应包括在请求主体中" @@ -314,12 +312,12 @@ msgstr "跳过 %s 的加载扩展" #, python-format msgid "String %s is not a valid isotime" -msgstr "字符串%s不是个合法的标准时间格式" +msgstr "字符串 %s 是无效的标准时间格式" msgid "" "The Yaml file that defines mapping between samples and gnocchi resources/" "metrics" -msgstr "用于定义样本与 gnocchi 资源/度量值之间的映射的Yaml 文件" +msgstr "定义样本与 gnocchi 资源/度量值之间的映射的 Yaml 文件" #, python-format msgid "" @@ -332,7 +330,7 @@ msgid "The field 'fields' is required for %s" msgstr "%s 需要字段“fields”" msgid "The path for the file publisher is required" -msgstr "文件发布器必须设置文件路径" +msgstr "需要文件发布器的路径" #, python-format msgid "UDP: Cannot decode data sent by %s" @@ -356,7 +354,7 @@ msgstr "无法发现资源:%s" #, python-format msgid "Unable to evaluate expression %(expr)s: %(exc)s" -msgstr "无法计算表达式%(expr)s:%(exc)s" +msgstr "无法计算表达式 %(expr)s:%(exc)s" #, python-format msgid "Unable to load publisher %s" @@ -370,17 +368,17 @@ msgstr "无法加载管理程序的探测器:%s" msgid "" "Unable to reconnect to the primary mongodb after %(retries)d retries. Giving " "up." -msgstr "在%(retries)d次尝试后仍无法重连到MongoDB主节点。放弃重连。" +msgstr "在 %(retries)d 次尝试后仍无法重连到主要 MongoDB。放弃重连。" #, python-format msgid "" "Unable to reconnect to the primary mongodb: %(errmsg)s. Trying again in " "%(retry_interval)d seconds." msgstr "" -"无法重连到MongoDB主节点:%(errmsg)s。在%(retry_interval)d秒后进行重试。" +"无法重连到主要 MongoDB:%(errmsg)s。在 %(retry_interval)d 秒后进行重试。" msgid "Unable to send sample over UDP" -msgstr "无法通过UDP发送采样" +msgstr "无法通过 UDP 发送样本" #, python-format msgid "" @@ -393,7 +391,7 @@ msgstr "未知的发现扩展:%s" #, python-format msgid "Unknown metadata type. Key (%s) will not be queryable." -msgstr "未知的元数据类型。键(%s)将无法进行查询。" +msgstr "未知的元数据类型。键 (%s) 将无法进行查询。" #, python-format msgid "" @@ -402,7 +400,7 @@ msgstr "在负载均衡器 %(id)s 上接收到未知状态 %(stat)s,正在跳 #, python-format msgid "Unknown status %(stat)s received on fw %(id)s,skipping sample" -msgstr "从fw %(id)s收到未知的状态%(stat)s,跳过该采样数据" +msgstr "在 fw %(id)s 上接收到未知状态 %(stat)s,正在跳过样本" #, python-format msgid "Unknown status %(stat)s received on listener %(id)s, skipping sample" @@ -414,11 +412,11 @@ msgstr "在成员 %(id)s 上接收到未知状态 %(stat)s,正在跳过样本" #, python-format msgid "Unknown status %(stat)s received on pool %(id)s, skipping sample" -msgstr "从pool %(id)s收到未知的状态%(stat)s,跳过该采样数据" +msgstr "在池 %(id)s 上接收到未知状态 %(stat)s,正在跳过样本" #, python-format msgid "Unknown status %(stat)s received on vip %(id)s, skipping sample" -msgstr "从vip %(id)s收到未知的状态%(stat)s,跳过该采样数据" +msgstr "在 vip %(id)s 上接收到未知状态 %(stat)s,正在跳过样本" #, python-format msgid "Unknown status %(stat)s received on vpn %(id)s, skipping sample" @@ -426,17 +424,17 @@ msgstr "在 VPN %(id)s 上接收到未知状态 %(stat)s,正在跳过样本" #, python-format msgid "VM %s not found in VMware vSphere" -msgstr "在 VMware vSphere 中,找不到 VM %s" +msgstr "在 VMware vSphere 中未找到 VM %s" #, python-format msgid "VM %s not found in XenServer" -msgstr "无法在XenServer中找到虚拟机%s" +msgstr "在 XenServer 中未找到 VM %s" msgid "Wrong sensor type" msgstr "错误的传感器类型" msgid "XenAPI not installed" -msgstr "XenAPI没有安装" +msgstr "没有安装 XenAPI" #, python-format msgid "YAML error reading Definitions file %(file)s" @@ -447,7 +445,7 @@ msgstr "Aodh 被禁用或不可用时,警报 URL 不可用。" #, python-format msgid "could not get CPU time for %(id)s: %(e)s" -msgstr "无法为虚拟机%(id)s获取CPU时间:%(e)s" +msgstr "无法获取 %(id)s 的 CPU 时间:%(e)s" msgid "direct option cannot be true when Gnocchi is enabled." msgstr "启用 Gnocchi 后,direct 选项不能为 true。" @@ -458,23 +456,23 @@ msgstr "正在退出时间顺序样本:%s" #, python-format msgid "dropping sample with no predecessor: %s" -msgstr "因为之前没有数据(用来计算差值)因而丢弃数据:%s" +msgstr "正在删除没有先前数据的样本:%s" msgid "ipmitool output length mismatch" -msgstr "ipmi输出长度不匹配" +msgstr "ipmitool 输出长度不匹配" msgid "max_bytes and backup_count should be numbers." -msgstr "max_bytes和backup_count必须是整数。" +msgstr "max_bytes 和 backup_count 应该是数字。" #, python-format msgid "message signature invalid, discarding message: %r" -msgstr "消息签名不合法,丢弃消息:%r" +msgstr "消息签名无效,丢弃消息:%r" msgid "parse IPMI sensor data failed,No data retrieved from given input" -msgstr "解析IPMI传感器数据失败,从给定的输入中无法检索到数据" +msgstr "解析 IPMI 传感器数据失败,从给定的输入中无法检索到数据" msgid "parse IPMI sensor data failed,unknown sensor type" -msgstr "解析IPMI传感器数据失败,未知的传感器类型" +msgstr "解析 IPMI 传感器数据失败,未知的传感器类型" msgid "running ipmitool failure" -msgstr "运行ipmitool时失败了" +msgstr "运行 ipmitool 时失败" diff --git a/ceilometer/locale/zh_TW/LC_MESSAGES/ceilometer.po b/ceilometer/locale/zh_TW/LC_MESSAGES/ceilometer.po index 25ca23b9bb..cfaf413ef3 100644 --- a/ceilometer/locale/zh_TW/LC_MESSAGES/ceilometer.po +++ b/ceilometer/locale/zh_TW/LC_MESSAGES/ceilometer.po @@ -7,9 +7,9 @@ # Jennifer , 2016. #zanata msgid "" msgstr "" -"Project-Id-Version: ceilometer 6.0.1.dev3\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-04-07 10:58+0000\n" +"Project-Id-Version: ceilometer 6.0.1.dev11\n" +"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" +"POT-Creation-Date: 2016-05-19 11:00+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -75,7 +75,7 @@ msgid "" "Error from libvirt while looking up instance : " "[Error Code %(error_code)s] %(ex)s" msgstr "" -"查閱實例 <名稱=%(name)s,ID=%(id)s> 時,libvirt 中發生錯誤:[錯誤碼 " +"查閱實例 時,libvirt 中發生錯誤:[錯誤碼 " "%(error_code)s] %(ex)s" #, python-format @@ -99,7 +99,7 @@ msgstr "無法匯入 %(name)s 的延伸:%(error)s" msgid "" "Failed to inspect data of instance , domain state " "is SHUTOFF." -msgstr "無法檢查實例 <名稱=%(name)s,ID=%(id)s> 的資料,網域狀態為 SHUTOFF。" +msgstr "無法檢查實例 的資料,網域狀態為 SHUTOFF。" #, python-format msgid "" @@ -113,7 +113,7 @@ msgid "" "Failed to inspect memory usage of instance , can " "not get info from libvirt." msgstr "" -"無法檢查實例 <名稱=%(name)s,ID=%(id)s> 的記憶體用量,無法從 libvirt 取得資" +"無法檢查實例 的記憶體用量,無法從 libvirt 取得資" "訊。" #, python-format From 7951eb5edff433d12be7fe16ffbaa6ea140b37bf Mon Sep 17 00:00:00 2001 From: ZhiQiang Fan Date: Sun, 22 May 2016 08:56:56 +0800 Subject: [PATCH 11/14] enable swift pollsters poll data for specific region Currently swift pollsters only poll data from first region, which is bad for multiple regions scenario. This patch enables poll swift data for specific region. And improves log message and promotes the log level to INFO, now it looks like: Swift endpoint not found: public endpoint for object-store service in RegionTwo region not found Change-Id: Ifffb33ba1174a1a54f0ce1c4614bcd35d57ea4c3 Closes-Bug: #1584364 (cherry picked from commit 1610935ee3c00105df0e3038d249301e4627c381) --- ceilometer/objectstore/swift.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/ceilometer/objectstore/swift.py b/ceilometer/objectstore/swift.py index 89d723436d..085e99d6e6 100644 --- a/ceilometer/objectstore/swift.py +++ b/ceilometer/objectstore/swift.py @@ -25,6 +25,7 @@ import six.moves.urllib.parse as urlparse from swiftclient import client as swift from ceilometer.agent import plugin_base +from ceilometer.i18n import _LI from ceilometer import keystone_client from ceilometer import sample @@ -72,9 +73,10 @@ class _Base(plugin_base.PollsterBase): _Base._ENDPOINT = keystone_client.get_service_catalog( ksclient).url_for( service_type=cfg.CONF.service_types.swift, - interface=conf.interface) - except exceptions.EndpointNotFound: - LOG.debug("Swift endpoint not found") + interface=conf.interface, + region_name=conf.region_name) + except exceptions.EndpointNotFound as e: + LOG.info(_LI("Swift endpoint not found: %s"), e) return _Base._ENDPOINT def _iter_accounts(self, ksclient, cache, tenants): From 9c08a89fe2dec2965bc63764b95d68fc1b1f12c3 Mon Sep 17 00:00:00 2001 From: ZhiQiang Fan Date: Thu, 2 Jun 2016 20:19:28 +0800 Subject: [PATCH 12/14] catch DriverLoadFailure for get_transport optional new oslo.messaging 5.2.0 release will raise oslo_messaging.transport.DriverLoadFailure if no existent transport driver, hence breaks our code and unit test as well. This patch fixes it by adding DriverLoadFailure to catch list. Also: tempest: import ImagesClient as ImagesClientV2 This commit [1] renamed ImagesClientV2 to ImagesClient so Ceilometer Tempest tests do not work anymore. [1] https://github.com/openstack/tempest/commit/2fea405bd6ea8674c8daaf8ebb788ae33d52c976 Change-Id: I02b5d1b3f4a9169cbf428a5eff9c6705494741af Closes-Bug: #1588151 (cherry picked from commit d7f8ce94e433da8af3660ecf52715a04c221fde5) (cherry picked from commit f6b2406fffdd4deae508b9f251691fe9b70cb1ee) --- ceilometer/messaging.py | 5 +++-- ceilometer/tests/tempest/service/client.py | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/ceilometer/messaging.py b/ceilometer/messaging.py index 64e7730e49..de96052c6b 100644 --- a/ceilometer/messaging.py +++ b/ceilometer/messaging.py @@ -34,8 +34,9 @@ def get_transport(url=None, optional=False, cache=True): if not transport or not cache: try: transport = oslo_messaging.get_transport(cfg.CONF, url) - except oslo_messaging.InvalidTransportURL as e: - if not optional or e.url: + except (oslo_messaging.InvalidTransportURL, + oslo_messaging.DriverLoadFailure): + if not optional or url: # NOTE(sileht): oslo_messaging is configured but unloadable # so reraise the exception raise diff --git a/ceilometer/tests/tempest/service/client.py b/ceilometer/tests/tempest/service/client.py index 81d67d8687..dedebc7f74 100644 --- a/ceilometer/tests/tempest/service/client.py +++ b/ceilometer/tests/tempest/service/client.py @@ -24,7 +24,8 @@ from tempest.lib.services.compute.networks_client import NetworksClient from tempest.lib.services.compute.servers_client import ServersClient from tempest import manager from tempest.services.image.v1.json.images_client import ImagesClient -from tempest.services.image.v2.json.images_client import ImagesClientV2 +from tempest.services.image.v2.json.images_client import ( + ImagesClient as ImagesClientV2) from tempest.services.object_storage.container_client import ContainerClient from tempest.services.object_storage.object_client import ObjectClient From 5976031a7e6bd0bea6713f96ec7f892b945f9f86 Mon Sep 17 00:00:00 2001 From: Ken'ichi Ohmichi Date: Mon, 6 Jun 2016 14:35:28 +0900 Subject: [PATCH 13/14] Copy images_client from tempest + Correct concurrency of gabbi 1.22.0 Now the gate test of ceilometer is broken, because the ceilometer test is using nonstable tempest interfaces and these interfaces are changed. QA team defines interfaces which are not under tempest.lib as unstable clearly according to https://github.com/openstack/tempest/blob/master/doc/source/library.rst#stability So current test way is against the QA policy, so here is a workaround. Copy&paste is not good, almost wrong. However, if still continuing the tests, it would be a nice option to copy&paste and pass the gate test. After QA team defines stable interfaces, that is a nice time to switch using the stable interfaces with removing this copy&paste code. Closes-Bug: #1589426 Depends-On: I3abd9049560ee507b3610ab482c697a239f13a3b (cherry picked from commit 6c0b97b1e6fc03bdf84bf9b888761bd22ea0ad58) + When running gabbi under testr, concurrency grouping is controlled by a regex in .testr.conf. A module name change in gabbi 1.22.0 inadvertently broke the grouping. This change should work for old and new versions. (cherry picked from commit 8fcbc8de4ea878bdec1ef8754eaf965e176854b3) Change-Id: I30266f1b690ea105511d9b1162755bcc85e2e69a --- .testr.conf | 2 +- ceilometer/tests/tempest/exceptions.py | 169 ++++++++ ceilometer/tests/tempest/service/client.py | 8 +- .../tests/tempest/service/images/__init__.py | 0 .../tempest/service/images/glance_http.py | 361 ++++++++++++++++++ .../tempest/service/images/v1/__init__.py | 0 .../service/images/v1/images_client.py | 257 +++++++++++++ .../tempest/service/images/v2/__init__.py | 0 .../service/images/v2/images_client.py | 245 ++++++++++++ 9 files changed, 1038 insertions(+), 4 deletions(-) create mode 100644 ceilometer/tests/tempest/exceptions.py create mode 100644 ceilometer/tests/tempest/service/images/__init__.py create mode 100644 ceilometer/tests/tempest/service/images/glance_http.py create mode 100644 ceilometer/tests/tempest/service/images/v1/__init__.py create mode 100644 ceilometer/tests/tempest/service/images/v1/images_client.py create mode 100644 ceilometer/tests/tempest/service/images/v2/__init__.py create mode 100644 ceilometer/tests/tempest/service/images/v2/images_client.py diff --git a/.testr.conf b/.testr.conf index 0a8a677b42..f8f2847a3d 100644 --- a/.testr.conf +++ b/.testr.conf @@ -6,4 +6,4 @@ test_command=OS_STDOUT_CAPTURE=${OS_STDOUT_CAPTURE:-1} \ test_id_option=--load-list $IDFILE test_list_option=--list # NOTE(chdent): Only used/matches on gabbi-related tests. -group_regex=(gabbi\.driver\.test_gabbi_(?:prefix_|)[^_]+)_ +group_regex=(gabbi\.(suitemaker|driver)\.test_gabbi_(?:prefix_|)[^_]+)_ diff --git a/ceilometer/tests/tempest/exceptions.py b/ceilometer/tests/tempest/exceptions.py new file mode 100644 index 0000000000..92f335f995 --- /dev/null +++ b/ceilometer/tests/tempest/exceptions.py @@ -0,0 +1,169 @@ +# Copyright 2012 OpenStack Foundation +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import testtools + + +class TempestException(Exception): + """Base Tempest Exception + + To correctly use this class, inherit from it and define + a 'message' property. That message will get printf'd + with the keyword arguments provided to the constructor. + """ + message = "An unknown exception occurred" + + def __init__(self, *args, **kwargs): + super(TempestException, self).__init__() + try: + self._error_string = self.message % kwargs + except Exception: + # at least get the core message out if something happened + self._error_string = self.message + if len(args) > 0: + # If there is a non-kwarg parameter, assume it's the error + # message or reason description and tack it on to the end + # of the exception message + # Convert all arguments into their string representations... + args = ["%s" % arg for arg in args] + self._error_string = (self._error_string + + "\nDetails: %s" % '\n'.join(args)) + + def __str__(self): + return self._error_string + + +class RestClientException(TempestException, + testtools.TestCase.failureException): + pass + + +class InvalidConfiguration(TempestException): + message = "Invalid Configuration" + + +class InvalidCredentials(TempestException): + message = "Invalid Credentials" + + +class InvalidServiceTag(TempestException): + message = "Invalid service tag" + + +class InvalidIdentityVersion(TempestException): + message = "Invalid version %(identity_version)s of the identity service" + + +class TimeoutException(TempestException): + message = "Request timed out" + + +class BuildErrorException(TempestException): + message = "Server %(server_id)s failed to build and is in ERROR status" + + +class ImageKilledException(TempestException): + message = "Image %(image_id)s 'killed' while waiting for '%(status)s'" + + +class AddImageException(TempestException): + message = "Image %(image_id)s failed to become ACTIVE in the allotted time" + + +class VolumeBuildErrorException(TempestException): + message = "Volume %(volume_id)s failed to build and is in ERROR status" + + +class VolumeRestoreErrorException(TempestException): + message = "Volume %(volume_id)s failed to restore and is in ERROR status" + + +class SnapshotBuildErrorException(TempestException): + message = "Snapshot %(snapshot_id)s failed to build and is in ERROR status" + + +class VolumeBackupException(TempestException): + message = "Volume backup %(backup_id)s failed and is in ERROR status" + + +class StackBuildErrorException(TempestException): + message = ("Stack %(stack_identifier)s is in %(stack_status)s status " + "due to '%(stack_status_reason)s'") + + +class EndpointNotFound(TempestException): + message = "Endpoint not found" + + +class IdentityError(TempestException): + message = "Got identity error" + + +class ServerUnreachable(TempestException): + message = "The server is not reachable via the configured network" + + +# NOTE(andreaf) This exception is added here to facilitate the migration +# of get_network_from_name and preprov_creds to tempest.lib, and it should +# be migrated along with them +class InvalidTestResource(TempestException): + message = "%(name) is not a valid %(type), or the name is ambiguous" + + +class RFCViolation(RestClientException): + message = "RFC Violation" + + +class InvalidHttpSuccessCode(RestClientException): + message = "The success code is different than the expected one" + + +class BadRequest(RestClientException): + message = "Bad request" + + +class ResponseWithNonEmptyBody(RFCViolation): + message = ("RFC Violation! Response with %(status)d HTTP Status Code " + "MUST NOT have a body") + + +class ResponseWithEntity(RFCViolation): + message = ("RFC Violation! Response with 205 HTTP Status Code " + "MUST NOT have an entity") + + +class InvalidHTTPResponseHeader(RestClientException): + message = "HTTP response header is invalid" + + +class InvalidStructure(TempestException): + message = "Invalid structure of table with details" + + +class CommandFailed(Exception): + def __init__(self, returncode, cmd, output, stderr): + super(CommandFailed, self).__init__() + self.returncode = returncode + self.cmd = cmd + self.stdout = output + self.stderr = stderr + + def __str__(self): + return ("Command '%s' returned non-zero exit status %d.\n" + "stdout:\n%s\n" + "stderr:\n%s" % (self.cmd, + self.returncode, + self.stdout, + self.stderr)) diff --git a/ceilometer/tests/tempest/service/client.py b/ceilometer/tests/tempest/service/client.py index dedebc7f74..c9d8548857 100644 --- a/ceilometer/tests/tempest/service/client.py +++ b/ceilometer/tests/tempest/service/client.py @@ -23,12 +23,14 @@ from tempest.lib.services.compute.floating_ips_client import FloatingIPsClient from tempest.lib.services.compute.networks_client import NetworksClient from tempest.lib.services.compute.servers_client import ServersClient from tempest import manager -from tempest.services.image.v1.json.images_client import ImagesClient -from tempest.services.image.v2.json.images_client import ( - ImagesClient as ImagesClientV2) from tempest.services.object_storage.container_client import ContainerClient from tempest.services.object_storage.object_client import ObjectClient +from ceilometer.tests.tempest.service.images.v1.images_client import \ + ImagesClient +from ceilometer.tests.tempest.service.images.v2.images_client import \ + ImagesClient as ImagesClientV2 + CONF = config.CONF diff --git a/ceilometer/tests/tempest/service/images/__init__.py b/ceilometer/tests/tempest/service/images/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ceilometer/tests/tempest/service/images/glance_http.py b/ceilometer/tests/tempest/service/images/glance_http.py new file mode 100644 index 0000000000..19a9d9810a --- /dev/null +++ b/ceilometer/tests/tempest/service/images/glance_http.py @@ -0,0 +1,361 @@ +# Copyright 2012 OpenStack Foundation +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +# Originally copied from python-glanceclient + +import copy +import hashlib +import posixpath +import re +import socket +import struct + +import OpenSSL +from oslo_log import log as logging +import six +from six import moves +from six.moves import http_client as httplib +from six.moves.urllib import parse as urlparse + +from ceilometer.tests.tempest import exceptions as exc + +LOG = logging.getLogger(__name__) +USER_AGENT = 'tempest' +CHUNKSIZE = 1024 * 64 # 64kB +TOKEN_CHARS_RE = re.compile('^[-A-Za-z0-9+/=]*$') + + +class HTTPClient(object): + + def __init__(self, auth_provider, filters, **kwargs): + self.auth_provider = auth_provider + self.filters = filters + self.endpoint = auth_provider.base_url(filters) + endpoint_parts = urlparse.urlparse(self.endpoint) + self.endpoint_scheme = endpoint_parts.scheme + self.endpoint_hostname = endpoint_parts.hostname + self.endpoint_port = endpoint_parts.port + + self.connection_class = self._get_connection_class( + self.endpoint_scheme) + self.connection_kwargs = self._get_connection_kwargs( + self.endpoint_scheme, **kwargs) + + @staticmethod + def _get_connection_class(scheme): + if scheme == 'https': + return VerifiedHTTPSConnection + else: + return httplib.HTTPConnection + + @staticmethod + def _get_connection_kwargs(scheme, **kwargs): + _kwargs = {'timeout': float(kwargs.get('timeout', 600))} + + if scheme == 'https': + _kwargs['ca_certs'] = kwargs.get('ca_certs', None) + _kwargs['cert_file'] = kwargs.get('cert_file', None) + _kwargs['key_file'] = kwargs.get('key_file', None) + _kwargs['insecure'] = kwargs.get('insecure', False) + _kwargs['ssl_compression'] = kwargs.get('ssl_compression', True) + + return _kwargs + + def _get_connection(self): + _class = self.connection_class + try: + return _class(self.endpoint_hostname, self.endpoint_port, + **self.connection_kwargs) + except httplib.InvalidURL: + raise exc.EndpointNotFound + + def _http_request(self, url, method, **kwargs): + """Send an http request with the specified characteristics. + + Wrapper around httplib.HTTP(S)Connection.request to handle tasks such + as setting headers and error handling. + """ + # Copy the kwargs so we can reuse the original in case of redirects + kwargs['headers'] = copy.deepcopy(kwargs.get('headers', {})) + kwargs['headers'].setdefault('User-Agent', USER_AGENT) + + self._log_request(method, url, kwargs['headers']) + + conn = self._get_connection() + + try: + url_parts = urlparse.urlparse(url) + conn_url = posixpath.normpath(url_parts.path) + LOG.debug('Actual Path: {path}'.format(path=conn_url)) + if kwargs['headers'].get('Transfer-Encoding') == 'chunked': + conn.putrequest(method, conn_url) + for header, value in kwargs['headers'].items(): + conn.putheader(header, value) + conn.endheaders() + chunk = kwargs['body'].read(CHUNKSIZE) + # Chunk it, baby... + while chunk: + conn.send('%x\r\n%s\r\n' % (len(chunk), chunk)) + chunk = kwargs['body'].read(CHUNKSIZE) + conn.send('0\r\n\r\n') + else: + conn.request(method, conn_url, **kwargs) + resp = conn.getresponse() + except socket.gaierror as e: + message = ("Error finding address for %(url)s: %(e)s" % + {'url': url, 'e': e}) + raise exc.EndpointNotFound(message) + except (socket.error, socket.timeout) as e: + message = ("Error communicating with %(endpoint)s %(e)s" % + {'endpoint': self.endpoint, 'e': e}) + raise exc.TimeoutException(message) + + body_iter = ResponseBodyIterator(resp) + # Read body into string if it isn't obviously image data + if resp.getheader('content-type', None) != 'application/octet-stream': + body_str = ''.join([body_chunk for body_chunk in body_iter]) + body_iter = six.StringIO(body_str) + self._log_response(resp, None) + else: + self._log_response(resp, body_iter) + + return resp, body_iter + + def _log_request(self, method, url, headers): + LOG.info('Request: ' + method + ' ' + url) + if headers: + headers_out = headers + if 'X-Auth-Token' in headers and headers['X-Auth-Token']: + token = headers['X-Auth-Token'] + if len(token) > 64 and TOKEN_CHARS_RE.match(token): + headers_out = headers.copy() + headers_out['X-Auth-Token'] = "" + LOG.info('Request Headers: ' + str(headers_out)) + + def _log_response(self, resp, body): + status = str(resp.status) + LOG.info("Response Status: " + status) + if resp.getheaders(): + LOG.info('Response Headers: ' + str(resp.getheaders())) + if body: + str_body = str(body) + length = len(body) + LOG.info('Response Body: ' + str_body[:2048]) + if length >= 2048: + self.LOG.debug("Large body (%d) md5 summary: %s", length, + hashlib.md5(str_body).hexdigest()) + + def raw_request(self, method, url, **kwargs): + kwargs.setdefault('headers', {}) + kwargs['headers'].setdefault('Content-Type', + 'application/octet-stream') + if 'body' in kwargs: + if (hasattr(kwargs['body'], 'read') + and method.lower() in ('post', 'put')): + # We use 'Transfer-Encoding: chunked' because + # body size may not always be known in advance. + kwargs['headers']['Transfer-Encoding'] = 'chunked' + + # Decorate the request with auth + req_url, kwargs['headers'], kwargs['body'] = \ + self.auth_provider.auth_request( + method=method, url=url, headers=kwargs['headers'], + body=kwargs.get('body', None), filters=self.filters) + return self._http_request(req_url, method, **kwargs) + + +class OpenSSLConnectionDelegator(object): + """An OpenSSL.SSL.Connection delegator. + + Supplies an additional 'makefile' method which httplib requires + and is not present in OpenSSL.SSL.Connection. + + Note: Since it is not possible to inherit from OpenSSL.SSL.Connection + a delegator must be used. + """ + def __init__(self, *args, **kwargs): + self.connection = OpenSSL.SSL.Connection(*args, **kwargs) + + def __getattr__(self, name): + return getattr(self.connection, name) + + def makefile(self, *args, **kwargs): + # Ensure the socket is closed when this file is closed + kwargs['close'] = True + return socket._fileobject(self.connection, *args, **kwargs) + + +class VerifiedHTTPSConnection(httplib.HTTPSConnection): + """Extended HTTPSConnection which uses OpenSSL library for enhanced SSL + + Note: Much of this functionality can eventually be replaced + with native Python 3.3 code. + """ + def __init__(self, host, port=None, key_file=None, cert_file=None, + ca_certs=None, timeout=None, insecure=False, + ssl_compression=True): + httplib.HTTPSConnection.__init__(self, host, port, + key_file=key_file, + cert_file=cert_file) + self.key_file = key_file + self.cert_file = cert_file + self.timeout = timeout + self.insecure = insecure + self.ssl_compression = ssl_compression + self.ca_certs = ca_certs + self.setcontext() + + @staticmethod + def host_matches_cert(host, x509): + """Verify that the x509 certificate we have received from 'host' + + Identifies the server we are connecting to, ie that the certificate's + Common Name or a Subject Alternative Name matches 'host'. + """ + # First see if we can match the CN + if x509.get_subject().commonName == host: + return True + + # Also try Subject Alternative Names for a match + san_list = None + for i in moves.xrange(x509.get_extension_count()): + ext = x509.get_extension(i) + if ext.get_short_name() == 'subjectAltName': + san_list = str(ext) + for san in ''.join(san_list.split()).split(','): + if san == "DNS:%s" % host: + return True + + # Server certificate does not match host + msg = ('Host "%s" does not match x509 certificate contents: ' + 'CommonName "%s"' % (host, x509.get_subject().commonName)) + if san_list is not None: + msg = msg + ', subjectAltName "%s"' % san_list + raise exc.SSLCertificateError(msg) + + def verify_callback(self, connection, x509, errnum, + depth, preverify_ok): + if x509.has_expired(): + msg = "SSL Certificate expired on '%s'" % x509.get_notAfter() + raise exc.SSLCertificateError(msg) + + if depth == 0 and preverify_ok is True: + # We verify that the host matches against the last + # certificate in the chain + return self.host_matches_cert(self.host, x509) + else: + # Pass through OpenSSL's default result + return preverify_ok + + def setcontext(self): + """Set up the OpenSSL context.""" + self.context = OpenSSL.SSL.Context(OpenSSL.SSL.SSLv23_METHOD) + + if self.ssl_compression is False: + self.context.set_options(0x20000) # SSL_OP_NO_COMPRESSION + + if self.insecure is not True: + self.context.set_verify(OpenSSL.SSL.VERIFY_PEER, + self.verify_callback) + else: + self.context.set_verify(OpenSSL.SSL.VERIFY_NONE, + self.verify_callback) + + if self.cert_file: + try: + self.context.use_certificate_file(self.cert_file) + except Exception as e: + msg = 'Unable to load cert from "%s" %s' % (self.cert_file, e) + raise exc.SSLConfigurationError(msg) + if self.key_file is None: + # We support having key and cert in same file + try: + self.context.use_privatekey_file(self.cert_file) + except Exception as e: + msg = ('No key file specified and unable to load key ' + 'from "%s" %s' % (self.cert_file, e)) + raise exc.SSLConfigurationError(msg) + + if self.key_file: + try: + self.context.use_privatekey_file(self.key_file) + except Exception as e: + msg = 'Unable to load key from "%s" %s' % (self.key_file, e) + raise exc.SSLConfigurationError(msg) + + if self.ca_certs: + try: + self.context.load_verify_locations(self.ca_certs) + except Exception as e: + msg = 'Unable to load CA from "%s" %s' % (self.ca_certs, e) + raise exc.SSLConfigurationError(msg) + else: + self.context.set_default_verify_paths() + + def connect(self): + """Connect to SSL port and apply per-connection parameters.""" + try: + addresses = socket.getaddrinfo(self.host, + self.port, + socket.AF_UNSPEC, + socket.SOCK_STREAM) + except OSError as msg: + raise exc.RestClientException(msg) + for res in addresses: + af, socktype, proto, canonname, sa = res + sock = socket.socket(af, socket.SOCK_STREAM) + + if self.timeout is not None: + # '0' microseconds + sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVTIMEO, + struct.pack('LL', self.timeout, 0)) + self.sock = OpenSSLConnectionDelegator(self.context, sock) + try: + self.sock.connect(sa) + except OSError as msg: + if self.sock: + self.sock = None + continue + break + if self.sock is None: + # Happen only when all results have failed. + raise exc.RestClientException('Cannot connect to %s' % self.host) + + def close(self): + if self.sock: + # Remove the reference to the socket but don't close it yet. + # Response close will close both socket and associated + # file. Closing socket too soon will cause response + # reads to fail with socket IO error 'Bad file descriptor'. + self.sock = None + httplib.HTTPSConnection.close(self) + + +class ResponseBodyIterator(object): + """A class that acts as an iterator over an HTTP response.""" + + def __init__(self, resp): + self.resp = resp + + def __iter__(self): + while True: + yield self.next() + + def next(self): + chunk = self.resp.read(CHUNKSIZE) + if chunk: + return chunk + else: + raise StopIteration() diff --git a/ceilometer/tests/tempest/service/images/v1/__init__.py b/ceilometer/tests/tempest/service/images/v1/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ceilometer/tests/tempest/service/images/v1/images_client.py b/ceilometer/tests/tempest/service/images/v1/images_client.py new file mode 100644 index 0000000000..e9ca637dc0 --- /dev/null +++ b/ceilometer/tests/tempest/service/images/v1/images_client.py @@ -0,0 +1,257 @@ +# Copyright 2013 IBM Corp. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import copy +import errno +import os + +from oslo_log import log as logging +from oslo_serialization import jsonutils as json +import six +from six.moves.urllib import parse as urllib +from tempest.lib.common import rest_client +from tempest.lib import exceptions as lib_exc + +from ceilometer.tests.tempest.service.images import glance_http + +LOG = logging.getLogger(__name__) + + +class ImagesClient(rest_client.RestClient): + + def __init__(self, auth_provider, catalog_type, region, **kwargs): + super(ImagesClient, self).__init__( + auth_provider, catalog_type, region, **kwargs) + self._http = None + self.dscv = kwargs.get("disable_ssl_certificate_validation") + self.ca_certs = kwargs.get("ca_certs") + + def _image_meta_from_headers(self, headers): + meta = {'properties': {}} + for key, value in six.iteritems(headers): + if key.startswith('x-image-meta-property-'): + _key = key[22:] + meta['properties'][_key] = value + elif key.startswith('x-image-meta-'): + _key = key[13:] + meta[_key] = value + + for key in ['is_public', 'protected', 'deleted']: + if key in meta: + meta[key] = meta[key].strip().lower() in ('t', 'true', 'yes', + '1') + for key in ['size', 'min_ram', 'min_disk']: + if key in meta: + try: + meta[key] = int(meta[key]) + except ValueError: + pass + return meta + + def _image_meta_to_headers(self, fields): + headers = {} + fields_copy = copy.deepcopy(fields) + copy_from = fields_copy.pop('copy_from', None) + if copy_from is not None: + headers['x-glance-api-copy-from'] = copy_from + for key, value in six.iteritems(fields_copy.pop('properties', {})): + headers['x-image-meta-property-%s' % key] = str(value) + for key, value in six.iteritems(fields_copy.pop('api', {})): + headers['x-glance-api-property-%s' % key] = str(value) + for key, value in six.iteritems(fields_copy): + headers['x-image-meta-%s' % key] = str(value) + return headers + + def _get_file_size(self, obj): + """Analyze file-like object and attempt to determine its size. + + :param obj: file-like object, typically redirected from stdin. + :retval The file's size or None if it cannot be determined. + """ + # For large images, we need to supply the size of the + # image file. See LP Bugs #827660 and #845788. + if hasattr(obj, 'seek') and hasattr(obj, 'tell'): + try: + obj.seek(0, os.SEEK_END) + obj_size = obj.tell() + obj.seek(0) + return obj_size + except IOError as e: + if e.errno == errno.ESPIPE: + # Illegal seek. This means the user is trying + # to pipe image data to the client, e.g. + # echo testdata | bin/glance add blah..., or + # that stdin is empty, or that a file-like + # object which doesn't support 'seek/tell' has + # been supplied. + return None + else: + raise + else: + # Cannot determine size of input image + return None + + def _get_http(self): + return glance_http.HTTPClient(auth_provider=self.auth_provider, + filters=self.filters, + insecure=self.dscv, + ca_certs=self.ca_certs) + + def _create_with_data(self, headers, data): + resp, body_iter = self.http.raw_request('POST', '/v1/images', + headers=headers, body=data) + self._error_checker('POST', '/v1/images', headers, data, resp, + body_iter) + body = json.loads(''.join([c for c in body_iter])) + return rest_client.ResponseBody(resp, body) + + def _update_with_data(self, image_id, headers, data): + url = '/v1/images/%s' % image_id + resp, body_iter = self.http.raw_request('PUT', url, headers=headers, + body=data) + self._error_checker('PUT', url, headers, data, + resp, body_iter) + body = json.loads(''.join([c for c in body_iter])) + return rest_client.ResponseBody(resp, body) + + @property + def http(self): + if self._http is None: + self._http = self._get_http() + return self._http + + def create_image(self, **kwargs): + headers = {} + data = kwargs.pop('data', None) + headers.update(self._image_meta_to_headers(kwargs)) + + if data is not None: + return self._create_with_data(headers, data) + + resp, body = self.post('v1/images', None, headers) + self.expected_success(201, resp.status) + body = json.loads(body) + return rest_client.ResponseBody(resp, body) + + def update_image(self, image_id, **kwargs): + headers = {} + data = kwargs.pop('data', None) + headers.update(self._image_meta_to_headers(kwargs)) + + if data is not None: + return self._update_with_data(image_id, headers, data) + + url = 'v1/images/%s' % image_id + resp, body = self.put(url, None, headers) + self.expected_success(200, resp.status) + body = json.loads(body) + return rest_client.ResponseBody(resp, body) + + def delete_image(self, image_id): + url = 'v1/images/%s' % image_id + resp, body = self.delete(url) + self.expected_success(200, resp.status) + return rest_client.ResponseBody(resp, body) + + def list_images(self, detail=False, **kwargs): + """Return a list of all images filtered by input parameters. + + Available params: see http://developer.openstack.org/ + api-ref-image-v1.html#listImage-v1 + + Most parameters except the following are passed to the API without + any changes. + :param changes_since: The name is changed to changes-since + """ + url = 'v1/images' + + if detail: + url += '/detail' + + properties = kwargs.pop('properties', {}) + for key, value in six.iteritems(properties): + kwargs['property-%s' % key] = value + + if kwargs.get('changes_since'): + kwargs['changes-since'] = kwargs.pop('changes_since') + + if len(kwargs) > 0: + url += '?%s' % urllib.urlencode(kwargs) + + resp, body = self.get(url) + self.expected_success(200, resp.status) + body = json.loads(body) + return rest_client.ResponseBody(resp, body) + + def check_image(self, image_id): + """Check image metadata.""" + url = 'v1/images/%s' % image_id + resp, __ = self.head(url) + self.expected_success(200, resp.status) + body = self._image_meta_from_headers(resp) + return rest_client.ResponseBody(resp, body) + + def show_image(self, image_id): + """Get image details plus the image itself.""" + url = 'v1/images/%s' % image_id + resp, body = self.get(url) + self.expected_success(200, resp.status) + return rest_client.ResponseBodyData(resp, body) + + def is_resource_deleted(self, id): + try: + if self.check_image(id)['status'] == 'deleted': + return True + except lib_exc.NotFound: + return True + return False + + @property + def resource_type(self): + """Returns the primary type of resource this client works with.""" + return 'image_meta' + + def list_image_members(self, image_id): + url = 'v1/images/%s/members' % image_id + resp, body = self.get(url) + self.expected_success(200, resp.status) + body = json.loads(body) + return rest_client.ResponseBody(resp, body) + + def list_shared_images(self, tenant_id): + """List shared images with the specified tenant""" + url = 'v1/shared-images/%s' % tenant_id + resp, body = self.get(url) + self.expected_success(200, resp.status) + body = json.loads(body) + return rest_client.ResponseBody(resp, body) + + def add_member(self, member_id, image_id, **kwargs): + """Add a member to an image. + + Available params: see http://developer.openstack.org/ + api-ref-image-v1.html#addMember-v1 + """ + url = 'v1/images/%s/members/%s' % (image_id, member_id) + body = json.dumps({'member': kwargs}) + resp, __ = self.put(url, body) + self.expected_success(204, resp.status) + return rest_client.ResponseBody(resp) + + def delete_member(self, member_id, image_id): + url = 'v1/images/%s/members/%s' % (image_id, member_id) + resp, __ = self.delete(url) + self.expected_success(204, resp.status) + return rest_client.ResponseBody(resp) diff --git a/ceilometer/tests/tempest/service/images/v2/__init__.py b/ceilometer/tests/tempest/service/images/v2/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ceilometer/tests/tempest/service/images/v2/images_client.py b/ceilometer/tests/tempest/service/images/v2/images_client.py new file mode 100644 index 0000000000..d0cbadc647 --- /dev/null +++ b/ceilometer/tests/tempest/service/images/v2/images_client.py @@ -0,0 +1,245 @@ +# Copyright 2013 IBM Corp. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from oslo_serialization import jsonutils as json +from six.moves.urllib import parse as urllib + +from tempest.lib.common import rest_client +from tempest.lib import exceptions as lib_exc + +from ceilometer.tests.tempest.service.images import glance_http + + +class ImagesClient(rest_client.RestClient): + + def __init__(self, auth_provider, catalog_type, region, **kwargs): + super(ImagesClient, self).__init__( + auth_provider, catalog_type, region, **kwargs) + self._http = None + self.dscv = kwargs.get("disable_ssl_certificate_validation") + self.ca_certs = kwargs.get("ca_certs") + + def _get_http(self): + return glance_http.HTTPClient(auth_provider=self.auth_provider, + filters=self.filters, + insecure=self.dscv, + ca_certs=self.ca_certs) + + @property + def http(self): + if self._http is None: + self._http = self._get_http() + return self._http + + def update_image(self, image_id, patch): + """Update an image. + + Available params: see http://developer.openstack.org/ + api-ref-image-v2.html#updateImage-v2 + """ + data = json.dumps(patch) + headers = {"Content-Type": "application/openstack-images-v2.0" + "-json-patch"} + resp, body = self.patch('v2/images/%s' % image_id, data, headers) + self.expected_success(200, resp.status) + body = json.loads(body) + return rest_client.ResponseBody(resp, body) + + def create_image(self, **kwargs): + """Create an image. + + Available params: see http://developer.openstack.org/ + api-ref-image-v2.html#createImage-v2 + """ + data = json.dumps(kwargs) + resp, body = self.post('v2/images', data) + self.expected_success(201, resp.status) + body = json.loads(body) + return rest_client.ResponseBody(resp, body) + + def deactivate_image(self, image_id): + url = 'v2/images/%s/actions/deactivate' % image_id + resp, body = self.post(url, None) + self.expected_success(204, resp.status) + return rest_client.ResponseBody(resp, body) + + def reactivate_image(self, image_id): + url = 'v2/images/%s/actions/reactivate' % image_id + resp, body = self.post(url, None) + self.expected_success(204, resp.status) + return rest_client.ResponseBody(resp, body) + + def delete_image(self, image_id): + url = 'v2/images/%s' % image_id + resp, _ = self.delete(url) + self.expected_success(204, resp.status) + return rest_client.ResponseBody(resp) + + def list_images(self, params=None): + url = 'v2/images' + + if params: + url += '?%s' % urllib.urlencode(params) + + resp, body = self.get(url) + self.expected_success(200, resp.status) + body = json.loads(body) + return rest_client.ResponseBody(resp, body) + + def show_image(self, image_id): + url = 'v2/images/%s' % image_id + resp, body = self.get(url) + self.expected_success(200, resp.status) + body = json.loads(body) + return rest_client.ResponseBody(resp, body) + + def is_resource_deleted(self, id): + try: + self.show_image(id) + except lib_exc.NotFound: + return True + return False + + @property + def resource_type(self): + """Returns the primary type of resource this client works with.""" + return 'image' + + def store_image_file(self, image_id, data): + url = 'v2/images/%s/file' % image_id + headers = {'Content-Type': 'application/octet-stream'} + resp, body = self.http.raw_request('PUT', url, headers=headers, + body=data) + self.expected_success(204, resp.status) + return rest_client.ResponseBody(resp, body) + + def show_image_file(self, image_id): + url = 'v2/images/%s/file' % image_id + resp, body = self.get(url) + self.expected_success(200, resp.status) + return rest_client.ResponseBodyData(resp, body) + + def add_image_tag(self, image_id, tag): + url = 'v2/images/%s/tags/%s' % (image_id, tag) + resp, body = self.put(url, body=None) + self.expected_success(204, resp.status) + return rest_client.ResponseBody(resp, body) + + def delete_image_tag(self, image_id, tag): + url = 'v2/images/%s/tags/%s' % (image_id, tag) + resp, _ = self.delete(url) + self.expected_success(204, resp.status) + return rest_client.ResponseBody(resp) + + def list_image_members(self, image_id): + url = 'v2/images/%s/members' % image_id + resp, body = self.get(url) + self.expected_success(200, resp.status) + body = json.loads(body) + return rest_client.ResponseBody(resp, body) + + def create_image_member(self, image_id, **kwargs): + """Create an image member. + + Available params: see http://developer.openstack.org/ + api-ref-image-v2.html#createImageMember-v2 + """ + url = 'v2/images/%s/members' % image_id + data = json.dumps(kwargs) + resp, body = self.post(url, data) + self.expected_success(200, resp.status) + body = json.loads(body) + return rest_client.ResponseBody(resp, body) + + def update_image_member(self, image_id, member_id, **kwargs): + """Update an image member. + + Available params: see http://developer.openstack.org/ + api-ref-image-v2.html#updateImageMember-v2 + """ + url = 'v2/images/%s/members/%s' % (image_id, member_id) + data = json.dumps(kwargs) + resp, body = self.put(url, data) + self.expected_success(200, resp.status) + body = json.loads(body) + return rest_client.ResponseBody(resp, body) + + def show_image_member(self, image_id, member_id): + url = 'v2/images/%s/members/%s' % (image_id, member_id) + resp, body = self.get(url) + self.expected_success(200, resp.status) + return rest_client.ResponseBody(resp, json.loads(body)) + + def delete_image_member(self, image_id, member_id): + url = 'v2/images/%s/members/%s' % (image_id, member_id) + resp, _ = self.delete(url) + self.expected_success(204, resp.status) + return rest_client.ResponseBody(resp) + + def show_schema(self, schema): + url = 'v2/schemas/%s' % schema + resp, body = self.get(url) + self.expected_success(200, resp.status) + body = json.loads(body) + return rest_client.ResponseBody(resp, body) + + def list_resource_types(self): + url = '/v2/metadefs/resource_types' + resp, body = self.get(url) + self.expected_success(200, resp.status) + body = json.loads(body) + return rest_client.ResponseBody(resp, body) + + def create_namespace(self, **kwargs): + """Create a namespace. + + Available params: see http://developer.openstack.org/ + api-ref-image-v2.html#createNamespace-v2 + """ + data = json.dumps(kwargs) + resp, body = self.post('/v2/metadefs/namespaces', data) + self.expected_success(201, resp.status) + body = json.loads(body) + return rest_client.ResponseBody(resp, body) + + def show_namespace(self, namespace): + url = '/v2/metadefs/namespaces/%s' % namespace + resp, body = self.get(url) + self.expected_success(200, resp.status) + body = json.loads(body) + return rest_client.ResponseBody(resp, body) + + def update_namespace(self, namespace, **kwargs): + """Update a namespace. + + Available params: see http://developer.openstack.org/ + api-ref-image-v2.html#updateNamespace-v2 + """ + # NOTE: On Glance API, we need to pass namespace on both URI + # and a request body. + params = {'namespace': namespace} + params.update(kwargs) + data = json.dumps(params) + url = '/v2/metadefs/namespaces/%s' % namespace + resp, body = self.put(url, body=data) + self.expected_success(200, resp.status) + body = json.loads(body) + return rest_client.ResponseBody(resp, body) + + def delete_namespace(self, namespace): + url = '/v2/metadefs/namespaces/%s' % namespace + resp, _ = self.delete(url) + self.expected_success(204, resp.status) + return rest_client.ResponseBody(resp) From f7e27a2cf6a8ad084f36575a05a856cdbd9e528c Mon Sep 17 00:00:00 2001 From: Julien Danjou Date: Wed, 1 Jun 2016 10:23:51 +0200 Subject: [PATCH 14/14] dispacher/gnocchi: measures sent fix logging Currently, the logging is only done when measures are posted on retry. If it works on the first call, no logging is done. This can be confusing for users that try to debug the Gnocchi dispatcher. Change-Id: Ife7879fe0c153cec1a79c7d57529fda82b7b7c16 --- ceilometer/dispatcher/gnocchi.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ceilometer/dispatcher/gnocchi.py b/ceilometer/dispatcher/gnocchi.py index dd42848cc4..0b5b139e82 100644 --- a/ceilometer/dispatcher/gnocchi.py +++ b/ceilometer/dispatcher/gnocchi.py @@ -363,8 +363,8 @@ class GnocchiDispatcher(dispatcher.MeterDispatcherBase): if retry: self._gnocchi.metric.add_measures(metric_name, measures, resource_id) - LOG.debug("Measure posted on metric %s of resource %s", - metric_name, resource_id) + LOG.debug("Measure posted on metric %s of resource %s", + metric_name, resource_id) if resource_extra: self._if_not_cached("update", resource_type, resource,