Compare commits

...

291 Commits

Author SHA1 Message Date
Zexi Li
7d9a3c04b1 Merge pull request #8986 from swordqiu/automated-cherry-pick-of-#8968-upstream-release-3.4
Automated cherry pick of #8968: fix(region,esxiagent): allow host behind a nat
2020-11-26 12:11:25 +08:00
Zexi Li
1a2204d146 Merge pull request #8923 from zhaoxiangchun/automated-cherry-pick-of-#8920-upstream-release-3.4
Automated cherry pick of #8920: fix(monitor): modify notify alertInfo and alertOk detach resource
2020-11-26 11:45:32 +08:00
yunion-ci-robot
ed6c42ae37 Merge pull request #8994 from zexi/automated-cherry-pick-of-#8991-upstream-release-3.4
Automated cherry pick of #8991: fix(scheduler): clean expire cache before schedule
2020-11-26 11:43:31 +08:00
Zexi Li
372c9a393f fix(region): wire get vpc releated hosts is empty 2020-11-26 11:03:52 +08:00
Zexi Li
37f648bfb8 fix(region): network clean schedule cache after real deleted 2020-11-26 11:03:52 +08:00
Zexi Li
1818d4853a fix(scheduler): clean expire cache before schedule 2020-11-26 11:03:52 +08:00
zhaoxiangchun
ff5396b909 fix(monitor): modify notify alertInfo and alertOk detach resource
1.修复报警信息中>等被转义的问题
2.针对:host_raid.adapter和smart_device.exit_status
  只能出现alerting和nodata
两种报警状态。在queryCondition的查询逻辑下,nodata情况也进行detach操作
3.修复报警记录中报警策略翻译异常的问题
2020-11-26 09:46:34 +08:00
Zexi Li
b2854aff23 Merge pull request #8956 from tb365/automated-cherry-pick-of-#8955-upstream-release-3.4
Automated cherry pick of #8955: fix(region): allow reset huawei system disk
2020-11-25 22:01:28 +08:00
Zexi Li
da30ae5efd Merge pull request #8964 from ioito/automated-cherry-pick-of-#8961-upstream-release-3.4
Automated cherry pick of #8961: fix(region): valid qcloud hssd for system disk
2020-11-25 21:59:40 +08:00
Zexi Li
17face8f52 Merge pull request #8981 from zhaoxiangchun/automated-cherry-pick-of-#8977-upstream-release-3.4
Automated cherry pick of #8977: fix(monitor): modify monitor serviceType in StartService()
2020-11-25 21:57:11 +08:00
Zexi Li
9a8277ff20 Merge pull request #8990 from rainzm/automated-cherry-pick-of-#8987-upstream-release-3.4
Automated cherry pick of #8987: fix(region): allow delete storagecachedimage with 'cache_failed' status
2020-11-25 21:55:55 +08:00
rainzm
61eaea8099 fix(region): allow delete storagecachedimage with 'cache_failed' status
Having status 'cache_failed' means this storagecachedimage does not actually exist.
2020-11-25 20:48:02 +08:00
Qiu Jian
6f0d6cbeac fix(region,esxiagent): allow host behind a nat
check host by ip may fail if host is behind a nat. ignore this case.
2020-11-25 20:34:42 +08:00
zhaoxiangchun
09ed698ae8 fix(monitor): modify monitor serviceType in StartService()
1.修改monitor服务在service代码中注册的serviceType:
   alerter ===> monitor
2020-11-25 20:31:19 +08:00
TangBin
7bf1bef04a fix(region): update translations 2020-11-25 18:17:40 +08:00
TangBin
024a17de83 fix(region): allow reset huawei system disk 2020-11-25 18:11:26 +08:00
Qu Xuan
0f5a8b6407 fix(region): valid qcloud hssd for system disk 2020-11-25 11:53:04 +08:00
Zexi Li
cd4ce681b0 Merge pull request #8954 from ioito/automated-cherry-pick-of-#8895-upstream-release-3.4
Automated cherry pick of #8895: fix(region): 避免OneCloud密码校验通过,公有云厂商密码校验不通过
2020-11-25 10:06:19 +08:00
Qu Xuan
fc16c37eab fix(region): 避免OneCloud密码校验通过,公有云厂商密码校验不通过 2020-11-25 09:56:37 +08:00
Zexi Li
3dfd086a27 Merge pull request #8950 from yousong/automated-cherry-pick-of-#8947-upstream-release-3.4
Automated cherry pick of #8947: fix(region): change_ipaddr: retain eip_id on detach and attach
2020-11-25 09:28:23 +08:00
yunion-ci-robot
8e2cd5112d Merge pull request #8945 from yousong/automated-cherry-pick-of-#8942-upstream-release-3.4
Automated cherry pick of #8942: feat(cloudcommon): db: jointbase: add list:"user" for RowId
2020-11-25 09:17:18 +08:00
Yousong Zhou
a5d82922bd fix(region): change_ipaddr: retain eip_id on detach and attach 2020-11-24 21:59:33 +08:00
Yousong Zhou
9d19bf34b0 fix(vpcagent): models: guestnetworks: accomodate change_ipaddr
change_ipaddr does detach, then attach of network.  It's not solely an
update of ipaddr, but a combination of deletion then creation.
2020-11-24 21:56:05 +08:00
Yousong Zhou
e4bf0fa8dc feat(cloudcommon): db: jointbase: add list:"user" for RowId 2020-11-24 21:56:05 +08:00
Zexi Li
6bd82d216d Merge pull request #8932 from tb365/bugfix/tb-elasticcache-empty-error-fix
fix(region): elastic cache task fail message fix
2020-11-24 21:31:09 +08:00
Zexi Li
60138f6401 Merge pull request #8927 from zhaoxiangchun/automated-cherry-pick-of-#8926-upstream-release-3.4
Automated cherry pick of #8926: fix(monitor): modify suggestrule  process influxdb data
2020-11-24 21:29:36 +08:00
yunion-ci-robot
a43f747bdc Merge pull request #8936 from ioito/automated-cherry-pick-of-#8933-upstream-release-3.4
Automated cherry pick of #8933: fix(region): avoid public ip bandwidth is zero
2020-11-24 20:25:27 +08:00
Qu Xuan
2560198943 fix(region): avoid public ip bandwidth is zero 2020-11-24 18:11:38 +08:00
zhaoxiangchun
6e0d4cb35c fix(monitor): modify suggestrule process influxdb data
1. 调整与监控相关的时间范围的判断逻辑:不再要求时间范围内必须都有数据
2020-11-24 17:48:05 +08:00
TangBin
71535f670e fix(region): elastic cache task fail message fix
#6399
2020-11-24 17:07:30 +08:00
Zexi Li
5e47566b42 Merge pull request #8900 from wanyaoqi/automated-cherry-pick-of-#8889-upstream-release-3.4
Automated cherry pick of #8889: fix(host): wait put host offline success
2020-11-23 13:04:31 +08:00
wanyaoqi
c325d8355c fix(host): wait put host offline success
Unregister host wait for host offline success,
in case region is in upgrading.

cherrypick: release/3.4
2020-11-22 15:30:56 +08:00
Zexi Li
206dc2a62d Merge pull request #8894 from yousong/automated-cherry-pick-of-#8892-upstream-release-3.4
Automated cherry pick of #8892: fix(locales): fix translation text
2020-11-22 11:00:07 +08:00
yunion-ci-robot
55a7de9ba6 Merge pull request #8867 from swordqiu/automated-cherry-pick-of-#8865-upstream-release-3.4
Automated cherry pick of #8865: fix: allow disk attach to multiple guests
2020-11-21 19:25:00 +08:00
Yousong Zhou
3b2938380a fix(region): elasticcache_instances: fix error fmt 2020-11-21 17:36:36 +08:00
Yousong Zhou
3774549979 fix(locales): fix translation text 2020-11-21 17:35:45 +08:00
Zexi Li
9c2cc664f6 Merge pull request #8883 from ioito/hotfix/qx-rds-network-params
fix(region): compatible rds network params
2020-11-20 12:03:19 +08:00
Qu Xuan
42582043ee fix(region): compatible rds network params 2020-11-20 11:44:10 +08:00
Zexi Li
690aef8f4e Merge pull request #8875 from ioito/automated-cherry-pick-of-#8873-upstream-release-3.4
Automated cherry pick of #8873: optimized: server delete log and wait time
2020-11-20 10:04:32 +08:00
Zexi Li
eb7173085e Merge pull request #8880 from ioito/automated-cherry-pick-of-#8876-upstream-release-3.4
Automated cherry pick of #8876: feat: rds recovery new instance from backup supported
2020-11-19 20:53:14 +08:00
Qu Xuan
b6917c5604 feat: rds recovery new instance from backup supported 2020-11-19 20:39:56 +08:00
Qu Xuan
47349e71b9 optimized: server delete log and wait time 2020-11-19 16:27:18 +08:00
Qiu Jian
3d2b24a351 fix: allow disk attach to multiple guests 2020-11-19 13:27:30 +08:00
Zexi Li
b9565f288a Merge pull request #8862 from swordqiu/automated-cherry-pick-of-#8860-upstream-release-3.4
Automated cherry pick of #8860: fix: add host.memoty.total and host.cpu.total usage stats
2020-11-19 11:03:21 +08:00
Qiu Jian
6b0ae74acb fix: add host.memoty.total and host.cpu.total usage stats 2020-11-19 01:26:37 +08:00
Zexi Li
438a0cb0b7 Merge pull request #8846 from zhaoxiangchun/automated-cherry-pick-of-#8844-upstream-release-3.4
Automated cherry pick of #8844: detach AlertResource on alertDisable
2020-11-18 21:16:36 +08:00
Zexi Li
3fb97c99b6 Merge pull request #8852 from swordqiu/automated-cherry-pick-of-#8850-upstream-release-3.4
Automated cherry pick of #8850: fix: add host-joint resources into domain level resources
2020-11-18 21:15:07 +08:00
yunion-ci-robot
ad8459053f Merge pull request #8855 from zhasm/automated-cherry-pick-of-#8849-upstream-release-3.4
Automated cherry pick of #8849: docker 交叉编译规则更新
2020-11-18 16:36:13 +08:00
Zhang Dongliang
491a9ece55 docker 交叉编译规则更新 2020-11-18 16:14:31 +08:00
Qiu Jian
ba2a188f0d fix: add host-joint resources into domain level resources 2020-11-18 15:26:39 +08:00
zhaoxiangchun
ea793d9902 detach AlertResource on alertDisable
1. 报警规则禁用时,detach 关联的报警资源

影响范围:报警规则的禁用;logger日志服务i18n的日志展示
2020-11-18 12:21:25 +08:00
Zexi Li
4b4964e58e Merge pull request #8840 from rainzm/automated-cherry-pick-of-#8827-upstream-release-3.4
Automated cherry pick of #8827: fix(notify): be compatible with keystone's UsersV3.GetById
2020-11-17 17:52:11 +08:00
rainzm
4a06b38da8 fix: add err handler for notifyRobot 2020-11-17 17:13:15 +08:00
rainzm
96400124ba feat(notify): enable watching user in keystone 2020-11-17 17:13:15 +08:00
rainzm
aee0299d71 fix(notify): be compatible with keystone's UsersV3.GetById
Fill UsersV3.GetById with user's name, it will return user's info.
2020-11-17 17:13:15 +08:00
Zexi Li
cbea17b4c4 Merge pull request #8835 from ioito/automated-cherry-pick-of-#8823-upstream-release-3.4
Automated cherry pick of #8823: optimized: aliyun create rds backup
2020-11-17 14:52:30 +08:00
Zexi Li
4acb237f70 Merge pull request #8833 from zhaoxiangchun/automated-cherry-pick-of-#8816-upstream-release-3.4
Automated cherry pick of #8816: modify  alertResource ws info
2020-11-17 14:51:29 +08:00
Qu Xuan
3a8e998718 optimized: aliyun create rds backup 2020-11-17 14:30:42 +08:00
zhaoxiangchun
bef9af4c3b modify alertResource ws info
ignore_alert:ture 前端不再进行弹窗提示
2020-11-17 14:23:28 +08:00
Zexi Li
3e17ee7519 Merge pull request #8805 from wanyaoqi/automated-cherry-pick-of-#8803-upstream-release-3.4
Automated cherry pick of #8803: host: restart etcd session on keepalive failed
2020-11-17 14:20:24 +08:00
yunion-ci-robot
d3aba7285a Merge pull request #8819 from ioito/automated-cherry-pick-of-#8817-upstream-release-3.4
Automated cherry pick of #8817: fix: add error cause
2020-11-16 21:42:06 +08:00
Qu Xuan
43f4f5f946 fix: add error cause 2020-11-16 14:57:37 +08:00
Zexi Li
4d3c7f3059 Merge pull request #8785 from tb365/automated-cherry-pick-of-#8783-upstream-release-3.4
Automated cherry pick of #8783: aliyun finance cloud region add suffix
2020-11-15 08:00:55 +08:00
Zexi Li
fd26fc1947 Merge pull request #8808 from zhaoxiangchun/automated-cherry-pick-of-#8806-upstream-release-3.4
Automated cherry pick of #8806: commonalert bugfix:
2020-11-15 07:55:32 +08:00
Zexi Li
b74f61fe1d Merge pull request #8811 from swordqiu/automated-cherry-pick-of-#8809-upstream-release-3.4
Automated cherry pick of #8809: fix: baremetal usage should exclude converted hypervisor
2020-11-15 07:52:46 +08:00
Qiu Jian
dc19e7b035 fix: baremetal usage should exclude converted hypervisor 2020-11-15 01:42:32 +08:00
zhaoxiangchun
37272588fa commonalert bugfix:
1.修改消息模版内容:对matches信息进行聚合只返回对应的name信息。解决body消息超过限制
2.报警资源:每次以策略匹配的最新matches为标准。进行updateOrCreate 和
  delete操作。

影响范围:消息模版、报警资源数量
2020-11-14 18:44:14 +08:00
wanyaoqi
029530ac34 host: restart etcd session on keepalive failed 2020-11-14 15:27:10 +08:00
yunion-ci-robot
c047d69a53 Merge pull request #8802 from swordqiu/automated-cherry-pick-of-#8800-upstream-release-3.4
Automated cherry pick of #8800: fix: host memory usage status not correct
2020-11-14 11:22:04 +08:00
yunion-ci-robot
6f76c5d670 Merge pull request #8798 from yousong/automated-cherry-pick-of-#8796-upstream-release-3.4
Automated cherry pick of #8796: vendor: update yunion.io/x/jsonutils
2020-11-14 00:11:06 +08:00
Qiu Jian
71ddac232d fix: host memory usage status not correct 2020-11-13 23:59:51 +08:00
Yousong Zhou
ca9859f126 vendor: update yunion.io/x/jsonutils
See yunionio/onecloud#8357
2020-11-13 18:46:27 +08:00
Zexi Li
7db6ad9a01 Merge pull request #8788 from swordqiu/automated-cherry-pick-of-#8786-upstream-release-3.4
Automated cherry pick of #8786: fix: keystone init empty catalogy cause panic
2020-11-13 15:24:09 +08:00
Qiu Jian
b545066e05 fix: keystone init empty catalogy cause panic 2020-11-13 14:56:24 +08:00
TangBin
befef016dc aliyun finance cloud zone add suffix 2020-11-13 14:44:30 +08:00
TangBin
c32ad0ac5b aliyun finance cloud region add suffix 2020-11-13 14:44:29 +08:00
Zexi Li
ecc75aa231 Merge pull request #8773 from swordqiu/automated-cherry-pick-of-#8771-upstream-release-3.4
Automated cherry pick of #8771: feature: allow join project across domain
2020-11-13 10:39:50 +08:00
Zexi Li
202e0bf266 Merge pull request #8778 from zhaoxiangchun/automated-cherry-pick-of-#8776-upstream-release-3.4
Automated cherry pick of #8776: suggestalet bugfix
2020-11-13 10:39:14 +08:00
zhaoxiangchun
c4d4700d26 suggestalet bugfix
1.安全组规则的in规则为全开放的主机 筛选逻辑修改
2.修复无法正确过滤用户所属资源的bug
2020-11-12 21:32:15 +08:00
Qiu Jian
1fce2ec30c feature: allow join project across domain 2020-11-12 20:41:27 +08:00
Zexi Li
dfe7661c61 Merge pull request #8762 from ioito/automated-cherry-pick-of-#8760-upstream-release-3.4
Automated cherry pick of #8760: fix: avoid panic
2020-11-12 19:31:31 +08:00
Zexi Li
5a28b3c13e Merge pull request #8766 from ioito/automated-cherry-pick-of-#8764-upstream-release-3.4
Automated cherry pick of #8764: fix: support resize qcloud hssd disk
2020-11-12 18:51:40 +08:00
Qu Xuan
27c8861b64 fix: support resize qcloud hssd disk 2020-11-12 16:48:17 +08:00
Qu Xuan
e9459b4a7d fix: avoid panic 2020-11-12 16:20:16 +08:00
yunion-ci-robot
5861a18051 Merge pull request #8755 from rainzm/automated-cherry-pick-of-#8753-upstream-release-3.4
Automated cherry pick of #8753: fix(region): prevent infinite recursion
2020-11-12 11:54:03 +08:00
rainzm
0bbe2e7590 fix(region): prevent infinite recursion
When weekDays is [1,2,3,4,5,6,7] and timePoints is [0], It will recurse infinitely.
2020-11-12 11:39:58 +08:00
Zexi Li
b93d695fe9 Merge pull request #8751 from ioito/automated-cherry-pick-of-#8749-upstream-release-3.4
Automated cherry pick of #8749: fix: renew rds
2020-11-12 00:49:52 +08:00
Qu Xuan
39fe8b2133 fix: renew rds 2020-11-11 20:20:25 +08:00
Zexi Li
c357d61add Merge pull request #8725 from tb365/automated-cherry-pick-of-#8723-upstream-release-3.4
Automated cherry pick of #8723: batch user create bugifx
2020-11-11 11:57:08 +08:00
Zexi Li
749ca9dc63 Merge pull request #8745 from wanyaoqi/automated-cherry-pick-of-#8722-upstream-release-3.4
Automated cherry pick of #8722: add success note on guest start and stop
2020-11-11 11:55:48 +08:00
Zexi Li
5aa0bbb091 Merge pull request #8721 from tb365/automated-cherry-pick-of-#8719-upstream-release-3.4
Automated cherry pick of #8719: huawei create disk bugfix
2020-11-11 11:54:17 +08:00
wanyaoqi
7d35397d50 host: specifie bash for start guest 2020-11-11 11:05:30 +08:00
wanyaoqi
30776fc707 usage: host show isolated dev reserved memory 2020-11-11 11:05:30 +08:00
wanyaoqi
ea70090f6b add success note on guest start and stop 2020-11-11 11:05:30 +08:00
TangBin
e9a4a6380e batch user create bugifx 2020-11-10 16:49:49 +08:00
TangBin
642b137332 huawei create disk bugfix 2020-11-10 16:18:05 +08:00
Zexi Li
ce60116ba3 Merge pull request #8717 from ioito/automated-cherry-pick-of-#8715-upstream-release-3.4
Automated cherry pick of #8715: fix: aws secgroup out rule is deny any
2020-11-10 12:54:34 +08:00
Qu Xuan
1ee8fd05b3 fix: aws secgroup out rule is deny any 2020-11-10 11:04:58 +08:00
Zexi Li
e1d1ef0dd8 Merge pull request #8695 from lvyangyang/automated-cherry-pick-of-#8694-upstream-release-3.4
Automated cherry pick of #8694: fix:修复dns record name校验的问题
2020-11-07 18:42:59 +08:00
lvyangyang
e108d17556 fix:修复dns record name校验的问题 2020-11-06 19:59:52 +08:00
yunion-ci-robot
fe6cb8a9cf Merge pull request #8691 from swordqiu/automated-cherry-pick-of-#8689-upstream-release-3.4
Automated cherry pick of #8689: fix: change owner should update quota usages
2020-11-06 15:11:19 +08:00
yunion-ci-robot
9a9f77c9d9 Merge pull request #8688 from rainzm/automated-cherry-pick-of-#8686-upstream-release-3.4
Automated cherry pick of #8686: feat(region): add option NoCheckOsTypeForCachedImage
2020-11-06 15:07:17 +08:00
yunion-ci-robot
35ac1f9fdd Merge pull request #8685 from ioito/automated-cherry-pick-of-#8683-upstream-release-3.4
Automated cherry pick of #8683: fix: aliyun eip api
2020-11-06 15:04:20 +08:00
Qiu Jian
6927652a65 fix: change owner should update quota usages 2020-11-06 14:48:29 +08:00
Zexi Li
c4afca7187 Merge pull request #8682 from ioito/automated-cherry-pick-of-#8680-upstream-release-3.4
Automated cherry pick of #8680: fix: 支持多内存过滤套餐
2020-11-06 13:50:07 +08:00
Zexi Li
a49d0b280c Merge pull request #8679 from swordqiu/automated-cherry-pick-of-#8677-upstream-release-3.4
Automated cherry pick of #8677: fix: missing column error when order by extra fields
2020-11-06 13:49:42 +08:00
Zexi Li
f797f062f8 Merge pull request #8674 from zexi/automated-cherry-pick-of-#8672-upstream-release-3.4
Automated cherry pick of #8672: scheduler: ignore non running guests only exclude ready status
2020-11-06 13:48:23 +08:00
rainzm
6f60f1a48b fix(esxi): don't specify spec.Identity when osName is empty 2020-11-06 12:58:51 +08:00
rainzm
c3b8e7bbd4 fix(esxi): add device after cloning vm 2020-11-06 12:57:19 +08:00
rainzm
edc651a308 refactor(region): faster GetIImageById 2020-11-06 12:01:41 +08:00
rainzm
76b1796c7e refactor(region): faster sync CapacityUsed for Storage
1. replace cronjob SyncCapacityUsedForStorage with
SyncCapacityUsedForEsxiStorage
2. do not sync capacityUsed for storage when deleting and creating vm
for now because of performance issues。
2020-11-06 12:01:41 +08:00
rainzm
b5201a352f feat(region): add option NoCheckOsTypeForCachedImage 2020-11-06 12:01:41 +08:00
Qu Xuan
fc4460fa39 fix: aliyun eip api 2020-11-06 11:10:32 +08:00
Qu Xuan
e975fc6713 fix: 支持多内存过滤套餐 2020-11-06 10:32:20 +08:00
Qiu Jian
c8ddd7653f fix: missing column error when order by extra fields 2020-11-05 23:52:32 +08:00
Zexi Li
827be9167e scheduler: ignore non running guests only exclude ready status 2020-11-05 18:23:51 +08:00
Zexi Li
f55022a26d Merge pull request #8666 from swordqiu/automated-cherry-pick-of-#8664-upstream-release-3.4
Automated cherry pick of #8664: update vendor for jsonutils
2020-11-05 13:10:35 +08:00
Qiu Jian
aae3da8c2b update vendor for jsonutils 2020-11-05 11:34:28 +08:00
yunion-ci-robot
e6828a1665 Merge pull request #8656 from lvyangyang/automated-cherry-pick-of-#8655-upstream-release-3.4
Automated cherry pick of #8655: fix:域名正则校验dnsrecord name,同步中文域名取punycode
2020-11-04 18:42:10 +08:00
lvyangyang
6bfff8b70d fix:域名正则校验dnsrecord name,同步中文域名取punycode 2020-11-04 17:38:27 +08:00
Zexi Li
a3753fc311 Merge pull request #8634 from tb365/automated-cherry-pick-of-#8633-upstream-release-3.4
Automated cherry pick of #8633: aws create bugfix
2020-11-04 11:19:57 +08:00
Zexi Li
2b7ba4df63 Merge pull request #8642 from rainzm/automated-cherry-pick-of-#8640-upstream-release-3.4
Automated cherry pick of #8640: fix(notify): customize the title of the verification email based on the copyright
2020-11-04 10:57:16 +08:00
Zexi Li
4fde5eab04 Merge pull request #8639 from ioito/automated-cherry-pick-of-#8636-upstream-release-3.4
Automated cherry pick of #8636: fix: add qcloud hssd
2020-11-03 20:41:32 +08:00
rainzm
58c5514a01 fix(notify): customize the title of the verification email based on the copyright 2020-11-03 20:26:52 +08:00
Qu Xuan
0c19c21efa fix: add qcloud hssd 2020-11-03 20:22:07 +08:00
TangBin
41dd48e8fa lbcert cache delete bugfix 2020-11-03 16:40:37 +08:00
TangBin
3ceb0e2dc1 aws create bugfix 2020-11-03 16:40:37 +08:00
Zexi Li
ab479aea26 Merge pull request #8623 from wanyaoqi/automated-cherry-pick-of-#8619-upstream-release-3.4
Automated cherry pick of #8619: fix stream disk on add disk from snapshot
2020-11-03 10:40:01 +08:00
wanyaoqi
82f5b9ccb0 fix stream disk on add disk from snapshot 2020-11-02 19:32:37 +08:00
Zexi Li
4d7b6ef36d Merge pull request #8615 from ioito/automated-cherry-pick-of-#8613-upstream-release-3.4
Automated cherry pick of #8613: optimized: rds zone sync
2020-11-02 19:12:44 +08:00
Qu Xuan
83d0a3ce0c optimized: rds zone sync 2020-11-02 16:52:08 +08:00
yunion-ci-robot
10b4ebfd01 Merge pull request #8606 from rainzm/automated-cherry-pick-of-#8603-upstream-release-3.4
Automated cherry pick of #8603: fix(region): compute NextSyncTime for snapshotpolicydisk
2020-11-02 01:43:45 +08:00
yunion-ci-robot
bc5f255bc7 Merge pull request #8610 from swordqiu/automated-cherry-pick-of-#8608-upstream-release-3.4
Automated cherry pick of #8608: fix: save service config changes may send invalid action log
2020-11-01 11:48:48 +08:00
Qiu Jian
c8138c291b fix: save service config changes may send invalid action log 2020-10-31 19:06:22 +08:00
Rain Zheng
f290aa5d58 fix(region): compute NextSyncTime for snapshotpolicydisk
1. 如果计算出来的 NextSyncTime 和 base 相等,可以将 base 加1一个小时递归处理。
2. 对于 retentionday 有效的快照策略,比如某一个 snaphsotpolicy
是每周一生效,并且打的快照自动保留 3 天,那么,就应该在每周一(打快照)
和每周四(释放快照)进行快照的同步。
2020-10-31 15:50:51 +08:00
yunion-ci-robot
a6f97fc759 Merge pull request #8595 from rainzm/automated-cherry-pick-of-#8593-upstream-release-3.4
Automated cherry pick of #8593: fix(region): prevent dirty data when syncing snapshot
2020-10-30 19:38:45 +08:00
yunion-ci-robot
dfeee78717 Merge pull request #8592 from ioito/automated-cherry-pick-of-#8590-upstream-release-3.4
Automated cherry pick of #8590: fix: secgroup cache tenant_id
2020-10-30 19:34:56 +08:00
rainzm
7460ea1461 fix(region): clear dirty data of snapshotpolicydisks when start up 2020-10-30 15:24:56 +08:00
rainzm
250ad41c7b fix(region): detach all snapshotpolicy when realdeleting disk 2020-10-30 15:24:56 +08:00
rainzm
a53a44cb2e fix(region): prevent dirty data when syncing snapshot 2020-10-30 15:24:56 +08:00
Qu Xuan
4cbe931635 fix: secgroup cache tenant_id 2020-10-30 15:04:25 +08:00
yunion-ci-robot
45fc6d0ff1 Merge pull request #8578 from rainzm/automated-cherry-pick-of-#8576-upstream-release-3.4
Automated cherry pick of #8576: fix(region): sync automatically snapshot for external disk
2020-10-30 09:11:44 +08:00
yunion-ci-robot
a1b72712ec Merge pull request #8561 from zexi/automated-cherry-pick-of-#8558-upstream-release-3.4
Automated cherry pick of #8558: informer: ignore outside context cancel when worker run
2020-10-30 00:37:44 +08:00
yunion-ci-robot
8e474c5961 Merge pull request #8579 from tb365/automated-cherry-pick-of-#8573-upstream-release-3.4
Automated cherry pick of #8573: qcloud elb cert duplicate fix
2020-10-29 23:28:43 +08:00
TangBin
8f2f78b4ed qcloud elb cert duplicate fix 2020-10-29 22:37:09 +08:00
rainzm
a3f01f1330 fix(region): sync automatically snapshot for external disk 2020-10-29 22:32:21 +08:00
Zexi Li
a0f495db93 informer: ignore outside context cancel when worker run 2020-10-29 20:54:00 +08:00
yunion-ci-robot
605f3fea26 Merge pull request #8566 from rainzm/automated-cherry-pick-of-#8564-upstream-release-3.4
Automated cherry pick of #8564: update vendor
2020-10-29 20:08:43 +08:00
rainzm
52a72952c9 update vendor 2020-10-29 17:25:58 +08:00
Yousong Zhou
4eb1292a2d Merge pull request #8550 from swordqiu/automated-cherry-pick-of-#8548-upstream-release-3.4
Automated cherry pick of #8548: fix: fail to delete public_ip eip
2020-10-29 10:18:33 +08:00
Qiu Jian
b1e91c1c27 fix: fail to delete public_ip eip 2020-10-28 23:46:20 +08:00
yunion-ci-robot
a1760d7b86 Merge pull request #8537 from rainzm/automated-cherry-pick-of-#8535-upstream-release-3.4
Automated cherry pick of #8535: refactor(region): faster list for cachedimage
2020-10-28 17:58:42 +08:00
rainzm
c456586860 refactor(region): faster list for cachedimage
Pro version of #8440 with checking the necessity of id filtering
2020-10-28 15:36:03 +08:00
yunion-ci-robot
71e759a032 Merge pull request #8527 from rainzm/automated-cherry-pick-of-#8525-upstream-release-3.4
Automated cherry pick of #8525: fix(esxi): no callback in uploadHandler
2020-10-28 00:59:42 +08:00
yunion-ci-robot
96ce64d5f0 Merge pull request #8514 from ioito/automated-cherry-pick-of-#8512-upstream-release-3.4
Automated cherry pick of #8512: fix: avoid sync project panic
2020-10-28 00:48:42 +08:00
rainzm
d31802c87b fix(esxi): filter vmdk item in lease.info 2020-10-27 21:32:21 +08:00
rainzm
d3964bf0d1 fix(esxi): use correct device index
1. Sort devices via their Key.
2. There is no relationship between vdisk index and vnics length.
2020-10-27 21:32:21 +08:00
rainzm
57dad6281a fix(esxi): no callback in uploadHandler 2020-10-27 21:32:21 +08:00
Zexi Li
b74130903e Merge pull request #8519 from ioito/automated-cherry-pick-of-#8517-upstream-release-3.4
Automated cherry pick of #8517: fix: set secgroup status
2020-10-27 17:28:39 +08:00
Qu Xuan
44046f2861 fix: set secgroup status 2020-10-27 16:20:06 +08:00
Qu Xuan
95f7600b67 fix: avoid sync project panic 2020-10-27 16:13:48 +08:00
yunion-ci-robot
749b819a62 Merge pull request #8501 from yousong/automated-cherry-pick-of-#8499-upstream-release-3.4
Automated cherry pick of #8499: lockman: test: add prefix setting
2020-10-26 21:24:40 +08:00
Yousong Zhou
f7f7c7be81 lockman: test: add prefix setting 2020-10-26 20:36:32 +08:00
yunion-ci-robot
6a221dbc1e Merge pull request #8498 from zhaoxiangchun/automated-cherry-pick-of-#8496-upstream-release-3.4
Automated cherry pick of #8496: commalertUpdateInput increat param:
2020-10-26 19:55:47 +08:00
zhaoxiangchun
002a2af272 commalertUpdateInput increat param:
1.处理operator对alertType == system的报警策略的update请求
2020-10-26 18:21:11 +08:00
yunion-ci-robot
1757d3d6a9 Merge pull request #8494 from rainzm/automated-cherry-pick-of-#8493-upstream-release-3.4
Automated cherry pick of #8493: fix(region): roll back the optimization of cachedimage list
2020-10-26 18:17:39 +08:00
rainzm
be5a6a93cc fix(region): roll back the optimization of cachedimage list 2020-10-26 17:37:59 +08:00
yunion-ci-robot
bbbe78dbef Merge pull request #8489 from ioito/automated-cherry-pick-of-#8487-upstream-release-3.4
Automated cherry pick of #8487: fix: avoid delete public ip when sync eip list
2020-10-26 17:02:42 +08:00
Qu Xuan
a851e01330 fix: avoid delete public ip when sync eip list 2020-10-26 16:18:46 +08:00
yunion-ci-robot
29d06d52dd Merge pull request #8466 from wanyaoqi/automated-cherry-pick-of-#8464-upstream-release-3.4
Automated cherry pick of #8464: check disk is in reset before delete snapshot
2020-10-25 10:54:39 +08:00
yunion-ci-robot
1a6d4d1035 Merge pull request #8486 from swordqiu/automated-cherry-pick-of-#8484-upstream-release-3.4
Automated cherry pick of #8484: fix: server usage status not correct
2020-10-25 10:52:41 +08:00
Qiu Jian
90d649aef9 fix: server usage status not correct 2020-10-25 08:38:48 +08:00
Zexi Li
23b99a6232 Merge pull request #8472 from wanyaoqi/automated-cherry-pick-of-#8470-upstream-release-3.4
Automated cherry pick of #8470: fix on stream disk complete snapshots refcount not update
2020-10-24 13:09:42 +08:00
Zexi Li
16c38fe6be Merge pull request #8476 from zexi/automated-cherry-pick-of-#8474-upstream-release-3.4
Automated cherry pick of #8474: monitor: set default influxdb datasource by endpoint type
2020-10-24 13:07:07 +08:00
Zexi Li
b43f8b3fac monitor: set default influxdb datasource by endpoint type 2020-10-23 20:10:08 +08:00
wanyaoqi
8e5b74a3f6 fix on stream disk complete snapshots refcount not update 2020-10-23 19:11:32 +08:00
yunion-ci-robot
b0cd3bf999 Merge pull request #8414 from zhaoxiangchun/automated-cherry-pick-of-#8412-upstream-release-3.4
Automated cherry pick of #8412: bugfix:
2020-10-23 18:35:17 +08:00
yunion-ci-robot
4a15284684 Merge pull request #8463 from rainzm/automated-cherry-pick-of-#8461-upstream-release-3.4
Automated cherry pick of #8461: fix(glance): allow public and private operations of guestimage
2020-10-23 18:29:15 +08:00
wanyaoqi
d78068d43a check disk is in reset before delete snapshot 2020-10-23 18:26:22 +08:00
yunion-ci-robot
80dce5eafb Merge pull request #8452 from wanyaoqi/automated-cherry-pick-of-#8450-upstream-release-3.4
Automated cherry pick of #8450: host increase cpu mem max size
2020-10-23 18:18:20 +08:00
yunion-ci-robot
950696ddb9 Merge pull request #8458 from rainzm/automated-cherry-pick-of-#8456-upstream-release-3.4
Automated cherry pick of #8456: fix(esxi): resize root disk after cloning vm
2020-10-23 18:17:20 +08:00
zhaoxiangchun
e7674116e1 bugfix:
1.资源报警增加websocket 消息通知:admin用户
2.统一influxdb中查询到的tag展示
2020-10-23 17:58:20 +08:00
rainzm
3fae388db5 fix(glance): allow public and private operations of guestimage
The public and private operations of the guest image depends on these operations of the subimage.
2020-10-23 17:57:48 +08:00
rainzm
8f3b8c7ff1 fix(esxi): resize root disk after cloning vm
The root disk size set when the machine is cloned does not take effect,
so set the root disk size after the machine is cloned.
2020-10-23 17:03:52 +08:00
wanyaoqi
a4b1d3952d host increase cpu mem max size 2020-10-23 15:15:55 +08:00
yunion-ci-robot
a5ef16243d Merge pull request #8442 from rainzm/automated-cherry-pick-of-#8440-upstream-release-3.4
Automated cherry pick of #8440: refactor(region): faster list for cachedimage
2020-10-22 21:25:14 +08:00
rainzm
b0823a09bb refactor(region): faster list for cachedimage
修改之前:
诸如provider, zone, host_schedtag_id, valid
等过滤条件,是通过过滤出符合条件的 storagecachedimage 然后使用 cachedimage_id 来过滤 cachedimge,
问题是,每一个过滤条件都会独立的去执行上面的过程,这样同样的查询可能要经过很多次,并且如果遇到
弱的过滤条件,比如 valid ,过滤出来的 storagecachedimage
非常之多,然后在使用 cachedimage_id 去过滤 cachedimage,会非常慢。

修改之后:
过滤条件的相似的逻辑合并起来,只需要向 subQuery 中添加 filter,使用 subQuery 一次把 storagecachedimage
过滤出来,然后使用 cachedimage_id 过滤 cachedimage。
2020-10-22 20:18:40 +08:00
yunion-ci-robot
492920ac7c Merge pull request #8428 from ioito/automated-cherry-pick-of-#8426-upstream-release-3.4
Automated cherry pick of #8426: fix: 避免冲掉设置的到期释放时间
2020-10-22 20:13:22 +08:00
yunion-ci-robot
f96ac33175 Merge pull request #8433 from lvyangyang/automated-cherry-pick-of-#8416-upstream-release-3.4
Automated cherry pick of #8416: fix:get all project dns resource
2020-10-22 20:10:19 +08:00
yunion-ci-robot
1bc16d6f2e Merge pull request #8439 from rainzm/automated-cherry-pick-of-#8437-upstream-release-3.4
Automated cherry pick of #8437: fix(region): add suffix 'display' for time_points and repeat_weekdays
2020-10-22 20:07:17 +08:00
rainzm
0ba8cb7fbd fix: don't update NextSyncTime when snapshots that should be added has not 2020-10-22 19:42:26 +08:00
rainzm
93bb4022f2 fix(region): init NextSyncTimeiwhen create snapshotpolicydisks 2020-10-22 19:42:26 +08:00
rainzm
bbfb9db90a fix(region): add suffix 'display' for time_points and repeat_weekdays
TimePoints and RepeatWeekdays in SnapshotPolicyDetails is duplicated
with thess in SnapshotPolicy, which result in the fault of reponse for
request GET.
2020-10-22 19:42:26 +08:00
lvyangyang
66c81ee548 fix:get all project dns resource 2020-10-22 17:06:00 +08:00
Qu Xuan
8f3cb9cdbb fix: 避免冲掉设置的到期释放时间 2020-10-22 15:41:19 +08:00
yunion-ci-robot
1ac71d0016 Merge pull request #8409 from wanyaoqi/automated-cherry-pick-of-#8407-upstream-release-3.4
Automated cherry pick of #8407: fix informer backend
2020-10-22 15:04:16 +08:00
yunion-ci-robot
e8238a2cf5 Merge pull request #8425 from ioito/automated-cherry-pick-of-#8423-upstream-release-3.4
Automated cherry pick of #8423: fix: add aliyun new region
2020-10-22 14:31:17 +08:00
Qu Xuan
22349276d9 fix: add aliyun new region 2020-10-22 11:53:08 +08:00
wanyaoqi
d6a9b5dac2 fix informer backend 2020-10-21 10:54:14 +08:00
yunion-ci-robot
0e3aa96f77 Merge pull request #8406 from rainzm/automated-cherry-pick-of-#8404-upstream-release-3.4
Automated cherry pick of #8404: fix(notify): add AllOkContactTypes in where permanently enabled and verified ContactType
2020-10-21 10:51:16 +08:00
rainzm
5306add70a feat(notify): add IntelliNotify
IntelliNotify will try to create receiver nonexistent if createReceiver is set to true
2020-10-20 20:38:17 +08:00
rainzm
f367f1abef fix(notify): add AllOkContactTypes in where permanently enabled and verified ContactType 2020-10-20 20:38:17 +08:00
Zexi Li
93dc36134d Merge pull request #8402 from wanyaoqi/automated-cherry-pick-of-#8400-upstream-release-3.4
Automated cherry pick of #8400: fix fetch customize columns
2020-10-20 18:52:56 +08:00
wanyaoqi
f706d59ac5 fix fetch customize columns 2020-10-20 18:43:52 +08:00
Zexi Li
7438bcab23 Merge pull request #8339 from tb365/automated-cherry-pick-of-#8338-upstream-release-3.4
Automated cherry pick of #8338: add aliyun finance environment
2020-10-20 13:33:47 +08:00
yunion-ci-robot
e038eebeb7 Merge pull request #8263 from rainzm/automated-cherry-pick-of-#8258-upstream-release-3.4
Automated cherry pick of #8258: feat: add a retry mechanism to AutoSyncExtDiskSnapshot
2020-10-20 13:31:13 +08:00
Zexi Li
bd7d84aebd Merge pull request #8396 from tb365/automated-cherry-pick-of-#8395-upstream-release-3.4
Automated cherry pick of #8395: lbcert delete bugfix
2020-10-20 13:28:31 +08:00
Zexi Li
5f6f554464 Merge pull request #8398 from zexi/automated-cherry-pick-of-#8397-upstream-release-3.4
Automated cherry pick of #8397: fix: monitor commonalert not detach alert resource
2020-10-20 13:26:51 +08:00
Zexi Li
d99d93d046 fix: monitor commonalert not detach alert resource 2020-10-20 13:21:22 +08:00
Zexi Li
4a856ac688 Merge pull request #8393 from rainzm/automated-cherry-pick-of-#8392-upstream-release-3.4
Automated cherry pick of #8392: fix(region): compute binded disk count when deleting snapshotpolicy
2020-10-20 11:49:52 +08:00
TangBin
7da0a67af5 lbcert delete bugfix 2020-10-20 11:27:53 +08:00
rainzm
37c14d756d feat: use details data to cover obj data in FetchCustomizeColumns 2020-10-20 11:20:45 +08:00
rainzm
6f1417d268 fix(region): compute binded disk count when deleting snapshotpolicy 2020-10-20 11:20:45 +08:00
Zexi Li
b3105a05d3 Merge pull request #8322 from ioito/automated-cherry-pick-of-#8321-upstream-release-3.4
Automated cherry pick of #8321: fix: sync dns records after sync vpcs
2020-10-20 11:19:50 +08:00
rainzm
93ac3260a1 feat: add a retry mechanism to AutoSyncExtDiskSnapshot 2020-10-20 09:54:53 +08:00
yunion-ci-robot
3d39c20c91 Merge pull request #8391 from zhaoxiangchun/automated-cherry-pick-of-#8390-upstream-release-3.4
Automated cherry pick of #8390: bugfix: commonalert
2020-10-19 23:19:23 +08:00
zhaoxiangchun
8a0eeb7d67 bugfix: commonalert
1.报警消息中取消返回sql信息
2.commonalert 中支持top bottom 结构influxdb 查询
2020-10-19 23:06:29 +08:00
yunion-ci-robot
163be04dbb Merge pull request #8364 from zhaoxiangchun/automated-cherry-pick-of-#8357-upstream-release-3.4
Automated cherry pick of #8357: bugfix: qcloud pull metric
2020-10-19 22:34:14 +08:00
zhaoxiangchun
06db7339e4 bugfix: qcloud pull metric
get请求中增加region参数
2020-10-19 22:26:52 +08:00
yunion-ci-robot
e5b3f4673d Merge pull request #8387 from zexi/automated-cherry-pick-of-#8346-upstream-release-3.4
Automated cherry pick of #8346: monitor: add alert resource
2020-10-19 22:13:12 +08:00
yunion-ci-robot
3a6e910580 Merge pull request #8380 from yousong/automated-cherry-pick-of-#8379-upstream-release-3.4
Automated cherry pick of #8379: logger: actionlog: readability change
2020-10-19 22:07:12 +08:00
Zexi Li
0317fad04e Merge pull request #8389 from wanyaoqi/automated-cherry-pick-of-#8388-upstream-release-3.4
Automated cherry pick of #8388: remove try set informer backend
2020-10-19 22:02:39 +08:00
Zexi Li
af11737e79 monitor: add alert resource 2020-10-19 21:48:35 +08:00
wanyaoqi
15bd6bacd6 remove try set informer backend 2020-10-19 21:33:49 +08:00
Zexi Li
28ba60f630 Merge pull request #8386 from wanyaoqi/automated-cherry-pick-of-#8385-upstream-release-3.4
Automated cherry pick of #8385: telegraf-raid-plugin: update raid state to lower case
2020-10-19 21:00:06 +08:00
yunion-ci-robot
8799a0bcf9 Merge pull request #8384 from wanyaoqi/automated-cherry-pick-of-#8383-upstream-release-3.4
Automated cherry pick of #8383: keystone init etcd backend
2020-10-19 20:58:13 +08:00
wanyaoqi
6706c39f85 telegraf-raid-plugin: update raid state to lower case 2020-10-19 20:12:47 +08:00
wanyaoqi
8ce183eaf5 keystone init etcd backend 2020-10-19 20:04:42 +08:00
yunion-ci-robot
a5bec974f1 Merge pull request #8345 from rainzm/automated-cherry-pick-of-#8344-upstream-release-3.4
Automated cherry pick of #8344: feat(notify): support webhook contact type
2020-10-19 18:25:11 +08:00
Zexi Li
ac15981b5d Merge pull request #8377 from swordqiu/automated-cherry-pick-of-#8350-upstream-release-3.4
Automated cherry pick of #8350: fix: missing authenticate action log for user web login
2020-10-19 17:44:44 +08:00
Zexi Li
3c447a32f6 Merge pull request #8342 from swordqiu/automated-cherry-pick-of-#8337-upstream-release-3.4
Automated cherry pick of #8337: fix: cancel pending-delete should increase resource quota usages
2020-10-19 17:44:03 +08:00
yunion-ci-robot
3a8809e060 Merge pull request #8341 from rainzm/automated-cherry-pick-of-#8340-upstream-release-3.4
Automated cherry pick of #8340: feat: add valid filter for cachedimage list
2020-10-19 17:13:11 +08:00
Yousong Zhou
0964c6ad82 logger: actionlog: i18n for distinct-field 2020-10-19 16:42:24 +08:00
Yousong Zhou
5d0fd14cb3 cloudcommon: db: GET: i18n for result of get property calls 2020-10-19 16:42:24 +08:00
Yousong Zhou
cd123e007d cloudcommon: db: add man.GetI18N 2020-10-19 16:42:24 +08:00
Yousong Zhou
91736710ba cloudcommon: db: modelbase: distinct-field: readability change 2020-10-19 16:42:24 +08:00
Yousong Zhou
c2589e7352 logger: actionlog: readability change 2020-10-19 16:42:24 +08:00
rainzm
d454b0a792 feat: add valid filter for cachedimage list
Use the 'valid' switch to control whether to filter out
the cachedimage corresponding to invalid storage
2020-10-19 16:28:04 +08:00
Qiu Jian
2a1a640f6b fix: cancel pending-delete should increase resource quota usages 2020-10-19 16:03:26 +08:00
rainzm
9dee4c1b90 feat(region): call NotifyWebhook in the life cycle of guests 2020-10-19 16:02:55 +08:00
rainzm
0fd6481e4d feat: add NotifyWebhook in notifyclient 2020-10-19 16:02:55 +08:00
rainzm
d799a71fdb feat(notify): allow empty receivers for robot or webhook contact type 2020-10-19 16:02:55 +08:00
rainzm
436f1e5cb9 feat(notify): support webhook contact type 2020-10-19 16:02:55 +08:00
Qiu Jian
a92a0e2d05 fix: missing authenticate action log for user web login 2020-10-19 15:54:10 +08:00
yunion-ci-robot
0cafa996d7 Merge pull request #8362 from swordqiu/automated-cherry-pick-of-#8361-upstream-release-3.4
Automated cherry pick of #8361: fix: do not lock guest after lock eip, to prevent possible dead lock
2020-10-19 15:20:12 +08:00
yunion-ci-robot
2a10b72f98 Merge pull request #8348 from swordqiu/automated-cherry-pick-of-#8347-upstream-release-3.4
Automated cherry pick of #8347: fix: remote update metadata may cause metadata update loop
2020-10-19 15:19:16 +08:00
yunion-ci-robot
31c2b6270a Merge pull request #8354 from swordqiu/automated-cherry-pick-of-#8353-upstream-release-3.4
Automated cherry pick of #8353: fix: reduce change config logs
2020-10-19 15:18:18 +08:00
yunion-ci-robot
a6397d18c2 Merge pull request #8351 from swordqiu/automated-cherry-pick-of-#8350-upstream-release-3.4
Automated cherry pick of #8350: fix: missing authenticate action log for user web login
2020-10-19 15:17:12 +08:00
Zexi Li
203bf44639 Merge pull request #8367 from ioito/automated-cherry-pick-of-#8366-upstream-release-3.4
Automated cherry pick of #8366: fix: add rds cpu and memory usage
2020-10-19 15:11:56 +08:00
Zexi Li
d7a4e52b15 Merge pull request #8374 from ioito/automated-cherry-pick-of-#8373-upstream-release-3.4
Automated cherry pick of #8373: fix: 新增google存储类型
2020-10-19 15:11:08 +08:00
Zexi Li
7946dcef3f Merge pull request #8370 from ioito/automated-cherry-pick-of-#8369-upstream-release-3.4
Automated cherry pick of #8369: fix: use correct worker
2020-10-19 15:10:00 +08:00
Qu Xuan
f77bcd3bbf fix: 新增google存储类型 2020-10-19 14:16:51 +08:00
yunion-ci-robot
4841fbb843 Merge pull request #8356 from wanyaoqi/automated-cherry-pick-of-#8355-upstream-release-3.4
Automated cherry pick of #8355: host: fix sync storage info duration'
2020-10-19 11:57:12 +08:00
Qiu Jian
9b8758e191 fix: reduce change config logs 2020-10-19 11:51:38 +08:00
Qiu Jian
62f5355b11 fix: remote update metadata may cause metadata update loop 2020-10-19 11:46:20 +08:00
Qiu Jian
d774581a23 fix: do not lock guest after lock eip, to prevent possible dead lock 2020-10-19 11:43:22 +08:00
Qu Xuan
062301f54a fix: use correct worker 2020-10-19 11:42:25 +08:00
Qu Xuan
16d13941ce fix: add rds cpu and memory usage 2020-10-19 11:23:21 +08:00
yunion-ci-robot
a10b1945f6 Merge pull request #8359 from yousong/automated-cherry-pick-of-#8358-upstream-release-3.4
Automated cherry pick of #8358: .circleci: build: make with parallel level 2
2020-10-19 10:50:16 +08:00
Yousong Zhou
3aadaf15b7 .circleci: build: make with parallel level 2 2020-10-19 10:29:50 +08:00
wanyaoqi
7a9b491d13 host: fix sync storage info duration' 2020-10-18 01:02:12 +08:00
Qiu Jian
ecbe76e9ff fix: missing authenticate action log for user web login 2020-10-17 22:09:55 +08:00
yunion-ci-robot
41bdfffd57 Merge pull request #8333 from rainzm/automated-cherry-pick-of-#8332-upstream-release-3.4
Automated cherry pick of #8332: feat: support lock storage from selected cachedimage
2020-10-17 18:23:10 +08:00
TangBin
a9c44ed304 add aliyun finance environment 2020-10-17 17:41:57 +08:00
rainzm
7a2c2b8047 refactor: find the most suitable storage 2020-10-17 17:40:08 +08:00
rainzm
a35a6f3c11 feat(esxiagent): try to customize vm if deployfs failed 2020-10-17 17:40:08 +08:00
rainzm
5a7876ae47 feat: support lock storage from selected cachedimage 2020-10-17 17:40:08 +08:00
yunion-ci-robot
31de731cbd Merge pull request #8336 from wanyaoqi/automated-cherry-pick-of-#8325-upstream-release-3.4
Automated cherry pick of #8325: telegraf raid plugin
2020-10-17 11:23:11 +08:00
wanyaoqi
8b2680ed56 telegraf raid plugin 2020-10-17 11:11:30 +08:00
yunion-ci-robot
39c35359aa Merge pull request #8329 from swordqiu/automated-cherry-pick-of-#8304-upstream-release-3.4
Automated cherry pick of #8304: feature: qcloud create VM with tags
2020-10-16 22:19:05 +08:00
Qiu Jian
a764a64696 feature: remote update qcloud instance metadata and name 2020-10-16 21:41:33 +08:00
Qiu Jian
f05a56aadd feature: qcloud create VM with tags 2020-10-16 21:41:33 +08:00
yunion-ci-robot
6cd69d3587 Merge pull request #8335 from rainzm/automated-cherry-pick-of-#8334-upstream-release-3.4
Automated cherry pick of #8334: fix(compute): filter cachedimage with health storage
2020-10-16 19:41:45 +08:00
rainzm
2a1bbfd574 fix(compute): filter cachedimage with health storage 2020-10-16 18:38:44 +08:00
Zexi Li
301006e213 Merge pull request #8331 from ioito/automated-cherry-pick-of-#8330-upstream-release-3.4
Automated cherry pick of #8330: fix: hostname for instance
2020-10-16 17:43:22 +08:00
Qu Xuan
950a2c29fb fix: hostname for instance 2020-10-16 17:12:40 +08:00
yunion-ci-robot
558872db27 Merge pull request #8324 from zhasm/automated-cherry-pick-of-#8323-upstream-release-3.4
Automated cherry pick of #8323: remove alpine build cache before make image
2020-10-16 15:14:46 +08:00
yunion-ci-robot
6386391bf4 Merge pull request #8327 from zexi/automated-cherry-pick-of-#8326-upstream-release-3.4
Automated cherry pick of #8326: fix: get images distinct field
2020-10-16 14:35:40 +08:00
Zexi Li
d298c75448 fix: get images distinct field 2020-10-16 12:01:01 +08:00
Zhang Dongliang
28cb75f41b remove alpine build cache before make image 2020-10-16 12:00:10 +08:00
yunion-ci-robot
560a68d379 Merge pull request #8320 from swordqiu/automated-cherry-pick-of-#8319-upstream-release-3.4
Automated cherry pick of #8319: fix: resolve with_meta filter conflict
2020-10-16 11:39:33 +08:00
Qu Xuan
11f8e4f71f fix: sync dns records after sync vpcs 2020-10-16 11:14:44 +08:00
yunion-ci-robot
9e597db90a Merge pull request #8315 from rainzm/automated-cherry-pick-of-#8314-upstream-release-3.4
Automated cherry pick of #8314: feat(esxi): do not specify portkey in NewVNIC
2020-10-16 10:38:34 +08:00
Qiu Jian
9c9cb17d32 fix: resolve with_meta filter conflict 2020-10-16 10:34:04 +08:00
rainzm
cc96c01c00 feat(esxi): do not specify portkey in NewVNIC 2020-10-16 08:22:58 +08:00
yunion-ci-robot
cb22077722 Merge pull request #8313 from swordqiu/automated-cherry-pick-of-#8312-upstream-release-3.4
Automated cherry pick of #8312: feature: filter storages by image
2020-10-15 23:10:33 +08:00
yunion-ci-robot
8e3c173373 Merge pull request #8309 from ioito/automated-cherry-pick-of-#8308-upstream-release-3.4
Automated cherry pick of #8308: fix: 避免并发同步安全组导致规则混乱
2020-10-15 23:02:32 +08:00
Qiu Jian
45e092bd2d feature: filter storages by image 2020-10-15 22:57:13 +08:00
Qu Xuan
4b2d67de42 fix: 避免并发同步安全组导致规则混乱 2020-10-15 22:26:54 +08:00
yunion-ci-robot
6677c30a5d Merge pull request #8306 from zexi/automated-cherry-pick-of-#8305-upstream-release-3.4
Automated cherry pick of #8305: stringutils2: add RemoveUtf8Strings func
2020-10-15 21:46:36 +08:00
Zexi Li
64593fc882 stringutils2: add RemoveUtf8Strings func 2020-10-15 19:37:00 +08:00
355 changed files with 10411 additions and 5869 deletions

View File

@@ -38,7 +38,7 @@ jobs:
command: |
targets="$(circleci tests glob "cmd/*" | grep -v cmd/host-image | circleci tests split)"
echo $targets | tr ' ' '\n'
make -j3 $targets
make -j2 $targets
ls -lh _output/bin/
- save_cache:
key: onecloud-build-cache-{{ checksum "go.mod" }}-{{ checksum "Makefile" }}

1
.gitignore vendored
View File

@@ -31,6 +31,7 @@ _output
/structargtest
.idea
.vscode
intellij.yaml
GPATH
GRTAGS
GTAGS

View File

@@ -313,7 +313,7 @@ REGISTRY ?= "registry.cn-beijing.aliyuncs.com/yunionio"
VERSION ?= $(shell git describe --exact-match 2> /dev/null || \
git describe --match=$(git rev-parse --short=8 HEAD) --always --dirty --abbrev=8)
image: clean
image:
mkdir -p $(ROOT_DIR)/_output
DEBUG=$(DEBUG) ARCH=$(ARCH) TAG=$(VERSION) REGISTRY=$(REGISTRY) $(ROOT_DIR)/scripts/docker_push.sh $(filter-out $@,$(MAKECMDGOALS))

View File

@@ -0,0 +1,3 @@
FROM registry.cn-beijing.aliyuncs.com/yunionio/yunion-rootfs:v1.0
ADD ./_output/bin/telegraf-raid-plugin /opt/yunion/bin/telegraf-raid-plugin

View File

@@ -1,18 +0,0 @@
## {{.title}}
- 时间: {{.start_time}}
- 级别: {{.level}}
- 详情地址: {{.web_url}}/commonalerts
{{ range .matches}}
- 指标: {{.metric}}
- 触发值: {{html .value_str}}
### 触发条件:
- {{html $.description}}
### 标签
> 名称: {{ index .tags "name" }}
> ip: {{ index .tags "ip" }}
> 平台: {{ index .tags "brand" }}
------
{{- end}}

View File

@@ -1,18 +0,0 @@
## {{.title}}
- Time: {{.start_time}}
- Level: {{.level}}
- WebUrl: {{.web_url}}/commonalerts
{{ range .matches}}
- Metric: {{.metric}}
- Trigger value: {{html .value_str}}
### Trigger condition:
- {{html $.description }}
### Label
> Name: {{ index .tags "name" }}
> IP: {{ index .tags "ip" }}
> Brand: {{ index .tags "brand" }}
------
{{- end}}

View File

@@ -0,0 +1,9 @@
{{.title}}
策略名称: {{.name}}
触发时间: {{.start_time}}
报警级别: {{.level}}
触发条件: {{.description | unescaped}}
资源数量:{{len .matches}}
资源名称:{{.resource_name}}
详情地址: {{.web_url}}/commonalerts

View File

@@ -0,0 +1,9 @@
{{.title}}
AlertName: {{.name}}
Time: {{.start_time}}
Level: {{.level}}
TriggerCondition: {{.description | unescaped}}
ResourceCount: {{len .matches}}
ResourceName: {{.resource_name}}
WebUrl: {{.web_url}}/commonalerts

View File

@@ -1 +1 @@
Yunion Verify
{{.copyright}} Verify

View File

@@ -28,6 +28,7 @@ import (
type BaseOptions struct {
Debug bool `help:"debug mode"`
Help bool `help:"Show help"`
CloudEnv string `help:"Cloud environment" default:"$ALIYUN_CLOUD_ENV" choices:"InternationalCloud|FinanceCloud" metavar:"ALIYUN_CLOUD_ENV"`
AccessKey string `help:"Access key" default:"$ALIYUN_ACCESS_KEY" metavar:"ALIYUN_ACCESS_KEY"`
Secret string `help:"Secret" default:"$ALIYUN_SECRET" metavar:"ALIYUN_SECRET"`
RegionId string `help:"RegionId" default:"$ALIYUN_REGION" metavar:"ALIYUN_REGION"`
@@ -86,7 +87,9 @@ func newClient(options *BaseOptions) (*aliyun.SRegion, error) {
cli, err := aliyun.NewAliyunClient(
aliyun.NewAliyunClientConfig(
options.AccessKey, options.Secret,
options.CloudEnv,
options.AccessKey,
options.Secret,
).Debug(options.Debug),
)
if err != nil {

View File

@@ -29,6 +29,7 @@ func init() {
Zone string `help:"show images cached at zone"`
HostSchedtagId string `help:"filter cached image with host schedtag"`
Valid *bool `help:"valid cachedimage"`
}
R(&CachedImageListOptions{}, "cached-image-list", "List cached images", func(s *mcclient.ClientSession, args *CachedImageListOptions) error {
params, err := options.ListStructToParams(args)

View File

@@ -34,4 +34,5 @@ func init() {
cmd.Perform("cache-secgroup", &options.SecurityGroupCacheOptions{})
cmd.Perform("uncache-secgroup", &options.SecurityGroupUncacheSecurityGroup{})
cmd.Perform("purge", &options.SecgroupIdOptions{})
cmd.Perform("change-owner", &options.SecgroupChangeOwnerOptions{})
}

View File

@@ -83,6 +83,7 @@ func init() {
cmd.Perform("publicip-to-eip", new(options.ServerPublicipToEip))
cmd.Perform("set-auto-renew", new(options.ServerSetAutoRenew))
cmd.Perform("save-template", new(options.ServerSaveImageOptions))
cmd.Perform("remote-update", new(options.ServerRemoteUpdateOptions))
cmd.Get("vnc", new(options.ServerIdOptions))
cmd.Get("desc", new(options.ServerIdOptions))

View File

@@ -37,6 +37,7 @@ func init() {
Schedtag string `help:"filter storage by schedtag"`
HostSchedtagId string `help:"filter storage by host schedtag"`
ImageId string `help:"filter storage by image"`
}
R(&StorageListOptions{}, "storage-list", "List storages", func(s *mcclient.ClientSession, opts *StorageListOptions) error {
params, err := options.ListStructToParams(opts)

View File

@@ -284,10 +284,7 @@ type IPerformOpt interface {
func (cmd ResourceCmd) Perform(action string, args IPerformOpt) {
man := cmd.manager
callback := func(s *mcclient.ClientSession, args IPerformOpt) error {
params, err := args.Params()
if err != nil {
return err
}
params := jsonutils.Marshal(args) // .Params()
ret, err := man.(modulebase.Manager).PerformAction(s, args.GetId(), action, params)
if err != nil {
return err
@@ -488,7 +485,7 @@ func (cmd JointCmd) List(args IJointListOpt) {
if len(args.GetMasterOpt()) > 0 {
result, err = man.ListDescendent(s, args.GetMasterOpt(), params)
} else if len(args.GetSlaveOpt()) > 0 {
result, err = man.ListDescendent2(s, args.GetMasterOpt(), params)
result, err = man.ListDescendent2(s, args.GetSlaveOpt(), params)
} else {
result, err = man.List(s, params)
}

View File

@@ -0,0 +1,31 @@
// Copyright 2019 Yunion
//
// 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.
package monitor
import (
"yunion.io/x/onecloud/cmd/climc/shell"
"yunion.io/x/onecloud/pkg/mcclient/modules/monitor"
options "yunion.io/x/onecloud/pkg/mcclient/options/monitor"
)
func init() {
cmd := shell.NewResourceCmd(monitor.AlertResources)
cmd.List(new(options.AlertResourceListOptions))
cmd.Show(new(options.AlertResourceShowOptions))
cmd.BatchDelete(new(options.AlertResourceDeleteOptions))
jCmd := shell.NewJointCmd(monitor.AlertResourceAlert)
jCmd.List(new(options.AlertResourceAlertListOptions))
}

View File

@@ -12,5 +12,6 @@ func init() {
cmd.Show(new(options.CommonAlertShowOptions))
cmd.Perform("enable", &options.CommonAlertShowOptions{})
cmd.Perform("disable", &options.CommonAlertShowOptions{})
cmd.Delete(new(options.CommonAlertDeleteOptions))
cmd.BatchDelete(new(options.CommonAlertDeleteOptions))
cmd.Perform("config", &options.CommonAlertUpdateOptions{})
}

View File

@@ -27,7 +27,7 @@ func init() {
cmd.Show(new(options.SuggestRuleShowOptions))
cmd.Perform("enable", new(options.SuggestRuleShowOptions))
cmd.Perform("disable", new(options.SuggestRuleShowOptions))
cmd.Delete(new(options.CommonAlertDeleteOptions))
cmd.BatchDelete(new(options.CommonAlertDeleteOptions))
cmd.Perform("config", new(options.SuggestRuleConfigOptions))
}

View File

@@ -33,7 +33,8 @@ type BaseOptions struct {
Host string `help:"SSH Host IP" default:"$RAID_HOST" metavar:"RAID_HOST"`
Username string `help:"Username, usually root" default:"$RAID_USERNAME" metavar:"RAID_USERNAME"`
Password string `help:"Password" default:"$RAID_PASSWORD" metavar:"RAID_PASSWORD"`
Driver string `help:"Password" default:"$RAID_DRIVER" metavar:"RAID_DRIVER" choices:"MegaRaid|HPSARaid|Mpt2SAS|MarvelRaid"`
Driver string `help:"Raid dirver" default:"$RAID_DRIVER" metavar:"RAID_DRIVER" choices:"MegaRaid|HPSARaid|Mpt2SAS|MarvelRaid"`
LocalHost bool `help:"Run raidcli in localhost"`
SUBCOMMAND string `help:"s3cli subcommand" subcommand:"true"`
}
@@ -83,43 +84,48 @@ func showErrorAndExit(e error) {
}
func newClient() (raid.IRaidDriver, error) {
if len(options.Host) == 0 {
return nil, fmt.Errorf("Missing host")
}
if len(options.Username) == 0 {
return nil, fmt.Errorf("Missing username")
}
if len(options.Password) == 0 {
return nil, fmt.Errorf("Missing password")
if options.Debug {
raid.Debug = true
}
if len(options.Driver) == 0 {
return nil, fmt.Errorf("Missing driver")
}
if options.Debug {
raid.Debug = true
var drv raid.IRaidDriver
if !options.LocalHost {
if len(options.Host) == 0 {
return nil, fmt.Errorf("Missing host")
}
if len(options.Username) == 0 {
return nil, fmt.Errorf("Missing username")
}
if len(options.Password) == 0 {
return nil, fmt.Errorf("Missing password")
}
sshClient, err := ssh.NewClient(
options.Host,
22,
options.Username,
options.Password,
"",
)
if err != nil {
return nil, fmt.Errorf("ssh client init fail: %s", err)
}
drv = drivers.GetDriver(options.Driver, sshClient)
if drv == nil {
return nil, fmt.Errorf("not supported driver %s", options.Driver)
}
} else {
drv = drivers.GetLocalDriver(options.Driver)
}
sshClient, err := ssh.NewClient(
options.Host,
22,
options.Username,
options.Password,
"",
)
if err != nil {
return nil, fmt.Errorf("ssh client init fail: %s", err)
}
drv := drivers.GetDriver(options.Driver, sshClient)
if drv == nil {
return nil, fmt.Errorf("not supported driver %s", options.Driver)
}
err = drv.ParsePhyDevs()
err := drv.ParsePhyDevs()
if err != nil {
return nil, fmt.Errorf("parse phyical devices error %s", err)
}

View File

@@ -0,0 +1,193 @@
package main
import (
"context"
"fmt"
"os"
"strings"
"time"
v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"yunion.io/x/jsonutils"
"yunion.io/x/log"
"yunion.io/x/onecloud/pkg/baremetal/utils/detect_storages"
"yunion.io/x/onecloud/pkg/baremetal/utils/raid/drivers"
"yunion.io/x/onecloud/pkg/compute/baremetal"
"yunion.io/x/onecloud/pkg/util/httputils"
)
const (
INTERVAL_SECOND = 300
TelegrafServer = "http://localhost:8087/write"
)
// Failed, Offline, Degraded, Rebuilding, Out of Sync (OSY)
func main() {
// creates the in-cluster config
config, err := rest.InClusterConfig()
if err != nil {
log.Fatalln(err)
}
// creates the clientset
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
log.Fatalln(err)
}
nodeName := os.Getenv("NODENAME")
if len(nodeName) == 0 {
log.Fatalf("Missing env nodename")
}
node, err := clientset.CoreV1().Nodes().Get(nodeName, metav1.GetOptions{})
if err != nil {
log.Fatalln(err)
}
var masterAddress string
if length := len(node.Status.Conditions); length > 0 {
if node.Status.Conditions[length-1].Type == v1.NodeReady &&
node.Status.Conditions[length-1].Status == v1.ConditionTrue {
for _, addr := range node.Status.Addresses {
if addr.Type == v1.NodeInternalIP {
masterAddress = addr.Address
break
}
}
}
}
log.Infof("Start Colloct Raid Info And Send To Telegraf ...")
c := NewRaidInfoCollector(nodeName, masterAddress, INTERVAL_SECOND)
c.Start()
}
type RaidInfoCollector struct {
waitingReportData []string
LastCollectTime time.Time
ReportInterval int // seconds
Hostname string
HostIp string
}
func NewRaidInfoCollector(hostname, hostIp string, interval int) *RaidInfoCollector {
return &RaidInfoCollector{
waitingReportData: make([]string, 0),
ReportInterval: interval,
Hostname: hostname,
HostIp: hostIp,
}
}
func (c *RaidInfoCollector) runMain() {
timeBegin := time.Now()
elapse := timeBegin.Sub(c.LastCollectTime)
if elapse < time.Second*time.Duration(c.ReportInterval) {
return
} else {
c.LastCollectTime = timeBegin
}
c.runMonitor()
}
func (c *RaidInfoCollector) runMonitor() {
reportData := c.collectReportData()
if len(reportData) > 0 {
c.reportRaidInfoToTelegraf(reportData)
}
}
func (c *RaidInfoCollector) collectReportData() string {
if len(c.waitingReportData) > 60 {
c.waitingReportData = c.waitingReportData[1:]
}
return c.CollectReportData()
}
func (c *RaidInfoCollector) CollectReportData() string {
raidDiskInfo := make([]*baremetal.BaremetalStorage, 0)
// raidDrivers := []string{}
for _, drv := range drivers.GetDrivers(drivers.NewExecutor()) {
if err := drv.ParsePhyDevs(); err != nil {
log.Warningf("Raid driver %s ParsePhyDevs failed: %s", drv.GetName(), err)
continue
}
raidDiskInfo = append(raidDiskInfo, detect_storages.GetRaidDevices(drv)...)
// raidDrivers = append(raidDrivers, drv.GetName())
}
if len(raidDiskInfo) > 0 {
ret := c.toTelegrafReportData(raidDiskInfo)
return ret
}
return ""
}
func (c *RaidInfoCollector) Start() {
for {
c.runMain()
time.Sleep(time.Second * 1)
}
}
const MEASUREMENT = "host_raid"
func (c *RaidInfoCollector) toTelegrafReportData(raidDiskInfo []*baremetal.BaremetalStorage) string {
tag := fmt.Sprintf("%s=%s,%s=%s", "hostname", c.Hostname, "host_ip", c.HostIp)
ret := []string{}
for i := 0; i < len(raidDiskInfo); i++ {
statArr := []string{}
raidDiskInfo[i].Status = strings.ToLower(raidDiskInfo[i].Status)
jStat := jsonutils.Marshal(raidDiskInfo[i])
jMap, _ := jStat.GetMap()
for k, v := range jMap {
statArr = append(statArr, fmt.Sprintf("%s=%s", k, v.String()))
}
stat := strings.Join(statArr, ",")
diskTag := fmt.Sprintf(
"%s,%s=%s,%s=%d,%s=%d", tag, "driver", raidDiskInfo[i].Driver,
"adapter", raidDiskInfo[i].Adapter, "slot", raidDiskInfo[i].Slot,
)
line := fmt.Sprintf("%s,%s %s", MEASUREMENT, diskTag, stat)
ret = append(ret, line)
}
return strings.Join(ret, "\n")
}
func (c *RaidInfoCollector) reportRaidInfoToTelegraf(data string) {
body := strings.NewReader(data)
res, err := httputils.Request(
httputils.GetDefaultClient(), context.Background(), "POST", TelegrafServer, nil, body, false)
if err != nil {
log.Errorf("Upload guest metric failed: %s", err)
return
}
defer res.Body.Close()
if res.StatusCode != 204 {
log.Errorf("upload guest metric failed %d", res.StatusCode)
timestamp := time.Now().UnixNano()
for _, line := range strings.Split(data, "\n") {
c.waitingReportData = append(c.waitingReportData,
fmt.Sprintf("%s %d", line, timestamp))
}
} else {
if len(c.waitingReportData) > 0 {
oldDatas := strings.Join(c.waitingReportData, "\n")
body = strings.NewReader(oldDatas)
res, err = httputils.Request(
httputils.GetDefaultClient(), context.Background(), "POST", TelegrafServer, nil, body, false)
if err == nil {
defer res.Body.Close()
}
if res.StatusCode == 204 {
c.waitingReportData = c.waitingReportData[len(c.waitingReportData):]
} else {
log.Errorf("upload guest metric failed code: %d", res.StatusCode)
}
}
}
}

6
go.mod
View File

@@ -141,12 +141,12 @@ require (
k8s.io/cluster-bootstrap v0.17.3
k8s.io/kubernetes v1.16.0
yunion.io/x/executor v0.0.0-20200227030256-a18417815e74
yunion.io/x/jsonutils v0.0.0-20201014025429-7ce189228db6
yunion.io/x/jsonutils v0.0.0-20201110084044-3e4e1cb49769
yunion.io/x/log v0.0.0-20200313080802-57a4ce5966b3
yunion.io/x/ovsdb v0.0.0-20200526071744-27bf0940cbc7
yunion.io/x/pkg v0.0.0-20200814072949-4f1b541857d6
yunion.io/x/pkg v0.0.0-20201028134817-3ed15ee169bc
yunion.io/x/s3cli v0.0.0-20190917004522-13ac36d8687e
yunion.io/x/sqlchemy v0.0.0-20201009235752-2ef1a29656b0
yunion.io/x/sqlchemy v0.0.0-20201029091740-cd5e77b56d4b
yunion.io/x/structarg v0.0.0-20200720093445-9f850fa222ce
)

12
go.sum
View File

@@ -1124,8 +1124,10 @@ vbom.ml/util v0.0.0-20160121211510-db5cfe13f5cc/go.mod h1:so/NYdZXCz+E3ZpW0uAoCj
yunion.io/x/executor v0.0.0-20200227030256-a18417815e74 h1:A15C6VdVRWvmQ9pAJHrUs9yan5qKlYH7uaRxHg1kRbk=
yunion.io/x/executor v0.0.0-20200227030256-a18417815e74/go.mod h1:Uxuou9WQIeJXNpy7t2fPLL0BYLvLiMvGQwY7Qc6aSws=
yunion.io/x/jsonutils v0.0.0-20190625054549-a964e1e8a051/go.mod h1:4N0/RVzsYL3kH3WE/H1BjUQdFiWu50JGCFQuuy+Z634=
yunion.io/x/jsonutils v0.0.0-20201014025429-7ce189228db6 h1:RPpnTSCZwa9VQuWAf7S2dRjnZlYTIM0NH/j5vvUpk9g=
yunion.io/x/jsonutils v0.0.0-20201014025429-7ce189228db6/go.mod h1:p0nyMqGA/apTxxyLIU/o1k4V7Vujl2O6ey30L594sYE=
yunion.io/x/jsonutils v0.0.0-20201105032201-9d0fba742954 h1:gGU3uGxw82voqh3tVrTY4q43lLLooqgF662PqOeEpKY=
yunion.io/x/jsonutils v0.0.0-20201105032201-9d0fba742954/go.mod h1:p0nyMqGA/apTxxyLIU/o1k4V7Vujl2O6ey30L594sYE=
yunion.io/x/jsonutils v0.0.0-20201110084044-3e4e1cb49769 h1:LIQ4hhLGQuQK+XxlV+8JrKBuL37WUT+5ZTVxBwHOTD4=
yunion.io/x/jsonutils v0.0.0-20201110084044-3e4e1cb49769/go.mod h1:p0nyMqGA/apTxxyLIU/o1k4V7Vujl2O6ey30L594sYE=
yunion.io/x/log v0.0.0-20190514041436-04ce53b17c6b/go.mod h1:+gauLs73omeJAPlsXcevLsJLKixV+sR/E7WSYTSx1fE=
yunion.io/x/log v0.0.0-20190629062853-9f6483a7103d h1:59zrDL7Ft+hDukguJRmLr/Gdu/9V75x+yX99ovZwfaA=
yunion.io/x/log v0.0.0-20190629062853-9f6483a7103d/go.mod h1:LC6f/4FozL0iaAbnFt2eDX9jlsyo3WiOUPm03d7+U4U=
@@ -1137,9 +1139,11 @@ yunion.io/x/pkg v0.0.0-20190620104149-945c25821dbf/go.mod h1:t6rEGG2sQ4J7DhFxSZV
yunion.io/x/pkg v0.0.0-20190628082551-f4033ba2ea30/go.mod h1:t6rEGG2sQ4J7DhFxSZVOTjNd0YO/KlfWQyK1W4tog+E=
yunion.io/x/pkg v0.0.0-20200814072949-4f1b541857d6 h1:UarEDTBGkgcgc+nc+PZ75uo9M9+jiOGd5P2B90TxDNw=
yunion.io/x/pkg v0.0.0-20200814072949-4f1b541857d6/go.mod h1:t6rEGG2sQ4J7DhFxSZVOTjNd0YO/KlfWQyK1W4tog+E=
yunion.io/x/pkg v0.0.0-20201028134817-3ed15ee169bc h1:cgwWI6k9LsXpq6yiOuEIprsXmPyPGUa60sOZu57e8Jo=
yunion.io/x/pkg v0.0.0-20201028134817-3ed15ee169bc/go.mod h1:t6rEGG2sQ4J7DhFxSZVOTjNd0YO/KlfWQyK1W4tog+E=
yunion.io/x/s3cli v0.0.0-20190917004522-13ac36d8687e h1:v+EzIadodSwkdZ/7bremd7J8J50Cise/HCylsOJngmo=
yunion.io/x/s3cli v0.0.0-20190917004522-13ac36d8687e/go.mod h1:0iFKpOs1y4lbCxeOmq3Xx/0AcQoewVPwj62eRluioEo=
yunion.io/x/sqlchemy v0.0.0-20201009235752-2ef1a29656b0 h1:ETDt3Xc3a6WnbHvhrMUemXVsnWY/RgHrsNRCVFWkCYo=
yunion.io/x/sqlchemy v0.0.0-20201009235752-2ef1a29656b0/go.mod h1:FTdwPdGhMgh4E+UFXc9klI1Ok34fMuybTT+jLhOaIjI=
yunion.io/x/sqlchemy v0.0.0-20201029091740-cd5e77b56d4b h1:xBAzDPvvmsOBjxAj0PLHMNLVdPNOlYFHAm7T3IZ2ehs=
yunion.io/x/sqlchemy v0.0.0-20201029091740-cd5e77b56d4b/go.mod h1:FTdwPdGhMgh4E+UFXc9klI1Ok34fMuybTT+jLhOaIjI=
yunion.io/x/structarg v0.0.0-20200720093445-9f850fa222ce h1:kU8xE7O5uZ1GSJVMZHoJ+jrNL7csUQHYGyAPW9QfNpE=
yunion.io/x/structarg v0.0.0-20200720093445-9f850fa222ce/go.mod h1:EP6NSv2C0zzqBDTKumv8hPWLb3XvgMZDHQRfyuOrQng=

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -383,7 +383,9 @@ func (mh *MiscHandler) DoBatchUserRegister(ctx context.Context, w http.ResponseW
return
} else {
names[name+"/"+domainId] = true
_, err := modules.UsersV3.Get(s, name, nil)
params := jsonutils.NewDict()
params.Set("domain_id", jsonutils.NewString(domainId))
_, err := modules.UsersV3.Get(s, name, params)
if err == nil {
continue
}

View File

@@ -71,6 +71,8 @@ const (
CLOUD_ACCESS_ENV_AZURE_CHINA = CLOUD_PROVIDER_AZURE
CLOUD_ACCESS_ENV_HUAWEI_GLOBAL = CLOUD_PROVIDER_HUAWEI + "-int"
CLOUD_ACCESS_ENV_HUAWEI_CHINA = CLOUD_PROVIDER_HUAWEI
CLOUD_ACCESS_ENV_ALIYUN_GLOBAL = CLOUD_PROVIDER_ALIYUN
CLOUD_ACCESS_ENV_ALIYUN_FINANCE = CLOUD_PROVIDER_ALIYUN + "-fin"
CLOUD_ACCESS_ENV_CTYUN_CHINA = CLOUD_PROVIDER_CTYUN
)

View File

@@ -24,12 +24,13 @@ type DBInstanceCreateInput struct {
apis.VirtualResourceCreateInput
DeletePreventableCreateInput
// Ip子网名称或Id,建议使用Id
// Ip子网Id
// 谷歌云并不实际使用Ip子网,仅仅通过Ip子网确定Vpc
// required: true
Network string `json:"network"`
NetworkId string `json:"network_id"`
// swagger:ignore
NetworkId string
Network string `json:"network" yunion-deprecated-by:"network_id"`
// Ip子网内的地址,不填则按照ip子网的地址分配策略分配一个ip
// required: false
@@ -66,8 +67,10 @@ type DBInstanceCreateInput struct {
// swagger:ignore
CloudregionId string
VpcId string `json:"vpc_id"`
// swagger:ignore
VpcId string
Vpc string `json:"vpc" yunion-deprecated-by:"vpc_id"`
// swagger:ignore
ManagerId string
@@ -142,6 +145,9 @@ type DBInstanceCreateInput struct {
// required: true
DiskSizeGB int `json:"disk_size_gb"`
// 指定连接端口
Port int `json:"port"`
// rds初始化密码
// 阿里云不需要此参数
// 华为云会默认创建一个用户,若不传此参数, 则为随机密码
@@ -163,6 +169,9 @@ type DBInstanceCreateInput struct {
// swagger:ignore
Provider string
// 从备份中创建新实例
DBInstancebackupId string `json:"dbinstancebackup_id"`
}
type SDBInstanceChangeConfigInput struct {

View File

@@ -98,6 +98,9 @@ type ServerListInput struct {
SrcMacCheck *bool `json:"src_mac_check"`
InstanceType []string `json:"instance_type"`
// 是否调度到宿主机上
WithHost *bool `json:"with_host"`
}
func (input *ServerListInput) AfterUnmarshal() {
@@ -409,3 +412,21 @@ type GuestAddSecgroupInput struct {
// | 其他 | 5 |
SecgroupIds []string `json:"secgroup_ids"`
}
type ServerRemoteUpdateInput struct {
// 是否覆盖替换所有标签
ReplaceTags *bool `json:"replace_tags" help:"replace all remote tags"`
}
type ServerAssociateEipInput struct {
// swagger:ignore
// Deprecated
Eip string `json:"eip" yunion-deprecated-by:"eip_id"`
// 弹性公网IP的ID
EipId string `json:"eip_id"`
}
type ServerDissociateEipInput struct {
// 是否自动释放
AudoDelete *bool `json:"auto_delete"`
}

View File

@@ -61,6 +61,9 @@ type CachedimageListInput struct {
// filter by host schedtag
HostSchedtagId string `json:"host_schedtag_id"`
// valid cachedimage
Valid *bool `json:"valid"`
}
type ExternalProjectListInput struct {

View File

@@ -18,6 +18,7 @@ import "yunion.io/x/onecloud/pkg/apis"
type SecurityGroupCacheDetails struct {
apis.StatusStandaloneResourceDetails
apis.ProjectizedResourceInfo
ManagedResourceInfo
CloudregionResourceInfo
@@ -25,4 +26,6 @@ type SecurityGroupCacheDetails struct {
// 虚拟私有网络名称
Vpc string `json:"vpc"`
ProjectId string `json:"tenant_id"`
}

View File

@@ -74,7 +74,7 @@ type ServerSkuListInput struct {
UsableResourceListInput
// filter sku by memory size in MB
MemorySizeMb int `json:"memory_size_mb"`
MemorySizeMb []int `json:"memory_size_mb"`
// filter sku by CPU core count
CpuCoreCount []int `json:"cpu_core_count"`

View File

@@ -21,10 +21,10 @@ type SnapshotPolicyDetails struct {
SSnapshotPolicy
RetentionDays int `json:"retention_days"`
RepeatWeekdays []int `json:"repeat_weekdays"`
TimePoints []int `json:"time_points"`
IsActivated *bool `json:"is_activated,omitempty"`
RetentionDays int `json:"retention_days"`
RepeatWeekdaysDisplay []int `json:"repeat_weekdays_display"`
TimePointsDisplay []int `json:"time_points_display"`
IsActivated *bool `json:"is_activated,omitempty"`
BindingDiskCount int `json:"binding_disk_count"`
}

View File

@@ -55,7 +55,8 @@ const (
STORAGE_LOCAL_SSD = "local_ssd"
STORAGE_LOCAL_PRO = "local_pro"
STORAGE_CLOUD_BASIC = "cloud_basic"
STORAGE_CLOUD_PREMIUM = "cloud_premium"
STORAGE_CLOUD_PREMIUM = "cloud_premium" //高性能云硬盘
STORAGE_CLOUD_HSSD = "cloud_hssd" //增强型SSD云硬盘
// huawei storage type
STORAGE_HUAWEI_SSD = "SSD" // 超高IO云硬盘
@@ -81,6 +82,7 @@ const (
STORAGE_GOOGLE_LOCAL_SSD = "local-ssd" //本地SSD暂存盘 (最多8个)
STORAGE_GOOGLE_PD_STANDARD = "pd-standard" //标准永久性磁盘
STORAGE_GOOGLE_PD_SSD = "pd-ssd" //SSD永久性磁盘
STORAGE_GOOGLE_PD_BALANCED = "pd-balanced" //平衡永久性磁盘
// ctyun storage type
STORAGE_CTYUN_SSD = "SSD" // 超高IO云硬盘
@@ -186,4 +188,7 @@ type StorageListInput struct {
// filter by host schedtag
HostSchedtagId string `json:"host_schedtag_id"`
// filter by cachedimage
ImageId string `json:"image_id"`
}

View File

@@ -202,3 +202,19 @@ var (
},
}
)
func mergeConfigOptionsFrom(opt1, opt2 map[string][]string) map[string][]string {
for opt, values := range opt2 {
ovalues, _ := opt1[opt]
opt1[opt] = append(ovalues, values...)
}
return opt1
}
func MergeServiceConfigOptions(opts ...map[string][]string) map[string][]string {
ret := make(map[string][]string)
for i := range opts {
ret = mergeConfigOptionsFrom(ret, opts[i])
}
return ret
}

View File

@@ -199,12 +199,15 @@ type MetadataResourceListInput struct {
// 返回资源的标签不包含用户标签
WithoutUserMeta *bool `json:"without_user_meta"`
// 返回资源的标签包含用户标签
// 返回包含用户标签的资源
WithUserMeta *bool `json:"with_user_meta"`
// 返回资源的标签包含外部标签
// 返回包含外部标签的资源
WithCloudMeta *bool `json:"with_cloud_meta"`
// 返回包含任意标签的资源
WithAnyMeta *bool `json:"with_any_meta"`
// 返回列表数据中包含资源的标签数据Metadata
WithMeta *bool `json:"with_meta"`
}

View File

@@ -34,11 +34,13 @@ type AlertRecordCreateInput struct {
type AlertRecordRule struct {
Metric string `json:"metric"`
Measurement string `json:"measurement"`
MeasurementDesc string `json:"measurement_desc"`
Field string `json:"field"`
FieldDesc string `json:"field_desc"`
// 比较运算符, 比如: >, <, >=, <=
Comparator string `json:"comparator"`
// 报警阀值
Threshold float64 `json:"threshold"`
Period string `json:"period"`
Threshold string `json:"threshold"`
Period string `json:"period"`
}

View File

@@ -0,0 +1,77 @@
// Copyright 2019 Yunion
//
// 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.
package monitor
import (
"yunion.io/x/onecloud/pkg/apis"
)
type AlertResourceType string
const (
// AlertResourceTypeNode means onecloud system infrastructure controller or host node
AlertResourceTypeNode AlertResourceType = "node"
// AlertResourceTypeCloudaccount means cloudaccount resource
AlertResourceTypeCloudaccount AlertResourceType = "cloudaccount"
// AlertResourceTypeVM means virtual machine guest resource
// AlertResourceTypeVM AlertResourceType = "vm"
)
type AlertResourceCreateInput struct {
apis.StandaloneResourceCreateInput
Type AlertResourceType `json:"type"`
}
type AlertResourceListInput struct {
apis.StandaloneResourceListInput
Type string `json:"type"`
}
type AlertResourceAttachInput struct {
apis.Meta
AlertResourceId string `json:"alert_resource_id"`
AlertId string `json:"alert_id"`
AlertRecordId string `json:"alert_record_id"`
Data EvalMatch `json:"data"`
}
type AlertResourceDetails struct {
apis.StandaloneResourceDetails
Count int `json:"count"`
Tags map[string]string `json:"tags"`
}
type AlertResourceAlertListInput struct {
apis.JointResourceBaseListInput
AlertResourceId string `json:"alert_resource_id"`
AlertId string `json:"alert_id"`
}
type AlertResourceJointBaseDetails struct {
apis.JointResourceBaseDetails
AlertResource string `json:"alert_resource"`
Type AlertResourceType `json:"type"`
}
type AlertResourceAlertDetails struct {
AlertResourceJointBaseDetails
Alert string `json:"alert"`
AlertType string `json:"alert_type"`
Level string `json:"level"`
CommonAlertMetricDetails []*CommonAlertMetricDetails `json:"common_alert_metric_details"`
}

View File

@@ -86,6 +86,8 @@ type CommonAlertUpdateInput struct {
Channel []string `json:"channel"`
// 通知接受者
Recipients []string `json:"recipients"`
// systemalert policy may need update through operator
ForceUpdate bool `json:"force_update"`
}
type CommonAlertDetails struct {
@@ -105,13 +107,14 @@ type CommonAlertMetricDetails struct {
Comparator string `json:"comparator"`
Threshold float64 `json:"threshold"`
// metric points'value的运算方式
Reduce string `json:"reduce"`
DB string `json:"db"`
Measurement string `json:"measurement"`
MeasurementDisplayName string `json:"measurement_display_name"`
ResType string `json:"res_type"`
Field string `json:"field"`
Groupby string `json:"groupby"`
Reduce string `json:"reduce"`
DB string `json:"db"`
Measurement string `json:"measurement"`
MeasurementDisplayName string `json:"measurement_display_name"`
ResType string `json:"res_type"`
Field string `json:"field"`
Groupby string `json:"groupby"`
Filters []MetricQueryTag `json:"filters"`
FieldDescription MetricFieldDetail
FieldOpt string `json:"field_opt"`
}

View File

@@ -19,9 +19,10 @@ type NotificationTemplateCreateInput struct {
}
type NotificationTemplateConfig struct {
Title string `json:"title"`
Name string `json:"name"`
Matches []EvalMatch `json:"matches"`
Title string `json:"title"`
Name string `json:"name"`
ResourceName string `json:"resource_name"`
Matches []EvalMatch `json:"matches"`
// PrevAlertState AlertStateType `json:"prev_alert_state"`
// State AlertStateType `json:"state"`
NoDataFound bool `json:"no_data"`

View File

@@ -41,8 +41,11 @@ type MetricFunc struct {
}
type MetricInputQuery struct {
From string `json:"from"`
To string `json:"to"`
From string `json:"from"`
To string `json:"to"`
Scope string `json:"scope"`
//default group by
Unit bool `json:"unit"`
Interval string `json:"interval"`
DomainId string `json:"domain_id"`
ProjectId string `json:"project_id"`

View File

@@ -29,6 +29,7 @@ const (
FEISHU_ROBOT = "feishu-robot"
DINGTALK_ROBOT = "dingtalk-robot"
WORKWX_ROBOT = "workwx-robot"
WEBHOOK = "webhook"
ROBOT = "robot"
@@ -60,4 +61,7 @@ const (
TEMPLATE_TYPE_TITLE = "title"
TEMPLATE_TYPE_CONTENT = "content"
TEMPLATE_TYPE_REMOTE = "remote"
CTYPE_ROBOT_YES = "yes"
CTYPE_ROBOT_ONLY = "only"
)

View File

@@ -24,7 +24,6 @@ import (
"yunion.io/x/onecloud/pkg/baremetal/utils/raid/drivers"
"yunion.io/x/onecloud/pkg/cloudcommon/types"
"yunion.io/x/onecloud/pkg/compute/baremetal"
"yunion.io/x/onecloud/pkg/util/ssh"
"yunion.io/x/onecloud/pkg/util/sysutils"
)
@@ -48,7 +47,7 @@ func GetRaidLogicVolumes(drv raid.IRaidDriver) ([]*raid.RaidLogicalVolume, error
return lvs, nil
}
func DetectStorageInfo(term *ssh.Client, wait bool) ([]*baremetal.BaremetalStorage, []*baremetal.BaremetalStorage, []*baremetal.BaremetalStorage, error) {
func DetectStorageInfo(term raid.IExecTerm, wait bool) ([]*baremetal.BaremetalStorage, []*baremetal.BaremetalStorage, []*baremetal.BaremetalStorage, error) {
raidDiskInfo := make([]*baremetal.BaremetalStorage, 0)
lvDiskInfo := make([]*raid.RaidLogicalVolume, 0)

View File

@@ -29,10 +29,9 @@ import (
_ "yunion.io/x/onecloud/pkg/baremetal/utils/raid/mvcli"
_ "yunion.io/x/onecloud/pkg/baremetal/utils/raid/sas2iru"
"yunion.io/x/onecloud/pkg/compute/baremetal"
"yunion.io/x/onecloud/pkg/util/ssh"
)
func GetDriver(name string, term *ssh.Client) raid.IRaidDriver {
func GetDriver(name string, term raid.IExecTerm) raid.IRaidDriver {
factory := raid.RaidDrivers[name]
if factory == nil {
return nil
@@ -40,7 +39,15 @@ func GetDriver(name string, term *ssh.Client) raid.IRaidDriver {
return factory(term)
}
func GetDriverWithInit(name string, term *ssh.Client) (raid.IRaidDriver, error) {
func GetLocalDriver(name string) raid.IRaidDriver {
factory := raid.RaidDrivers[name]
if factory == nil {
return nil
}
return factory(NewExecutor())
}
func GetDriverWithInit(name string, term raid.IExecTerm) (raid.IRaidDriver, error) {
drv := GetDriver(name, term)
if drv == nil {
return nil, errors.Errorf("Not found raid driver %q", name)
@@ -48,7 +55,7 @@ func GetDriverWithInit(name string, term *ssh.Client) (raid.IRaidDriver, error)
return drv, drv.ParsePhyDevs()
}
func GetDriverByKernelModule(module string, term *ssh.Client) (raid.IRaidDriver, error) {
func GetDriverByKernelModule(module string, term raid.IExecTerm) (raid.IRaidDriver, error) {
name := ""
switch module {
case raid.MODULE_MEGARAID:
@@ -64,7 +71,7 @@ func GetDriverByKernelModule(module string, term *ssh.Client) (raid.IRaidDriver,
return GetDriverWithInit(name, term)
}
func GetDrivers(term *ssh.Client) []raid.IRaidDriver {
func GetDrivers(term raid.IExecTerm) []raid.IRaidDriver {
ret := []raid.IRaidDriver{}
for _, factory := range raid.RaidDrivers {
ret = append(ret, factory(term))

View File

@@ -0,0 +1,56 @@
package drivers
import (
"bytes"
"fmt"
"io"
"os/exec"
"yunion.io/x/log"
"yunion.io/x/pkg/errors"
"yunion.io/x/onecloud/pkg/util/ssh"
)
type Executor struct{}
func (e *Executor) Run(cmds ...string) ([]string, error) {
return e.run(true, cmds, nil)
}
func (e *Executor) RunWithInput(input io.Reader, cmds ...string) ([]string, error) {
return e.run(true, cmds, input)
}
func (e *Executor) run(parseOutput bool, cmds []string, input io.Reader) ([]string, error) {
ret := []string{}
for _, cmd := range cmds {
log.Debugf("Run command: %s", cmd)
proc := exec.Command("sh", "-c", cmd)
var stdOut bytes.Buffer
var stdErr bytes.Buffer
proc.Stdout = &stdOut
proc.Stderr = &stdErr
proc.Stdin = input
if err := proc.Run(); err != nil {
var outputErr error
errMsg := stdErr.String()
if len(stdOut.String()) != 0 {
errMsg = fmt.Sprintf("%s %s", errMsg, stdOut.String())
}
outputErr = errors.Error(errMsg)
err = errors.Wrapf(outputErr, "%q error: %v, cmd error", cmd, err)
return nil, err
}
if parseOutput {
ret = append(ret, ssh.ParseOutput(stdOut.Bytes())...)
} else {
ret = append(ret, stdOut.String())
}
}
return ret, nil
}
func NewExecutor() *Executor {
return new(Executor)
}

View File

@@ -31,7 +31,6 @@ import (
"yunion.io/x/onecloud/pkg/baremetal/utils/raid"
"yunion.io/x/onecloud/pkg/compute/baremetal"
"yunion.io/x/onecloud/pkg/util/regutils2"
"yunion.io/x/onecloud/pkg/util/ssh"
)
type HPSARaidPhyDev struct {
@@ -347,11 +346,11 @@ func (adapter *HPSARaidAdaptor) RemoveLogicVolumes() error {
}
type HPSARaid struct {
term *ssh.Client
term raid.IExecTerm
adapters []*HPSARaidAdaptor
}
func NewHPSARaid(term *ssh.Client) raid.IRaidDriver {
func NewHPSARaid(term raid.IExecTerm) raid.IRaidDriver {
return &HPSARaid{
term: term,
adapters: make([]*HPSARaidAdaptor, 0),

View File

@@ -15,6 +15,8 @@
package raid
import (
"io"
api "yunion.io/x/onecloud/pkg/apis/compute"
"yunion.io/x/onecloud/pkg/compute/baremetal"
)
@@ -41,3 +43,8 @@ type IRaidAdapter interface {
BuildRaid10(devs []*baremetal.BaremetalStorage, conf *api.BaremetalDiskConfig) error
BuildNoneRaid(devs []*baremetal.BaremetalStorage) error
}
type IExecTerm interface {
Run(cmds ...string) ([]string, error)
RunWithInput(input io.Reader, cmds ...string) ([]string, error)
}

View File

@@ -27,10 +27,10 @@ import (
"yunion.io/x/pkg/utils"
api "yunion.io/x/onecloud/pkg/apis/compute"
"yunion.io/x/onecloud/pkg/baremetal/utils/raid"
raiddrivers "yunion.io/x/onecloud/pkg/baremetal/utils/raid"
"yunion.io/x/onecloud/pkg/compute/baremetal"
"yunion.io/x/onecloud/pkg/util/regutils2"
"yunion.io/x/onecloud/pkg/util/ssh"
)
var (
@@ -320,7 +320,7 @@ func (adapter *MegaRaidAdaptor) GetIndex() int {
return adapter.index
}
func (adapter *MegaRaidAdaptor) getTerm() *ssh.Client {
func (adapter *MegaRaidAdaptor) getTerm() raid.IExecTerm {
return adapter.raid.term
}
@@ -376,7 +376,7 @@ func (adapter *MegaRaidAdaptor) parseLogicVolumes(lines []string) ([]*raiddriver
return lvs, nil
}
func getLogicVolumeDeviceById(hostNum, scsiId int, term *ssh.Client) (string, error) {
func getLogicVolumeDeviceById(hostNum, scsiId int, term raid.IExecTerm) (string, error) {
items, err := raiddrivers.SGMap(term)
if err != nil {
return "", err
@@ -892,13 +892,13 @@ func (adapter *MegaRaidAdaptor) clearJBODDisks() {
}
type MegaRaid struct {
term *ssh.Client
term raid.IExecTerm
adapters []*MegaRaidAdaptor
PhyDevsCnt int
Capacity int64
}
func NewMegaRaid(term *ssh.Client) raiddrivers.IRaidDriver {
func NewMegaRaid(term raid.IExecTerm) raiddrivers.IRaidDriver {
return &MegaRaid{
term: term,
adapters: make([]*MegaRaidAdaptor, 0),

View File

@@ -25,7 +25,6 @@ import (
api "yunion.io/x/onecloud/pkg/apis/compute"
"yunion.io/x/onecloud/pkg/baremetal/utils/raid"
"yunion.io/x/onecloud/pkg/compute/baremetal"
"yunion.io/x/onecloud/pkg/util/ssh"
)
type MarvelRaidPhyDev struct {
@@ -243,11 +242,11 @@ func (adapter *MarvelRaidAdaptor) BuildNoneRaid(devs []*baremetal.BaremetalStora
}
type MarvelRaid struct {
term *ssh.Client
term raid.IExecTerm
adapters []*MarvelRaidAdaptor
}
func NewMarvelRaid(term *ssh.Client) raid.IRaidDriver {
func NewMarvelRaid(term raid.IExecTerm) raid.IRaidDriver {
return &MarvelRaid{
term: term,
adapters: make([]*MarvelRaidAdaptor, 0),

View File

@@ -24,7 +24,6 @@ import (
"yunion.io/x/onecloud/pkg/apis/compute"
"yunion.io/x/onecloud/pkg/compute/baremetal"
"yunion.io/x/onecloud/pkg/util/ssh"
"yunion.io/x/onecloud/pkg/util/sysutils"
)
@@ -45,7 +44,7 @@ const (
UnknownLogicalVolumeIndex = MaxInt
)
type RaidDriverFactory func(term *ssh.Client) IRaidDriver
type RaidDriverFactory func(term IExecTerm) IRaidDriver
type sRaidDrivers map[string]RaidDriverFactory
@@ -106,7 +105,7 @@ func (dev *RaidBasePhyDev) ToBaremetalStorage(index int) *baremetal.BaremetalSto
}
}
func GetModules(term *ssh.Client) []string {
func GetModules(term IExecTerm) []string {
ret := []string{}
lines, err := term.Run("/sbin/lsmod")
if err != nil {
@@ -142,7 +141,7 @@ type RaidLogicalVolume struct {
BlockDev string
}
func SGMap(term *ssh.Client) ([]compute.SGMapItem, error) {
func SGMap(term IExecTerm) ([]compute.SGMapItem, error) {
lines, err := term.Run("/usr/bin/sg_map -x")
if err != nil {
return nil, errors.Wrap(err, "run sg_map")

View File

@@ -26,7 +26,6 @@ import (
api "yunion.io/x/onecloud/pkg/apis/compute"
"yunion.io/x/onecloud/pkg/baremetal/utils/raid"
"yunion.io/x/onecloud/pkg/compute/baremetal"
"yunion.io/x/onecloud/pkg/util/ssh"
)
type Mpt2SASRaidPhyDev struct {
@@ -307,12 +306,12 @@ func (adapter *Mpt2SASRaidAdaptor) RemoveLogicVolumes() error {
}
type Mpt2SASRaid struct {
term *ssh.Client
term raid.IExecTerm
utility string
adapters []*Mpt2SASRaidAdaptor
}
func NewMpt2SASRaid(term *ssh.Client) raid.IRaidDriver {
func NewMpt2SASRaid(term raid.IExecTerm) raid.IRaidDriver {
return &Mpt2SASRaid{
term: term,
adapters: make([]*Mpt2SASRaidAdaptor, 0),

View File

@@ -30,6 +30,7 @@ type SEndpointChangeManager struct {
func newEndpointChangeManager() *SEndpointChangeManager {
man := &SEndpointChangeManager{}
man.InitSync(man)
man.FirstSync()
return man
}

View File

@@ -301,6 +301,7 @@ func FetchCustomizeColumns(
retVal := make([]*jsonutils.JSONDict, ret[0].Len())
for i := 0; i < ret[0].Len(); i += 1 {
jsonDict := ValueToJSONDict(ret[0].Index(i))
// NOTE: don't use obj update jsonDict as retval
jsonDict.Update(jsonutils.Marshal(objs[i]).(*jsonutils.JSONDict))
retVal[i] = jsonDict
}

View File

@@ -928,6 +928,12 @@ func (dispatcher *DBModelDispatcher) Get(ctx context.Context, idStr string, quer
if err != nil {
return nil, err
} else if data != nil {
if dataDict, ok := data.(*jsonutils.JSONDict); ok {
i18nDict := dispatcher.modelManager.GetI18N(ctx, idStr, data)
if i18nDict != nil {
dataDict.Set("_i18n", i18nDict)
}
}
return data, nil
}

View File

@@ -107,12 +107,7 @@ func (manager *SDomainizedResourceBaseManager) ListItemFilter(
) (*sqlchemy.SQuery, error) {
if len(query.ProjectDomainIds) > 0 {
// make sure ids are not utf8 string
idList := make([]string, 0)
for _, pid := range query.ProjectDomainIds {
if !stringutils2.IsUtf8(pid) {
idList = append(idList, pid)
}
}
idList := stringutils2.RemoveUtf8Strings(query.ProjectDomainIds)
tenants := TenantCacheManager.GetDomainQuery().SubQuery()
subq := tenants.Query(tenants.Field("id")).Filter(sqlchemy.OR(
sqlchemy.In(tenants.Field("id"), idList),

View File

@@ -201,6 +201,9 @@ func (model *SDomainLevelResourceBase) PerformChangeOwner(ctx context.Context, u
}
}
// cancel usage
model.cleanModelUsages(ctx, userCred)
_, err = Update(model, func() error {
model.DomainId = ownerId.GetProjectDomainId()
model.DomainSrc = string(apis.OWNER_SOURCE_LOCAL)
@@ -210,6 +213,9 @@ func (model *SDomainLevelResourceBase) PerformChangeOwner(ctx context.Context, u
return nil, errors.Wrap(err, "Update")
}
// add usage
model.RecoverUsages(ctx, userCred)
OpsLog.SyncOwner(model, former, userCred)
notes := struct {
OldDomainId string

View File

@@ -127,6 +127,8 @@ type IModelManager interface {
QueryDistinctExtraField(q *sqlchemy.SQuery, field string) (*sqlchemy.SQuery, error)
GetPagingConfig() *SPagingConfig
GetI18N(ctx context.Context, idstr string, resObj jsonutils.JSONObject) *jsonutils.JSONDict
}
type IModel interface {
@@ -246,6 +248,10 @@ type IMetadataBaseModelManager interface {
GetMetadataHiddenKeys() []string
}
type IMetadataBaseModel interface {
OnMetadataUpdated(ctx context.Context, userCred mcclient.TokenCredential)
}
type IStandaloneModelManager interface {
IResourceModelManager
@@ -282,6 +288,8 @@ type IStandaloneModel interface {
GetAllMetadata(userCred mcclient.TokenCredential) (map[string]string, error)
IsShared() bool
IMetadataBaseModel
}
type IDomainLevelModelManager interface {

View File

@@ -34,7 +34,7 @@ import (
type SJointResourceBase struct {
SResourceBase
RowId int64 `primary:"true" auto_increment:"true"`
RowId int64 `primary:"true" auto_increment:"true" list:"user"`
}
type SJointResourceBaseManager struct {

View File

@@ -26,7 +26,8 @@ func TestEctdLockManager(t *testing.T) {
shared := newSharedObject()
for i := 0; i < 4; i++ {
lockman, err := NewEtcdLockManager(&SEtcdLockManagerConfig{
Endpoints: []string{"localhost:2379"},
LockPrefix: "test-etcd-lock-manager",
Endpoints: []string{"localhost:2379"},
})
if err != nil {
t.Skipf("new etcd lockman: %v", err)

View File

@@ -492,6 +492,7 @@ func (manager *SMetadataManager) SetValues(ctx context.Context, obj IModel, stor
}
newRecord := SMetadata{}
newRecord.SetModelManager(manager, &newRecord)
newRecord.ObjId = obj.GetId()
newRecord.ObjType = obj.GetModelManager().Keyword()

View File

@@ -90,10 +90,10 @@ func (meta *SMetadataResourceBaseModelManager) ListItemFilter(
}
}
if input.WithMeta != nil {
if input.WithAnyMeta != nil {
metadatas := Metadata.Query().Equals("obj_type", manager.Keyword()).SubQuery()
sq := metadatas.Query(metadatas.Field("obj_id")).Distinct().SubQuery()
if *input.WithMeta {
if *input.WithAnyMeta {
q = q.Filter(sqlchemy.In(q.Field("id"), sq))
} else {
q = q.Filter(sqlchemy.NotIn(q.Field("id"), sq))

View File

@@ -359,14 +359,15 @@ func (manager *SModelBaseManager) GetPropertyDistinctField(ctx context.Context,
}
}
var res = jsonutils.NewDict()
q := im.Query()
q, err = ListItemQueryFilters(im, ctx, q, userCred, query, policy.PolicyActionList)
if err != nil {
return nil, err
}
var backupQuery = *q
var (
backupQuery = *q
res = jsonutils.NewDict()
)
// query field
for i := 0; i < len(fields); i++ {
var nq = backupQuery
@@ -424,6 +425,10 @@ func (manager *SModelBaseManager) OnCreateFailed(ctx context.Context, userCred m
return nil
}
func (manager *SModelBaseManager) GetI18N(ctx context.Context, idstr string, resObj jsonutils.JSONObject) *jsonutils.JSONDict {
return nil
}
func (model *SModelBase) GetId() string {
return ""
}
@@ -543,17 +548,24 @@ func (model *SModelBase) CustomizeDelete(ctx context.Context, userCred mcclient.
return nil
}
func cleanModelUsages(ctx context.Context, userCred mcclient.TokenCredential, model IModel) {
func (model *SModelBase) cleanModelUsages(ctx context.Context, userCred mcclient.TokenCredential) {
usages := model.GetIModel().GetUsages()
if CancelUsages != nil && len(usages) > 0 {
CancelUsages(ctx, userCred, usages)
}
}
func (model *SModelBase) RecoverUsages(ctx context.Context, userCred mcclient.TokenCredential) {
usages := model.GetIModel().GetUsages()
if AddUsages != nil && len(usages) > 0 {
AddUsages(ctx, userCred, usages)
}
}
func (model *SModelBase) PreDelete(ctx context.Context, userCred mcclient.TokenCredential) {
// clean usage on predelete
// clean usage before fakedelete for pending delete models
cleanModelUsages(ctx, userCred, model)
model.cleanModelUsages(ctx, userCred)
}
func (model *SModelBase) PostDelete(ctx context.Context, userCred mcclient.TokenCredential) {

View File

@@ -87,14 +87,17 @@ func alterNameValidator(model IModel, name string) error {
return nil
}
func GenerateAlertName(model IModel, hint string) (string, error) {
return GenerateName2(model.GetModelManager(), nil, hint, model, 1)
}
func GenerateName(manager IModelManager, ownerId mcclient.IIdentityProvider, hint string) (string, error) {
return GenerateName2(manager, ownerId, hint, nil, 1)
}
func GenerateAlterName(model IModel, hint string) (string, error) {
if hint == model.GetName() {
return hint, nil
}
return GenerateName2(nil, nil, hint, model, 1)
}
func GenerateName2(manager IModelManager, ownerId mcclient.IIdentityProvider, hint string, model IModel, baseIndex int) (string, error) {
_, pattern, patternLen := stringutils.ParseNamePattern(hint)
var name string

View File

@@ -45,31 +45,29 @@ type SOpsLogManager struct {
type SOpsLog struct {
SModelBase
Id int64 `primary:"true" auto_increment:"true" list:"user"` // = Column(BigInteger, primary_key=True)
ObjType string `width:"40" charset:"ascii" nullable:"false" list:"user" create:"required"` // = Column(VARCHAR(40, charset='ascii'), nullable=False)
ObjId string `width:"128" charset:"ascii" nullable:"false" list:"user" create:"required" index:"true"` // = Column(VARCHAR(ID_LENGTH, charset='ascii'), nullable=False)
ObjName string `width:"128" charset:"utf8" nullable:"false" list:"user" create:"required"` //= Column(VARCHAR(128, charset='utf8'), nullable=False)
Action string `width:"32" charset:"utf8" nullable:"false" list:"user" create:"required"` //= Column(VARCHAR(32, charset='ascii'), nullable=False)
Id int64 `primary:"true" auto_increment:"true" list:"user"`
ObjType string `width:"40" charset:"ascii" nullable:"false" list:"user" create:"required"`
ObjId string `width:"128" charset:"ascii" nullable:"false" list:"user" create:"required" index:"true"`
ObjName string `width:"128" charset:"utf8" nullable:"false" list:"user" create:"required"`
Action string `width:"32" charset:"utf8" nullable:"false" list:"user" create:"required"`
Notes string `charset:"utf8" list:"user" create:"required"`
ProjectId string `name:"tenant_id" width:"128" charset:"ascii" list:"user" create:"required" index:"true"` // = Column(VARCHAR(ID_LENGTH, charset='ascii'))
Project string `name:"tenant" width:"128" charset:"utf8" list:"user" create:"required"` // tenant = Column(VARCHAR(128, charset='utf8'))
ProjectId string `name:"tenant_id" width:"128" charset:"ascii" list:"user" create:"optional" index:"true"`
Project string `name:"tenant" width:"128" charset:"utf8" list:"user" create:"optional"`
ProjectDomainId string `name:"project_domain_id" default:"default" width:"128" charset:"ascii" list:"user" create:"required"`
ProjectDomain string `name:"project_domain" default:"Default" width:"128" charset:"utf8" list:"user" create:"required"`
ProjectDomainId string `name:"project_domain_id" default:"default" width:"128" charset:"ascii" list:"user" create:"optional"`
ProjectDomain string `name:"project_domain" default:"Default" width:"128" charset:"utf8" list:"user" create:"optional"`
UserId string `width:"128" charset:"ascii" list:"user" create:"required"` // = Column(VARCHAR(ID_LENGTH, charset='ascii'))
User string `width:"128" charset:"utf8" list:"user" create:"required"` // = Column(VARCHAR(128, charset='utf8'))
UserId string `width:"128" charset:"ascii" list:"user" create:"required"`
User string `width:"128" charset:"utf8" list:"user" create:"required"`
DomainId string `width:"128" charset:"ascii" list:"user" create:"optional"`
Domain string `width:"128" charset:"utf8" list:"user" create:"optional"`
Roles string `width:"64" charset:"ascii" list:"user" create:"optional"` // = Column(VARCHAR(64, charset='ascii'))
Roles string `width:"64" charset:"ascii" list:"user" create:"optional"`
// BillingType string `width:"64" charset:"ascii" default:"postpaid" list:"user" create:"user"` // billing_type = Column(VARCHAR(64, charset='ascii'), nullable=True)
OpsTime time.Time `nullable:"false" list:"user"` // = Column(DateTime, nullable=False)
OpsTime time.Time `nullable:"false" list:"user"`
OwnerDomainId string `name:"owner_domain_id" default:"default" width:"128" charset:"ascii" list:"user" create:"optional"`
OwnerProjectId string `name:"owner_tenant_id" width:"128" charset:"ascii" list:"user" create:"optional"` // = Column(VARCHAR(ID_LENGTH, charset='ascii'))
// owner_user_id = Column(VARCHAR(ID_LENGTH, charset='ascii'))
OwnerProjectId string `name:"owner_tenant_id" width:"128" charset:"ascii" list:"user" create:"optional"`
}
var OpsLog *SOpsLogManager
@@ -434,6 +432,7 @@ func (manager *SOpsLogManager) ValidateCreateData(ctx context.Context,
query jsonutils.JSONObject,
data apis.OpsLogCreateInput,
) (apis.OpsLogCreateInput, error) {
data.User = ownerId.GetUserName()
return data, nil
}

View File

@@ -29,7 +29,7 @@ func OrderByFields(q *sqlchemy.SQuery, fieldOrders []string, fields []sqlchemy.I
for i := range fields {
if sqlchemy.SQL_ORDER_ASC.Equals(fieldOrders[i]) {
q = q.Asc(fields[i])
} else {
} else if sqlchemy.SQL_ORDER_DESC.Equals(fieldOrders[i]) {
q = q.Desc(fields[i])
}
}

View File

@@ -102,12 +102,7 @@ func (manager *SProjectizedResourceBaseManager) ListItemFilter(
}
if len(query.ProjectIds) > 0 {
// make sure ids are not utf8 string
idList := make([]string, 0)
for _, pid := range query.ProjectIds {
if !stringutils2.IsUtf8(pid) {
idList = append(idList, pid)
}
}
idList := stringutils2.RemoveUtf8Strings(query.ProjectIds)
tenants := TenantCacheManager.GetTenantQuery().SubQuery()
subq := tenants.Query(tenants.Field("id")).Filter(sqlchemy.OR(
sqlchemy.In(tenants.Field("id"), idList),

View File

@@ -33,6 +33,7 @@ var (
func init() {
quotaManagerTable = make(map[reflect.Type]IQuotaManager)
db.AddUsages = AddUsages
db.CancelUsages = CancelUsages
db.CancelPendingUsagesInContext = cancelPendingUsagesInContext
db.InitPendingUsagesInContext = initPendingUsagesInContext

View File

@@ -266,32 +266,81 @@ func (model *SStandaloneResourceBase) GetMetadataJson(key string, userCred mccli
return Metadata.GetJsonValue(model, key, userCred)
}
func isUserMetadata(key string) bool {
return strings.HasPrefix(key, USER_TAG_PREFIX)
}
func containsUserMetadata(dict map[string]interface{}) bool {
for k := range dict {
if isUserMetadata(k) {
return true
}
}
return false
}
func (model *SStandaloneResourceBase) SetMetadata(ctx context.Context, key string, value interface{}, userCred mcclient.TokenCredential) error {
return Metadata.SetValue(ctx, model, key, value, userCred)
err := Metadata.SetValue(ctx, model, key, value, userCred)
if err != nil {
return errors.Wrap(err, "SetValue")
}
if isUserMetadata(key) {
model.GetIStandaloneModel().OnMetadataUpdated(ctx, userCred)
}
return nil
}
func (model *SStandaloneResourceBase) SetAllMetadata(ctx context.Context, dictstore map[string]interface{}, userCred mcclient.TokenCredential) error {
return Metadata.SetValuesWithLog(ctx, model, dictstore, userCred)
err := Metadata.SetValuesWithLog(ctx, model, dictstore, userCred)
if err != nil {
return errors.Wrap(err, "SetValuesWithLog")
}
if containsUserMetadata(dictstore) {
model.GetIStandaloneModel().OnMetadataUpdated(ctx, userCred)
}
return nil
}
func (model *SStandaloneResourceBase) SetUserMetadataValues(ctx context.Context, dictstore map[string]interface{}, userCred mcclient.TokenCredential) error {
return Metadata.SetValuesWithLog(ctx, model, dictstore, userCred)
err := Metadata.SetValuesWithLog(ctx, model, dictstore, userCred)
if err != nil {
return errors.Wrap(err, "SetValuesWithLog")
}
model.GetIStandaloneModel().OnMetadataUpdated(ctx, userCred)
return nil
}
func (model *SStandaloneResourceBase) SetUserMetadataAll(ctx context.Context, dictstore map[string]interface{}, userCred mcclient.TokenCredential) error {
return Metadata.SetAll(ctx, model, dictstore, userCred, USER_TAG_PREFIX)
err := Metadata.SetAll(ctx, model, dictstore, userCred, USER_TAG_PREFIX)
if err != nil {
return errors.Wrap(err, "SetAll")
}
model.GetIStandaloneModel().OnMetadataUpdated(ctx, userCred)
return nil
}
func (model *SStandaloneResourceBase) SetCloudMetadataAll(ctx context.Context, dictstore map[string]interface{}, userCred mcclient.TokenCredential) error {
return Metadata.SetAll(ctx, model, dictstore, userCred, CLOUD_TAG_PREFIX)
err := Metadata.SetAll(ctx, model, dictstore, userCred, CLOUD_TAG_PREFIX)
if err != nil {
return errors.Wrap(err, "SetAll")
}
return nil
}
func (model *SStandaloneResourceBase) RemoveMetadata(ctx context.Context, key string, userCred mcclient.TokenCredential) error {
return Metadata.SetValue(ctx, model, key, "", userCred)
err := Metadata.SetValue(ctx, model, key, "", userCred)
if err != nil {
return errors.Wrap(err, "SetValue")
}
return nil
}
func (model *SStandaloneResourceBase) RemoveAllMetadata(ctx context.Context, userCred mcclient.TokenCredential) error {
return Metadata.RemoveAll(ctx, model, userCred)
err := Metadata.RemoveAll(ctx, model, userCred)
if err != nil {
return errors.Wrap(err, "RemoveAll")
}
return nil
}
func (model *SStandaloneResourceBase) GetAllMetadata(userCred mcclient.TokenCredential) (map[string]string, error) {
@@ -530,3 +579,7 @@ func (model *SStandaloneResourceBase) ValidateUpdateData(ctx context.Context, us
func (model *SStandaloneResourceBase) IsShared() bool {
return false
}
func (model *SStandaloneResourceBase) OnMetadataUpdated(ctx context.Context, userCred mcclient.TokenCredential) {
// noop
}

View File

@@ -28,6 +28,8 @@ type IUsage interface {
var (
CancelUsages func(ctx context.Context, userCred mcclient.TokenCredential, usages []IUsage)
AddUsages func(ctx context.Context, userCred mcclient.TokenCredential, usages []IUsage)
CancelPendingUsagesInContext func(ctx context.Context, userCred mcclient.TokenCredential) error
InitPendingUsagesInContext func(ctx context.Context) context.Context

View File

@@ -380,6 +380,9 @@ func (model *SVirtualResourceBase) PerformChangeOwner(ctx context.Context, userC
}
}
// cancel usage
model.cleanModelUsages(ctx, userCred)
_, err = Update(model, func() error {
model.DomainId = ownerId.GetProjectDomainId()
model.ProjectId = ownerId.GetProjectId()
@@ -390,6 +393,9 @@ func (model *SVirtualResourceBase) PerformChangeOwner(ctx context.Context, userC
return nil, errors.Wrap(err, "Update")
}
// add usage
model.RecoverUsages(ctx, userCred)
OpsLog.SyncOwner(model, former, userCred)
notes := struct {
OldProjectId string
@@ -449,7 +455,10 @@ func (model *SVirtualResourceBase) AllowPerformCancelDelete(ctx context.Context,
func (model *SVirtualResourceBase) PerformCancelDelete(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) {
if model.PendingDeleted && !model.Deleted {
err := model.DoCancelPendingDelete(ctx, userCred)
return nil, err
if err != nil {
return nil, errors.Wrap(err, "model.DoCancelPendingDelete")
}
model.RecoverUsages(ctx, userCred)
}
return nil, nil
}
@@ -472,7 +481,10 @@ func (model *SVirtualResourceBase) GetIVirtualModel() IVirtualModel {
func (model *SVirtualResourceBase) CancelPendingDelete(ctx context.Context, userCred mcclient.TokenCredential) error {
if model.PendingDeleted && !model.Deleted {
return model.MarkCancelPendingDelete(ctx, userCred)
err := model.MarkCancelPendingDelete(ctx, userCred)
if err != nil {
return errors.Wrap(err, "MarkCancelPendingDelete")
}
}
return nil
}

View File

@@ -156,6 +156,10 @@ func (b *EtcdBackend) put(ctx context.Context, key, val string) error {
return b.PutWithLease(ctx, key, val, b.leaseTTL)
}
func (b *EtcdBackend) PutSession(ctx context.Context, key, val string) error {
return b.client.PutSession(ctx, key, val)
}
func (b *EtcdBackend) PutWithLease(ctx context.Context, key, val string, ttlSeconds int64) error {
return b.client.PutWithLease(ctx, key, val, ttlSeconds)
}

View File

@@ -99,7 +99,7 @@ func (b *EtcdBackendForClient) registerClientResource(ctx context.Context, key s
if err != nil {
return err
}
if err := b.PutWithLease(ctx, clientKey, "ok", 60); err != nil {
if err := b.PutSession(ctx, clientKey, "ok"); err != nil {
return err
}
return nil

View File

@@ -92,7 +92,7 @@ func Create(ctx context.Context, obj *ModelObject) error {
if !isResourceWatched(obj.KeywordPlural) {
return nil
}
return run(func(be IInformerBackend) error {
return run(ctx, func(ctx context.Context, be IInformerBackend) error {
return be.Create(ctx, obj)
})
}
@@ -101,7 +101,7 @@ func Update(ctx context.Context, obj *ModelObject, oldObj *jsonutils.JSONDict) e
if !isResourceWatched(obj.KeywordPlural) {
return nil
}
return run(func(be IInformerBackend) error {
return run(ctx, func(ctx context.Context, be IInformerBackend) error {
return be.Update(ctx, obj, oldObj)
})
}
@@ -110,7 +110,7 @@ func Delete(ctx context.Context, obj *ModelObject) error {
if !isResourceWatched(obj.KeywordPlural) {
return nil
}
return run(func(be IInformerBackend) error {
return run(ctx, func(ctx context.Context, be IInformerBackend) error {
return be.Delete(ctx, obj)
})
}

View File

@@ -15,6 +15,8 @@
package informer
import (
"context"
"yunion.io/x/log"
"yunion.io/x/onecloud/pkg/appsrv"
@@ -29,14 +31,35 @@ func init() {
informerWorkerMan = appsrv.NewWorkerManager("InformerWorkerManager", 10, 10240, false)
}
func run(f func(be IInformerBackend) error) error {
/*type noCancel struct {
ctx context.Context
}
func (c noCancel) Deadline() (time.Time, bool) {
return time.Time{}, false
}
func (c noCancel) Done() <-chan struct{} {
return nil
}
func (c noCancel) Err() error {
return nil
}
func (c noCancel) Value(key interface{}) interface{} {
return c.ctx.Value(key)
}*/
func run(ctx context.Context, f func(ctx context.Context, be IInformerBackend) error) error {
be := GetDefaultBackend()
if be == nil {
return ErrBackendNotInit
}
wf := func() {
nopanic.Run(func() {
if err := f(be); err != nil {
// outside context ignored cause of run in worker
if err := f(context.Background(), be); err != nil {
log.Errorf("run informer error: %v", err)
}
})

View File

@@ -14,6 +14,13 @@
package notifyclient
import (
"fmt"
"strings"
"yunion.io/x/onecloud/pkg/cloudcommon/db"
)
const (
SYSTEM_ERROR = "SYSTEM_ERROR"
SYSTEM_WARNING = "SYSTEM_WARNING"
@@ -28,3 +35,42 @@ const (
IMAGE_ACTIVED = "IMAGE_ACTIVED"
)
type SAction string
var (
Event SEvent
ActionCreate SAction = "create"
ActionUpdate SAction = "update"
ActionDelete SAction = "delete"
ActionRebuildRoot SAction = "rebuild_root"
ActionChangeConfig SAction = "change_config"
)
type SEvent struct {
resourceType string
action SAction
}
func (se SEvent) WithResourceType(manager db.IModelManager) SEvent {
se.resourceType = manager.Keyword()
return se
}
func (se SEvent) WithAction(a SAction) SEvent {
se.action = a
return se
}
func (se SEvent) ResourceType() string {
return se.resourceType
}
func (se SEvent) Action() string {
return string(se.action)
}
func (se SEvent) String() string {
return strings.ToUpper(fmt.Sprintf("%s_%s", se.ResourceType(), se.Action()))
}

View File

@@ -20,6 +20,7 @@ import (
"html/template"
"io/ioutil"
"path/filepath"
"regexp"
"strings"
"sync"
"time"
@@ -29,12 +30,15 @@ import (
"yunion.io/x/onecloud/pkg/appsrv"
"yunion.io/x/onecloud/pkg/cloudcommon/consts"
"yunion.io/x/onecloud/pkg/cloudcommon/db"
"yunion.io/x/onecloud/pkg/i18n"
"yunion.io/x/onecloud/pkg/mcclient"
"yunion.io/x/onecloud/pkg/mcclient/auth"
"yunion.io/x/onecloud/pkg/mcclient/modulebase"
"yunion.io/x/onecloud/pkg/mcclient/modules"
npk "yunion.io/x/onecloud/pkg/mcclient/modules/notify"
"yunion.io/x/onecloud/pkg/util/httputils"
"yunion.io/x/onecloud/pkg/util/stringutils2"
)
var (
@@ -87,7 +91,9 @@ func getTemplate(ctx context.Context, topic string, contType string, channel npk
if err != nil {
return nil, err
}
tmp, err := template.New(key).Parse(string(cont))
tmp := template.New(key)
tmp.Funcs(template.FuncMap{"unescaped": unescaped})
tmp, err = tmp.Parse(string(cont))
if err != nil {
return nil, err
}
@@ -96,7 +102,14 @@ func getTemplate(ctx context.Context, topic string, contType string, channel npk
return templatesTable[key], nil
}
func unescaped(str string) template.HTML {
return template.HTML(str)
}
func getContent(ctx context.Context, topic string, contType string, channel npk.TNotifyChannel, data jsonutils.JSONObject) (string, error) {
if channel == npk.NotifyByWebhook {
return "", nil
}
tmpl, err := getTemplate(ctx, topic, contType, channel)
if err != nil {
return "", err
@@ -110,6 +123,23 @@ func getContent(ctx context.Context, topic string, contType string, channel npk.
return buf.String(), nil
}
func NotifyWebhook(ctx context.Context, userCred mcclient.TokenCredential, obj db.IModel, action SAction) error {
ret, err := db.FetchCustomizeColumns(obj.GetModelManager(), ctx, userCred, jsonutils.NewDict(), []interface{}{obj}, stringutils2.SSortedStrings{}, false)
if err != nil {
return err
}
if len(ret) == 0 {
return fmt.Errorf("unable to get details for model %q", obj.GetId())
}
event := Event.WithAction(action).WithResourceType(obj.GetModelManager())
msg := jsonutils.NewDict()
msg.Set("resource_type", jsonutils.NewString(event.ResourceType()))
msg.Set("action", jsonutils.NewString(event.Action()))
msg.Set("resource_details", ret[0])
RawNotifyWithCtx(ctx, []string{}, false, npk.NotifyByWebhook, npk.NotifyPriorityNormal, event.String(), msg)
return nil
}
func NotifyWithCtx(ctx context.Context, recipientId []string, isGroup bool, priority npk.TNotifyPriority, event string, data jsonutils.JSONObject) {
notify(ctx, recipientId, isGroup, priority, event, data)
}
@@ -137,7 +167,16 @@ func RawNotify(recipientId []string, isGroup bool, channel npk.TNotifyChannel, p
rawNotify(context.Background(), recipientId, isGroup, channel, priority, event, data)
}
func rawNotify(ctx context.Context, recipientId []string, isGroup bool, channel npk.TNotifyChannel, priority npk.TNotifyPriority, event string, data jsonutils.JSONObject) {
// IntelliNotify try to create receiver nonexistent if createReceiver is set to true
func IntelliNotify(ctx context.Context, recipientId []string, isGroup bool, channel npk.TNotifyChannel, priority npk.TNotifyPriority, event string, data jsonutils.JSONObject, createReceiver bool) {
intelliNotify(ctx, recipientId, isGroup, channel, priority, event, data, createReceiver)
}
const noSuchReceiver = `no such receiver whose uid is '(.*)'`
var noSuchReceiverRegexp = regexp.MustCompile(noSuchReceiver)
func intelliNotify(ctx context.Context, recipientId []string, isGroup bool, channel npk.TNotifyChannel, priority npk.TNotifyPriority, event string, data jsonutils.JSONObject, createReceiver bool) {
log.Infof("notify %s event %s priority %s", recipientId, event, priority)
msg := npk.SNotifyMessage{}
if isGroup {
@@ -160,13 +199,46 @@ func rawNotify(ctx context.Context, recipientId []string, isGroup bool, channel
// log.Debugf("send notification %s %s", topic, body)
notifyClientWorkerMan.Run(func() {
s := auth.GetAdminSession(context.Background(), consts.GetRegion(), "")
err := npk.Notifications.Send(s, msg)
if err != nil {
log.Errorf("unable to send notification: %v", err)
for {
err := npk.Notifications.Send(s, msg)
if err == nil {
break
}
if !createReceiver {
log.Errorf("unable to send notification: %v", err)
break
}
jerr, ok := err.(*httputils.JSONClientError)
if !ok {
log.Errorf("unable to send notification: %v", err)
break
}
if jerr.Code > 500 {
log.Errorf("unable to send notification: %v", err)
break
}
match := noSuchReceiverRegexp.FindStringSubmatch(jerr.Details)
if match == nil || len(match) <= 1 {
log.Errorf("unable to send notification: %v", err)
break
}
receiverId := match[1]
createData := jsonutils.NewDict()
createData.Set("uid", jsonutils.NewString(receiverId))
_, err = modules.NotifyReceiver.Create(s, createData)
if err != nil {
log.Errorf("try to create receiver %q, but failed: %v", receiverId, err)
break
}
log.Infof("create receiver %q successfully", receiverId)
}
}, nil, nil)
}
func rawNotify(ctx context.Context, recipientId []string, isGroup bool, channel npk.TNotifyChannel, priority npk.TNotifyPriority, event string, data jsonutils.JSONObject) {
intelliNotify(ctx, recipientId, isGroup, channel, priority, event, data, false)
}
func NotifyNormal(recipientId []string, isGroup bool, event string, data jsonutils.JSONObject) {
notifyNormal(context.Background(), recipientId, isGroup, event, data)
}
@@ -266,7 +338,13 @@ func notifyRobot(ctx context.Context, robot string, recipientId []string, isGrou
if err != nil {
return err
}
jarray, _ := result.Get("types")
if result == nil {
return nil
}
jarray, err := result.Get("types")
if err != nil {
return err
}
cTypes := jarray.(*jsonutils.JSONArray).GetStringArray()
for _, ct := range cTypes {
RawNotifyWithCtx(ctx, recipientId, isGroup, npk.TNotifyChannel(ct), priority, event, data)

View File

@@ -124,7 +124,10 @@ func (manager *SOptionManager) DoSync(first bool) (time.Duration, error) {
appsrv.SetExitFlag()
}
copyOptions(manager.options, newOpts)
manager.session.Upload()
if first {
// upload config for the first time ONLY
manager.session.Upload()
}
}
return manager.refreshInterval, nil
}

View File

@@ -30,6 +30,7 @@ import (
"strings"
"yunion.io/x/jsonutils"
"yunion.io/x/pkg/errors"
"yunion.io/x/pkg/gotypes"
"yunion.io/x/pkg/util/netutils"
"yunion.io/x/pkg/util/regutils"
@@ -821,3 +822,15 @@ func NewIPv4AddrValidator(key string) *ValidatorIPv4Addr {
v.SetParent(v)
return v
}
var ValidateModel = func(userCred mcclient.TokenCredential, manager db.IStandaloneModelManager, id *string) (db.IModel, error) {
model, err := manager.FetchByIdOrName(userCred, *id)
if err != nil {
if errors.Cause(err) == sql.ErrNoRows {
return nil, httperrors.NewResourceNotFoundError2(manager.Keyword(), *id)
}
return nil, httperrors.NewGeneralError(err)
}
*id = model.GetId()
return model, nil
}

View File

@@ -56,7 +56,7 @@ type SCloudaccountCredential struct {
// 秘钥key (Aliyun, Aws, huawei, ucloud, ctyun, zstack, s3)
AccessKeySecret string `json:"access_key_secret"`
// 环境 (Azure, Aws, huawei, ctyun)
// 环境 (Azure, Aws, huawei, ctyun, aliyun)
Environment string `json:"environment"`
// 目录ID (Azure)

View File

@@ -16,6 +16,14 @@ package cloudprovider
import "yunion.io/x/onecloud/pkg/util/billing"
type TBackupMethod string
const (
BackupMethodLogical = TBackupMethod("Logical")
BackupMethodPhysical = TBackupMethod("Physical")
BackupMethodUnknown = TBackupMethod("")
)
type SDBInstanceNetwork struct {
IP string
NetworkId string
@@ -55,6 +63,9 @@ type SManagedDBInstanceCreateConfig struct {
ProjectId string
BillingCycle *billing.SBillingCycle
// 仅从备份恢复到新实例用到
RdsId string
}
type SManagedDBInstanceChangeConfig struct {

View File

@@ -317,6 +317,8 @@ type ICloudVM interface {
LiveMigrateVM(hostid string) error
GetError() error
SetMetadata(tags map[string]string, replace bool) error
}
type ICloudNic interface {
@@ -814,6 +816,9 @@ type ICloudDBInstanceBackup interface {
GetBackupSizeMb() int
GetDBNames() string
GetBackupMode() string
GetBackupMethod() TBackupMethod
CreateICloudDBInstance(opts *SManagedDBInstanceCreateConfig) (ICloudDBInstance, error)
Delete() error
}

View File

@@ -125,9 +125,6 @@ func AddDefaultRule(rules []SecurityRule, defaultRule SecurityRule, localRuleStr
defaultRule.Priority = max
}
defaultRule.Priority -= int(order)
if onlyAllowRules {
defaultRule.Priority = -1
}
return append(rules, defaultRule)
}

View File

@@ -77,8 +77,8 @@ func (self *SAliyunGuestDriver) GetStorageTypes() []string {
}
}
func (self *SAliyunGuestDriver) ChooseHostStorage(host *models.SHost, backend string, storageIds []string) *models.SStorage {
return self.chooseHostStorage(self, host, backend, storageIds)
func (self *SAliyunGuestDriver) ChooseHostStorage(host *models.SHost, diskConfig *api.DiskConfig, storageIds []string) (*models.SStorage, error) {
return self.chooseHostStorage(self, host, diskConfig.Backend, storageIds), nil
}
func (self *SAliyunGuestDriver) GetDetachDiskStatus() ([]string, error) {

View File

@@ -131,8 +131,8 @@ func (self *SAwsGuestDriver) GetStorageTypes() []string {
}
}
func (self *SAwsGuestDriver) ChooseHostStorage(host *models.SHost, backend string, storageIds []string) *models.SStorage {
return self.chooseHostStorage(self, host, backend, storageIds)
func (self *SAwsGuestDriver) ChooseHostStorage(host *models.SHost, diskConfig *api.DiskConfig, storageIds []string) (*models.SStorage, error) {
return self.chooseHostStorage(self, host, diskConfig.Backend, storageIds), nil
}
func (self *SAwsGuestDriver) GetDetachDiskStatus() ([]string, error) {

View File

@@ -79,8 +79,8 @@ func (self *SAzureGuestDriver) GetStorageTypes() []string {
}
}
func (self *SAzureGuestDriver) ChooseHostStorage(host *models.SHost, backend string, storageIds []string) *models.SStorage {
return self.chooseHostStorage(self, host, backend, storageIds)
func (self *SAzureGuestDriver) ChooseHostStorage(host *models.SHost, diskConfig *api.DiskConfig, storageIds []string) (*models.SStorage, error) {
return self.chooseHostStorage(self, host, diskConfig.Backend, storageIds), nil
}
func (self *SAzureGuestDriver) GetMaxSecurityGroupCount() int {

View File

@@ -249,15 +249,15 @@ func (self *SBaremetalGuestDriver) GetStorageTypes() []string {
}
}
func (self *SBaremetalGuestDriver) ChooseHostStorage(host *models.SHost, backend string, storageIds []string) *models.SStorage {
func (self *SBaremetalGuestDriver) ChooseHostStorage(host *models.SHost, diskConfig *api.DiskConfig, storageIds []string) (*models.SStorage, error) {
if len(storageIds) != 0 {
return models.StorageManager.FetchStorageById(storageIds[0])
return models.StorageManager.FetchStorageById(storageIds[0]), nil
}
bs := host.GetBaremetalstorage()
if bs == nil {
return nil
return nil, nil
}
return bs.GetStorage()
return bs.GetStorage(), nil
}
func (self *SBaremetalGuestDriver) RequestGuestCreateAllDisks(ctx context.Context, guest *models.SGuest, task taskman.ITask) error {

View File

@@ -393,3 +393,8 @@ func (self *SBaseGuestDriver) RequestMigrate(ctx context.Context, guest *models.
func (self *SBaseGuestDriver) RequestLiveMigrate(ctx context.Context, guest *models.SGuest, userCred mcclient.TokenCredential, data *jsonutils.JSONDict, task taskman.ITask) error {
return fmt.Errorf("Not Implement RequestLiveMigrate")
}
func (self *SBaseGuestDriver) RequestRemoteUpdate(ctx context.Context, guest *models.SGuest, userCred mcclient.TokenCredential, replaceTags bool) error {
// nil ops
return nil
}

View File

@@ -79,6 +79,46 @@ func (self *SESXiGuestDriver) GetDefaultSysDiskBackend() string {
return api.STORAGE_LOCAL
}
func (self *SESXiGuestDriver) ChooseHostStorage(host *models.SHost, diskConfig *api.DiskConfig, storageIds []string) (*models.SStorage, error) {
if !options.Options.LockStorageFromCachedimage || len(diskConfig.ImageId) == 0 {
return self.SVirtualizedGuestDriver.ChooseHostStorage(host, diskConfig, storageIds)
}
var (
image *cloudprovider.SImage
err error
)
obj, err := models.CachedimageManager.FetchById(diskConfig.ImageId)
if err != nil {
return nil, errors.Wrapf(err, "unable to fetch cachedimage %s", diskConfig.ImageId)
}
cachedimage := obj.(*models.SCachedimage)
if len(cachedimage.ExternalId) > 0 || cachedimage.ImageType != cloudprovider.CachedImageTypeSystem {
return self.SVirtualizedGuestDriver.ChooseHostStorage(host, diskConfig, storageIds)
}
storages, err := cachedimage.GetStorages()
if err != nil {
return nil, errors.Wrapf(err, "unable to GetStorages of cachedimage %s", diskConfig.ImageId)
}
if len(storages) == 0 {
log.Warningf("there no storage associated with cachedimage %q", image.Id)
return self.SVirtualizedGuestDriver.ChooseHostStorage(host, diskConfig, storageIds)
}
if len(storages) > 1 {
log.Warningf("there are multiple storageCache associated with caheimage %q", image.Id)
}
wantStorageIds := make([]string, len(storages))
for i := range wantStorageIds {
wantStorageIds[i] = storages[i].GetId()
}
for i := range wantStorageIds {
if utils.IsInStringArray(wantStorageIds[i], storageIds) {
log.Infof("use storage %q in where cachedimage %q", wantStorageIds[i], image.Id)
return &storages[i], nil
}
}
return self.SVirtualizedGuestDriver.ChooseHostStorage(host, diskConfig, storageIds)
}
func (self *SESXiGuestDriver) GetMinimalSysDiskSizeGb() int {
return options.Options.DefaultDiskSizeMB / 1024
}
@@ -183,21 +223,34 @@ func (self *SESXiGuestDriver) GetJsonDescAtHost(ctx context.Context, userCred mc
return desc, errors.Errorf("no such storage cache associated with cacheimage %s", templateId)
}
if len(storageCaches) > 1 {
return desc, errors.Errorf("there are multiple storageCache associated with caheimage '%s' ??!!", templateId)
log.Warningf("there are multiple storageCache associated with caheimage '%s' ??!!", templateId)
}
var hostIp string
storageCacheHost, err := storageCaches[0].GetHost()
if err != nil {
log.Errorf("unable to GetHost of storageCache %s: %v", storageCaches[0].Id, err)
hostIp = storageCaches[0].ExternalId
} else if storageCacheHost == nil {
log.Errorf("unable to GetHost of storageCache %s: result is nil", storageCaches[0].Id)
hostIp = storageCaches[0].ExternalId
} else {
hostIp = storageCacheHost.AccessIp
var storageCacheHost *models.SHost
// select storagecacheHost
for i := range storageCaches {
hosts, err := storageCaches[i].GetHosts()
if err != nil {
return desc, errors.Wrap(err, "storageCaches.GetHosts")
}
for i := range hosts {
if host.GetId() == hosts[i].GetId() {
storageCacheHost = &hosts[i]
}
}
}
hostIp = storageCacheHost.AccessIp
if storageCacheHost == nil {
storageCacheHost, err = storageCaches[0].GetHost()
if err != nil {
return desc, errors.Wrapf(err, "unable to GetHost of storageCache %s", storageCaches[0].Id)
}
if storageCacheHost == nil {
return desc, fmt.Errorf("unable to GetHost of storageCache %s: result is nil", storageCaches[0].Id)
}
}
hostIp := storageCacheHost.AccessIp
imageInfo := SEsxiImageInfo{
ImageType: img.ImageType,
ImageExternalId: img.ExternalId,

View File

@@ -77,12 +77,13 @@ func (self *SGoogleGuestDriver) GetStorageTypes() []string {
return []string{
api.STORAGE_GOOGLE_PD_SSD,
api.STORAGE_GOOGLE_PD_STANDARD,
api.STORAGE_GOOGLE_PD_BALANCED,
api.STORAGE_GOOGLE_LOCAL_SSD,
}
}
func (self *SGoogleGuestDriver) ChooseHostStorage(host *models.SHost, backend string, storageIds []string) *models.SStorage {
return self.chooseHostStorage(self, host, backend, storageIds)
func (self *SGoogleGuestDriver) ChooseHostStorage(host *models.SHost, diskConfig *api.DiskConfig, storageIds []string) (*models.SStorage, error) {
return self.chooseHostStorage(self, host, diskConfig.Backend, storageIds), nil
}
func (self *SGoogleGuestDriver) GetGuestInitialStateAfterCreate() string {
@@ -113,7 +114,7 @@ func (self *SGoogleGuestDriver) ValidateResizeDisk(guest *models.SGuest, disk *m
if !utils.IsInStringArray(guest.Status, []string{api.VM_READY, api.VM_RUNNING}) {
return fmt.Errorf("Cannot resize disk when guest in status %s", guest.Status)
}
if !utils.IsInStringArray(storage.StorageType, []string{api.STORAGE_GOOGLE_PD_SSD, api.STORAGE_GOOGLE_PD_STANDARD}) {
if !utils.IsInStringArray(storage.StorageType, []string{api.STORAGE_GOOGLE_PD_SSD, api.STORAGE_GOOGLE_PD_STANDARD, api.STORAGE_GOOGLE_PD_BALANCED}) {
return fmt.Errorf("Cannot resize %s disk", storage.StorageType)
}
return nil
@@ -132,13 +133,15 @@ func (self *SGoogleGuestDriver) ValidateCreateData(ctx context.Context, userCred
minGB := -1
maxGB := -1
switch disk.Backend {
case api.STORAGE_GOOGLE_PD_SSD, api.STORAGE_GOOGLE_PD_STANDARD:
case api.STORAGE_GOOGLE_PD_SSD, api.STORAGE_GOOGLE_PD_STANDARD, api.STORAGE_GOOGLE_PD_BALANCED:
minGB = 10
maxGB = 65536
case api.STORAGE_GOOGLE_LOCAL_SSD:
minGB = 375
maxGB = 375
localDisk++
default:
return nil, httperrors.NewInputParameterError("Unknown google storage type %s", disk.Backend)
}
if i == 0 && disk.Backend == api.STORAGE_GOOGLE_LOCAL_SSD {
return nil, httperrors.NewInputParameterError("System disk does not support %s disk", disk.Backend)

View File

@@ -67,8 +67,8 @@ func (self *SHuaweiGuestDriver) GetStorageTypes() []string {
return []string{api.STORAGE_HUAWEI_SATA, api.STORAGE_HUAWEI_SAS, api.STORAGE_HUAWEI_SSD}
}
func (self *SHuaweiGuestDriver) ChooseHostStorage(host *models.SHost, backend string, storageIds []string) *models.SStorage {
return self.chooseHostStorage(self, host, backend, storageIds)
func (self *SHuaweiGuestDriver) ChooseHostStorage(host *models.SHost, diskConfig *api.DiskConfig, storageIds []string) (*models.SStorage, error) {
return self.chooseHostStorage(self, host, diskConfig.Backend, storageIds), nil
}
func (self *SHuaweiGuestDriver) GetDetachDiskStatus() ([]string, error) {

View File

@@ -649,8 +649,7 @@ func (self *SManagedVirtualizedGuestDriver) RequestUndeployGuestOnHost(ctx conte
if errors.Cause(err) == cloudprovider.ErrNotFound {
return nil, nil
}
log.Errorf("host.GetIHost fail %s", err)
return nil, err
return nil, errors.Wrapf(err, "host.GetIHost")
}
// 创建失败时external id为空。此时直接返回即可。不需要再调用公有云api
@@ -663,14 +662,11 @@ func (self *SManagedVirtualizedGuestDriver) RequestUndeployGuestOnHost(ctx conte
if errors.Cause(err) == cloudprovider.ErrNotFound {
return nil, nil
}
log.Errorf("ihost.GetIVMById fail %s", err)
return nil, err
return nil, errors.Wrapf(err, "ihost.GetIVMById(%s)", guest.ExternalId)
}
err = ivm.DeleteVM(ctx)
if err != nil {
log.Errorf("ivm.DeleteVM fail %s", err)
return nil, err
return nil, errors.Wrapf(err, "ivm.DeleteVM")
}
for _, guestdisk := range guest.GetDisks() {
@@ -682,16 +678,14 @@ func (self *SManagedVirtualizedGuestDriver) RequestUndeployGuestOnHost(ctx conte
if errors.Cause(err) == cloudprovider.ErrNotFound {
continue
}
log.Errorf("disk.GetIDisk fail %s", err)
return nil, err
return nil, errors.Wrapf(err, "disk.GetIDisk")
}
if idisk.GetStatus() == api.DISK_DEALLOC {
continue
}
err = idisk.Delete(ctx)
if err != nil {
log.Errorf("idisk.Delete fail %s", err)
return nil, err
return nil, errors.Wrapf(err, "idisk.Delete")
}
}
}
@@ -1215,3 +1209,30 @@ func (self *SManagedVirtualizedGuestDriver) RequestSetAutoRenewInstance(ctx cont
})
return nil
}
func (self *SManagedVirtualizedGuestDriver) RequestRemoteUpdate(ctx context.Context, guest *models.SGuest, userCred mcclient.TokenCredential, replaceTags bool) error {
// nil ops
iVM, err := guest.GetIVM()
if err != nil {
return errors.Wrap(err, "guest.GetIVM")
}
tags, err := guest.GetAllUserMetadata()
if err != nil {
log.Errorf("GetAllUserMetadata fail %s", err)
} else {
err := iVM.SetMetadata(tags, replaceTags)
if err != nil {
return errors.Wrap(err, "iVM.SetMetadata")
}
// sync back cloud metadata
err = models.SyncVirtualResourceMetadata(ctx, userCred, guest, iVM)
if err != nil {
return errors.Wrap(err, "syncVirtualResourceMetadata")
}
}
err = iVM.UpdateVM(ctx, guest.Name)
if err != nil {
return errors.Wrap(err, "iVM.UpdateVM")
}
return nil
}

View File

@@ -91,8 +91,8 @@ func (self *SOpenStackGuestDriver) GetStorageTypes() []string {
return storages
}
func (self *SOpenStackGuestDriver) ChooseHostStorage(host *models.SHost, backend string, storageIds []string) *models.SStorage {
return self.chooseHostStorage(self, host, backend, storageIds)
func (self *SOpenStackGuestDriver) ChooseHostStorage(host *models.SHost, diskConfig *api.DiskConfig, storageIds []string) (*models.SStorage, error) {
return self.chooseHostStorage(self, host, diskConfig.Backend, storageIds), nil
}
func (self *SOpenStackGuestDriver) GetDetachDiskStatus() ([]string, error) {
@@ -232,7 +232,7 @@ func (self *SOpenStackGuestDriver) RemoteDeployGuestForRebuildRoot(ctx context.C
}
defer self.attachDisks(ctx, ihost, instanceId, detachDisks)
eip, err := guest.GetEip()
eip, err := guest.GetElasticIp()
if err == nil && eip != nil {
ieip, err := eip.GetIEip()
if err != nil {

View File

@@ -72,11 +72,12 @@ func (self *SQcloudGuestDriver) GetStorageTypes() []string {
api.STORAGE_CLOUD_SSD,
api.STORAGE_LOCAL_BASIC,
api.STORAGE_LOCAL_SSD,
api.STORAGE_CLOUD_HSSD,
}
}
func (self *SQcloudGuestDriver) ChooseHostStorage(host *models.SHost, backend string, storageIds []string) *models.SStorage {
return self.chooseHostStorage(self, host, backend, storageIds)
func (self *SQcloudGuestDriver) ChooseHostStorage(host *models.SHost, diskConfig *api.DiskConfig, storageIds []string) (*models.SStorage, error) {
return self.chooseHostStorage(self, host, diskConfig.Backend, storageIds), nil
}
func (self *SQcloudGuestDriver) GetDetachDiskStatus() ([]string, error) {
@@ -135,7 +136,7 @@ func (self *SQcloudGuestDriver) ValidateCreateData(ctx context.Context, userCred
if sysDisk.SizeMb > 1024*1024 {
return nil, fmt.Errorf("The %s system disk size must be less than 1024GB", sysDisk.Backend)
}
case api.STORAGE_LOCAL_PRO:
case api.STORAGE_LOCAL_PRO, api.STORAGE_CLOUD_HSSD: //https://cloud.tencent.com/document/product/362/2353
return nil, fmt.Errorf("storage %s can not be system disk", sysDisk.Backend)
}
@@ -154,6 +155,10 @@ func (self *SQcloudGuestDriver) ValidateCreateData(ctx context.Context, userCred
if disk.SizeMb < 100*1024 || disk.SizeMb > 16000*1024 {
return nil, httperrors.NewInputParameterError("The %s disk size must be in the range of 100GB ~ 16000GB", disk.Backend)
}
case api.STORAGE_CLOUD_HSSD:
if disk.SizeMb < 20*1024 || disk.SizeMb > 32000*1024 {
return nil, httperrors.NewInputParameterError("The %s disk size must be in the range of 20GB ~ 32000GB", disk.Backend)
}
case api.STORAGE_LOCAL_PRO:
return nil, httperrors.NewInputParameterError("storage %s can not be data disk", disk.Backend)
}
@@ -194,6 +199,10 @@ func (self *SQcloudGuestDriver) ValidateChangeConfig(ctx context.Context, userCr
if newDisk.SizeMb < 100*1024 || newDisk.SizeMb > 16000*1024 {
return httperrors.NewInputParameterError("The %s disk size must be in the range of 100GB ~ 16000GB", newDisk.Backend)
}
case api.STORAGE_CLOUD_HSSD:
if newDisk.SizeMb < 20*1024 || newDisk.SizeMb > 32000*1024 {
return httperrors.NewInputParameterError("The %s disk size must be in the range of 20GB ~ 32000GB", newDisk.Backend)
}
case api.STORAGE_LOCAL_BASIC, api.STORAGE_LOCAL_SSD, api.STORAGE_LOCAL_PRO:
return httperrors.NewUnsupportOperationError("Not support create local storage disks")
case "": //这里Backend为空有可能会导致创建出来还是local storage,依然会出错,需要用户显式指定

View File

@@ -174,11 +174,11 @@ func (self *SVirtualizedGuestDriver) GetStorageTypes() []string {
return nil
}
func (self *SVirtualizedGuestDriver) ChooseHostStorage(host *models.SHost, backend string, storageIds []string) *models.SStorage {
func (self *SVirtualizedGuestDriver) ChooseHostStorage(host *models.SHost, diskConfig *api.DiskConfig, storageIds []string) (*models.SStorage, error) {
if len(storageIds) == 0 {
return host.GetLeastUsedStorage(backend)
return host.GetLeastUsedStorage(diskConfig.Backend), nil
}
return models.StorageManager.FetchStorageById(storageIds[0])
return models.StorageManager.FetchStorageById(storageIds[0]), nil
}
func (self *SVirtualizedGuestDriver) RequestGuestCreateInsertIso(ctx context.Context, imageId string, guest *models.SGuest, task taskman.ITask) error {

View File

@@ -85,8 +85,8 @@ func (self *SZStackGuestDriver) GetMaxSecurityGroupCount() int {
return 1
}
func (self *SZStackGuestDriver) ChooseHostStorage(host *models.SHost, backend string, storageIds []string) *models.SStorage {
return self.chooseHostStorage(self, host, backend, storageIds)
func (self *SZStackGuestDriver) ChooseHostStorage(host *models.SHost, diskConfig *api.DiskConfig, storageIds []string) (*models.SStorage, error) {
return self.chooseHostStorage(self, host, diskConfig.Backend, storageIds), nil
}
func (self *SZStackGuestDriver) GetDetachDiskStatus() ([]string, error) {

Some files were not shown because too many files have changed in this diff Show More