Compare commits

...

147 Commits

Author SHA1 Message Date
Zexi Li
f3e503e8a6 Merge pull request #10614 from swordqiu/automated-cherry-pick-of-#10612-upstream-release-3.6
Automated cherry pick of #10612: fix(region): add usage cache, speedup response
2021-04-05 00:55:29 +08:00
yunion-ci-robot
10ad815d6d Merge pull request #10618 from ioito/automated-cherry-pick-of-#10616-upstream-release-3.6
Automated cherry pick of #10616: fix(region): new aws region
2021-04-04 20:14:44 +08:00
yunion-ci-robot
01a17c952d Merge pull request #10610 from ioito/automated-cherry-pick-of-#10608-upstream-release-3.6
Automated cherry pick of #10608: fix: time sync duration
2021-04-04 20:12:46 +08:00
Qiu Jian
dcb8898c06 response scope-specific metrics 2021-04-04 20:08:37 +08:00
Qiu Jian
d7ff1314e6 fix(region): add usage cache, speedup response 2021-04-04 20:08:37 +08:00
Qu Xuan
d6a0764b29 fix: new aws region 2021-04-03 12:31:33 +08:00
Qu Xuan
e841a42143 fix: time sync duration 2021-04-02 20:55:34 +08:00
Zexi Li
c55d5d0cf2 Merge pull request #10605 from zexi/automated-cherry-pick-of-#10603-upstream-release-3.6
Automated cherry pick of #10603: fix(baremetal): sas2iru parse line
2021-04-02 20:04:01 +08:00
Zexi Li
76df031884 Merge pull request #10580 from swordqiu/automated-cherry-pick-of-#10576-upstream-release-3.6
Automated cherry pick of #10576: fix(region): allow ipmi probe when probe fail
2021-04-02 19:44:43 +08:00
Zexi Li
f46dfc6d6a Merge pull request #10583 from swordqiu/automated-cherry-pick-of-#10581-upstream-release-3.6
Automated cherry pick of #10581: fix(hostman): recycle local disk file when rebuilding root
2021-04-02 19:42:51 +08:00
Zexi Li
1fc2503812 Merge pull request #10598 from rainzm/automated-cherry-pick-of-#10595-upstream-release-3.6
Automated cherry pick of #10595: Fixes problem of Esxi Disk with iso creating
2021-04-02 19:40:17 +08:00
Zexi Li
aa9ad9fe00 fix(baremetal): sas2iru parse line 2021-04-02 19:28:54 +08:00
rainzm
4cf674992c fix(esxi): determine whether the disk is a root disk more reasonably
The order of the device is often sorted according to the size of the
key. The disk pointed to by the smallest key is not necessarily the
root disk or the first disk which often has the label of 'Hard disk 1'.
We try to find the label, if not, use the Key again to determine who
is the root disk.
2021-04-02 18:49:13 +08:00
rainzm
5565bb3064 feat(esxi): change parameters for NewDiskDev and avoid unnecessary deploy
1. The fields UnitNumber and Index should be independent
2. Avoid unnecessary deploy, such create vm with iso not image
2021-04-02 18:49:13 +08:00
rainzm
aede49450e fix(esxi): add ListPath for storage and use it to check iso
When remote iso file is used, CheckFile will failed.
2021-04-02 18:41:14 +08:00
Zexi Li
c7efbc3124 Merge pull request #10589 from swordqiu/automated-cherry-pick-of-#7047-upstream-release-3.6
Automated cherry pick of #7047: fix: adjust primary key length when sqlchemy utf8 default to utf8mb4
2021-04-02 15:10:52 +08:00
Qiu Jian
d090d76f92 fix: adjust primary key length when sqlchemy utf8 default to utf8mb4 2021-04-02 15:06:44 +08:00
Qiu Jian
1333d39c60 fix(hostman): recycle local disk file when rebuilding root 2021-04-02 02:17:04 +08:00
Qiu Jian
615cb1e331 fix(region): allow ipmi probe when probe fail 2021-04-01 22:38:54 +08:00
yunion-ci-robot
923e8ea742 Merge pull request #10570 from ioito/automated-cherry-pick-of-#10568-upstream-release-3.6
Automated cherry pick of #10568: fix: avoid listener worker leak
2021-04-01 22:35:54 +08:00
Zexi Li
50b50d57dc Merge pull request #10548 from zexi/automated-cherry-pick-of-#10546-upstream-release-3.6
Automated cherry pick of #10546: fix(host): arm vm virtio-net-pci without addr
2021-04-01 20:52:55 +08:00
Zexi Li
67a4893534 Merge pull request #10551 from swordqiu/automated-cherry-pick-of-#10549-upstream-release-3.6
Automated cherry pick of #10549: fix(image): update min_disk of iso image
2021-04-01 20:52:05 +08:00
Zexi Li
e6d8dbe4a4 Merge pull request #10554 from zhaoxiangchun/automated-cherry-pick-of-#10552-upstream-release-3.6
Automated cherry pick of #10552: fix(monitor):修复监控总览图标钻取后返回数据异常的问题
2021-04-01 20:51:08 +08:00
Zexi Li
6c3c2f76c2 Merge pull request #10559 from ioito/automated-cherry-pick-of-#10557-upstream-release-3.6
Automated cherry pick of #10557: fix: cloudaccount auto sync
2021-04-01 20:50:01 +08:00
Zexi Li
a5cd56f3d7 Merge pull request #10563 from ioito/automated-cherry-pick-of-#10561-upstream-release-3.6
Automated cherry pick of #10561: fix: vendor update
2021-04-01 20:48:57 +08:00
Zexi Li
d691775beb Merge pull request #10567 from rainzm/automated-cherry-pick-of-#10565-upstream-release-3.6
Automated cherry pick of #10565: fix(esxi): be compatible with disconnected host
2021-04-01 20:47:58 +08:00
Qu Xuan
73cda1d909 fix: vendor update 2021-04-01 17:40:48 +08:00
Qu Xuan
0c904591c0 fix: avoid listener worker leak 2021-04-01 17:27:05 +08:00
rainzm
5e8549b30f fix(esxi): be compatible with disconnected host 2021-04-01 17:22:23 +08:00
Qu Xuan
1c1fab0ef6 fix: cloudaccount auto sync 2021-04-01 16:18:56 +08:00
zhaoxiangchun
88d1f93e31 fix(monitor):修复监控总览图标钻取后返回数据异常的问题 2021-04-01 10:05:36 +08:00
Qiu Jian
65748b374c fix(image): update min_disk of iso image 2021-03-31 23:25:58 +08:00
Zexi Li
4c83b1af48 fix(host): arm vm virtio-net-pci without addr 2021-03-31 18:53:39 +08:00
Yousong Zhou
f29d07dbd4 Merge pull request #10545 from zhaoxiangchun/automated-cherry-pick-of-#10543-upstream-release-3.6
Automated cherry pick of #10543: fix(host): modification of netio collection field  of local virtual machine
2021-03-31 15:17:12 +08:00
yunion-ci-robot
420e912c65 Merge pull request #10542 from ioito/automated-cherry-pick-of-#9108-upstream-release-3.6
Automated cherry pick of #9108: Hotfix/qx guest delete
2021-03-31 15:13:40 +08:00
yunion-ci-robot
35d15a23c6 Merge pull request #10540 from swordqiu/automated-cherry-pick-of-#10538-upstream-release-3.6
Automated cherry pick of #10538: fix(region): add more usage metrics, e.g. ports.eip, servers.last_week, pending_delete_servers.last_week
2021-03-31 15:12:42 +08:00
Qu Xuan
44ed684930 feat(region): disks and eip delete with server 2021-03-31 14:45:12 +08:00
zhaoxiangchun
2889279284 fix(host): modification of netio collection field of local virtual machine
1.本地虚拟机指标保存时field存在转换关系
bits_recv
bits_sent
2021-03-31 10:32:26 +08:00
Qu Xuan
1b1cccab94 feat(region): add server delete options 2021-03-31 10:19:05 +08:00
Qiu Jian
5261b52b84 fix(region): add more usage metrics, e.g. ports.eip, servers.last_week, pending_delete_servers.last_week 2021-03-31 03:39:14 +08:00
Zexi Li
6068ea04a2 Merge pull request #10535 from zhaoxiangchun/automated-cherry-pick-of-#10534-upstream-release-3.6
Automated cherry pick of #10534: fix(monitor): alertQuery fix
2021-03-30 19:44:14 +08:00
zhaoxiangchun
d7380f3ecc fix(monitor): alertQuery fix
1.兼容meter相关的监控数据查询
2.根据groupby
  确定resType,从而确定云管中对应的资源,然后进行属性填充,解决资源属性修改的问题
2021-03-30 18:22:24 +08:00
Zexi Li
01eeff06a1 Merge pull request #10533 from swordqiu/automated-cherry-pick-of-#10531-upstream-release-3.6
Automated cherry pick of #10531: fix(region): show storage capacity to project users
2021-03-30 15:53:58 +08:00
Qiu Jian
45d219ac51 fix(region): show storage capacity to project users 2021-03-30 12:29:29 +08:00
Zexi Li
8cc8d101b5 Merge pull request #10518 from zhaoxiangchun/automated-cherry-pick-of-#10516-upstream-release-3.6
Automated cherry pick of #10516: fix(monitor): filter alertquery result according to onecloud resources
2021-03-29 17:15:59 +08:00
zhaoxiangchun
2df45f0a3c fix(monitor): filter alertquery result according to onecloud resources
1.排除已经删除的资源
2.对已经删除的资源不再持续报警
2021-03-29 16:50:16 +08:00
Zexi Li
d397ac8608 Merge pull request #10523 from ioito/automated-cherry-pick-of-#10521-upstream-release-3.6
Automated cherry pick of #10521: fix: account auto sync time
2021-03-29 12:13:37 +08:00
Qu Xuan
71171ed0d9 fix: account auto sync time 2021-03-29 11:22:54 +08:00
yunion-ci-robot
c399153f14 Merge pull request #10512 from ioito/automated-cherry-pick-of-#10510-upstream-release-3.6
Automated cherry pick of #10510: fix: sku zone
2021-03-26 17:27:53 +08:00
Qu Xuan
2f7ee9fc79 fix: sku zone 2021-03-26 16:45:54 +08:00
Zexi Li
630284c2ae Merge pull request #10501 from yousong/automated-cherry-pick-of-#10499-upstream-release-3.6
Automated cherry pick of #10499: vpcagent: ovn: fix qos for eip upload
2021-03-26 15:18:13 +08:00
Zexi Li
b1a4507325 Merge pull request #10507 from swordqiu/automated-cherry-pick-of-#10505-upstream-release-3.6
Automated cherry pick of #10505: fix(baremetal): megactl driver fail to find device by key
2021-03-26 15:16:49 +08:00
Yousong Zhou
5b21958587 vpcagent: ovn: fix qos for eip upload 2021-03-26 10:28:10 +08:00
Qiu Jian
be71185b17 fix(baremetal): megactl driver fail to find device by key 2021-03-26 03:20:29 +08:00
Zexi Li
5981783ea4 Merge pull request #10496 from zhaoxiangchun/automated-cherry-pick-of-#10494-upstream-release-3.6
Automated cherry pick of #10494: fix(monitor): modify onecloud replacement code
2021-03-24 19:34:56 +08:00
zhaoxiangchun
04f4d036cf fix(monitor): modify onecloud replacement code
1.增加copyright api查询逻辑
2021-03-24 18:53:00 +08:00
Zexi Li
c615675ad9 Merge pull request #10485 from tb365/automated-cherry-pick-of-#10483-upstream-release-3.6
Automated cherry pick of #10483: (fix) region: qcloud elb https listener create fix
2021-03-24 18:51:46 +08:00
Zexi Li
4735edff60 Merge pull request #10489 from ioito/automated-cherry-pick-of-#10487-upstream-release-3.6
Automated cherry pick of #10487: fix: remove qcloud region and zone prefix
2021-03-24 12:22:28 +08:00
Zexi Li
4e099b72ad Merge pull request #10492 from zexi/automated-cherry-pick-of-#10491-upstream-release-3.6
Automated cherry pick of #10491: fix(build): build telegraf-raid-plugin
2021-03-24 12:21:41 +08:00
Zexi Li
14bd5def5d fix(build): build telegraf-raid-plugin 2021-03-24 12:20:06 +08:00
Qu Xuan
0ee42cffea fix: remove qcloud region and zone prefix 2021-03-23 17:44:36 +08:00
tangbin
08b74642f8 (fix) region: qcloud elb https listener create fix 2021-03-23 15:48:41 +08:00
Zexi Li
c6433d0a09 Merge pull request #10476 from yousong/automated-cherry-pick-of-#10474-upstream-release-3.6
Automated cherry pick of #10474: Bugfix/yousong guestnic
2021-03-23 10:39:44 +08:00
Zexi Li
db20a5e334 Merge pull request #10479 from zexi/hotfix/resize-disk
fix(host): ignore parted resize disk unknown partition table error
2021-03-23 10:38:20 +08:00
Zexi Li
546f2fcfae fix(host): ignore parted resize disk unknown partition table error 2021-03-23 09:51:02 +08:00
Yousong Zhou
b4a4cd61d9 region: fix setting nic index
When a guest has two nics, changing ip address of the 1st will cause
the new nic after detach then attach to be "1", colliding with the
original nic of index 1
2021-03-22 19:34:22 +08:00
Yousong Zhou
02022c4c29 region: attachnetwork: allow attach by network name
isValidNetworkInfo allows names.  Otherwise the code will panic when
a named was passed and nil was returned by the fetch call
2021-03-22 19:34:22 +08:00
Zexi Li
4377337a4a Merge pull request #10470 from swordqiu/automated-cherry-pick-of-#10468-upstream-release-3.6
Automated cherry pick of #10468: fix(log): add filters to baremetal event logs
2021-03-22 16:09:18 +08:00
Qiu Jian
b9e0c22b2a fix(log): add filters to baremetal event logs 2021-03-22 10:53:45 +08:00
Zexi Li
d8a1e35571 Merge pull request #10464 from ioito/automated-cherry-pick-of-#10462-upstream-release-3.6
Automated cherry pick of #10462: fix: add index for image_type
2021-03-22 10:45:25 +08:00
Zexi Li
13f6a0907f Merge pull request #10454 from ioito/automated-cherry-pick-of-#10452-upstream-release-3.6
Automated cherry pick of #10452: fix: avoid panic when use idc vpc
2021-03-22 10:40:43 +08:00
Zexi Li
99dc612991 Merge pull request #10457 from swordqiu/automated-cherry-pick-of-#10455-upstream-release-3.6
Automated cherry pick of #10455: fix(keystone): allow joint projects across domains by default
2021-03-22 10:39:23 +08:00
Qu Xuan
c5c00f38ba fix: add index for image_type 2021-03-19 14:29:42 +08:00
Zexi Li
b25043be1b Merge pull request #10459 from rainzm/webhook/more1
Notify webhook
2021-03-19 14:27:36 +08:00
Qiu Jian
7de3adac3a fix(keystone): allow joint projects across domains by default 2021-03-19 00:00:42 +08:00
Qu Xuan
be2e979c94 fix: avoid panic when use idc vpc 2021-03-18 21:04:52 +08:00
rainzm
33cb189cb1 feat(region): send webhook message when changing ipaddr 2021-03-18 17:48:01 +08:00
rainzm
10f0e0c8bb fix(region): Compatible with messages that have no recipient and contact information
such as robots
2021-03-18 17:48:01 +08:00
Zexi Li
686d314fa5 Merge pull request #10446 from zexi/feature/host-arm-support
feat(host): adjust qemu args to support aarch64
2021-03-18 15:22:33 +08:00
Zexi Li
ab00f01403 feat(host): adjust qemu args to support aarch64 2021-03-18 14:57:27 +08:00
Zexi Li
fc736bc4ca Merge pull request #10439 from swordqiu/automated-cherry-pick-of-#10437-upstream-release-3.6
Automated cherry pick of #10437: fix(region): scoped policy filter by project id
2021-03-18 10:24:00 +08:00
Zexi Li
a31e8734d0 Merge pull request #10443 from swordqiu/automated-cherry-pick-of-#10441-upstream-release-3.6
Automated cherry pick of #10441: fix(region): including domain info in project-role results
2021-03-18 10:23:30 +08:00
Zexi Li
53494b7764 Merge pull request #10435 from ioito/automated-cherry-pick-of-#10433-upstream-release-3.6
Automated cherry pick of #10433: fix: avoid stop or start vm failed
2021-03-18 10:17:33 +08:00
Qiu Jian
538097ef7c fix(region): including domain info in project-role results 2021-03-18 00:33:36 +08:00
Qiu Jian
6afe83e479 fix(region): scoped policy filter by project id 2021-03-17 23:02:08 +08:00
Qu Xuan
a7b3b1cf46 fix: avoid stop or start vm failed 2021-03-17 20:03:19 +08:00
Zexi Li
3cea602ba4 Merge pull request #10427 from ioito/automated-cherry-pick-of-#10425-upstream-release-3.6
Automated cherry pick of #10425: fix: change rds config skip zone check
2021-03-17 11:43:19 +08:00
Zexi Li
6499250b15 Merge pull request #10419 from zhaoxiangchun/automated-cherry-pick-of-#10418-upstream-release-3.6
Automated cherry pick of #10418: fix(telegraf): megactl raid  add rebuild status
2021-03-15 18:45:57 +08:00
Zexi Li
ace1d353b9 Merge pull request #10423 from ioito/automated-cherry-pick-of-#10421-upstream-release-3.6
Automated cherry pick of #10421: fix: qcloud bucket refer
2021-03-15 17:53:26 +08:00
Qu Xuan
0285e77352 fix: change rds config skip zone check 2021-03-15 17:42:56 +08:00
Qu Xuan
cdd209b59a fix: qcloud bucket refer 2021-03-15 15:47:35 +08:00
zhaoxiangchun
9da39105fb fix(telegraf): megactl raid add rebuild status 2021-03-15 10:04:25 +08:00
yunion-ci-robot
cd4cddc34c Merge pull request #10416 from ioito/automated-cherry-pick-of-#10414-upstream-release-3.6
Automated cherry pick of #10414: fix: sync cloud tags when set tags
2021-03-14 01:25:31 +08:00
Qu Xuan
9d1c0dbd95 fix: sync cloud tags when set tags 2021-03-13 20:48:39 +08:00
yunion-ci-robot
006ce9dc87 Merge pull request #10412 from ioito/automated-cherry-pick-of-#10410-upstream-release-3.6
Automated cherry pick of #10410: fix: skip zone check when rds change config
2021-03-13 19:22:23 +08:00
yunion-ci-robot
6c9c8d25e9 Merge pull request #10407 from ioito/hotfix/qx-bucket-metadata
fix: tag sync
2021-03-13 19:02:25 +08:00
Qu Xuan
32623f7c73 fix: skip zone check when rds change config 2021-03-13 19:00:40 +08:00
Qu Xuan
0b29451319 fix: tag sync 2021-03-13 17:37:11 +08:00
Zexi Li
aae4fae0c1 Merge pull request #10404 from swordqiu/automated-cherry-pick-of-#10402-upstream-release-3.6
Automated cherry pick of #10402: fix(region): cloud provider filter by domain_id ignore private case
2021-03-12 21:17:19 +08:00
Qiu Jian
0f9f2f6ee5 fix(region): cloud provider filter by domain_id ignore private case 2021-03-12 20:15:04 +08:00
Zexi Li
5cfeffcd70 Merge pull request #10389 from swordqiu/automated-cherry-pick-of-#10387-upstream-release-3.6
Automated cherry pick of #10387: fix(region): fail to update network gateway
2021-03-12 17:38:04 +08:00
Zexi Li
6b7355a9ce Merge pull request #10393 from ioito/automated-cherry-pick-of-#10391-upstream-release-3.6
Automated cherry pick of #10391: fix: sync new project for azure resource group
2021-03-12 17:35:28 +08:00
Zexi Li
f531c60e1d Merge pull request #10397 from rainzm/automated-cherry-pick-of-#10395-upstream-release-3.6
Automated cherry pick of #10395: feat(esxi): update guest os info
2021-03-12 17:34:03 +08:00
rainzm
bfb01f5630 feat(esxi): update guest os info 2021-03-11 16:44:25 +08:00
Qu Xuan
d7a7388431 fix: sync new project for azure resource group 2021-03-11 15:02:27 +08:00
Qiu Jian
112e7aac84 fix(region): fail to update network gateway 2021-03-11 14:54:26 +08:00
Zexi Li
f9d1d28d85 Merge pull request #10384 from swordqiu/automated-cherry-pick-of-#10382-upstream-release-3.6
Automated cherry pick of #10382: fix(region): cloud provider filter by domain
2021-03-11 11:39:19 +08:00
Zexi Li
5d7b73f21e Merge pull request #10373 from rainzm/automated-cherry-pick-of-#10365-upstream-release-3.6
Automated cherry pick of #10365: feat(region): filter schedtags from cloudaccount_id
2021-03-11 11:37:49 +08:00
yunion-ci-robot
2b2b502d64 Merge pull request #10376 from tb365/automated-cherry-pick-of-#10357-upstream-release-3.6
Automated cherry pick of #10357: qcloud redis support multi zones
2021-03-11 10:22:24 +08:00
Qiu Jian
22486c31bd fix(region): cloud provider filter by domain 2021-03-11 01:08:23 +08:00
rainzm
9d3c44fe91 feat(region): filter schedtags from cloudprovider_id 2021-03-10 19:45:15 +08:00
tangbin
5145f1250b fix(region) qcloud multi zone instance sync account fix 2021-03-10 19:11:58 +08:00
tangbin
acd7765b33 feat(region) qcloud redis support multi zones 2021-03-10 19:11:58 +08:00
Zexi Li
8636a26418 Merge pull request #10353 from swordqiu/automated-cherry-pick-of-#10351-upstream-release-3.6
Automated cherry pick of #10351: fix(region): network eip stats not correct
2021-03-10 16:30:58 +08:00
Zexi Li
84664f77cf Merge pull request #10369 from zexi/automated-cherry-pick-of-#10367-upstream-release-3.6
Automated cherry pick of #10367: fix(build): DOCKER_CLI_EXPERIMENTAL=enabled
2021-03-10 16:29:05 +08:00
Zexi Li
2d53b542d3 fix(build): DOCKER_CLI_EXPERIMENTAL=enabled 2021-03-10 16:28:02 +08:00
Zexi Li
e63a207c29 Merge pull request #10363 from swordqiu/automated-cherry-pick-of-#10361-upstream-release-3.6
Automated cherry pick of #10361: fix(keystone): update default role associated policy name
2021-03-09 18:06:43 +08:00
Qiu Jian
845d9a1dc0 fix(keystone): update default role associated policy name 2021-03-09 17:50:34 +08:00
Zexi Li
de6ce2cd77 Merge pull request #10360 from zexi/fix/arm64-build
fix(build): build arm64 image
2021-03-09 17:43:22 +08:00
Zexi Li
4032ae669d fix(build): build arm64 image 2021-03-09 17:42:15 +08:00
Zexi Li
0d436306ad Merge pull request #10355 from zexi/automated-cherry-pick-of-#10189-upstream-release-3.6
Automated cherry pick of #10189: host 编译跨平台兼容
2021-03-09 10:24:53 +08:00
Zhang Dongliang
ec3909af50 host 编译跨平台兼容 2021-03-09 10:24:00 +08:00
Qiu Jian
d443279986 fix(region): network eip stats not correct 2021-03-09 02:48:32 +08:00
yunion-ci-robot
9088996b32 Merge pull request #10347 from zexi/automated-cherry-pick-of-#10345-upstream-release-3.6
Automated cherry pick of #10345: feat(build): make multi arch manifest docker image
2021-03-08 20:20:05 +08:00
Zexi Li
9ac72ed678 Merge pull request #10282 from rainzm/vmware/net_boundary
feat(region): increase the network number and host number limit when recommending the network
2021-03-08 15:06:29 +08:00
Zexi Li
72ee6ff899 Merge pull request #10342 from yousong/automated-cherry-pick-of-#10340-upstream-release-3.6
Automated cherry pick of #10340: etcd: fix "fatal error: concurrent map writes"
2021-03-08 14:18:54 +08:00
Zexi Li
49a7ab8670 Merge pull request #10331 from ioito/automated-cherry-pick-of-#10329-upstream-release-3.6
Automated cherry pick of #10329: fix: optimized bucket tag
2021-03-08 14:13:46 +08:00
Zexi Li
55431b87bb feat(build): make multi arch manifest docker image 2021-03-08 12:53:37 +08:00
Yousong Zhou
bc50f09483 etcd: fix "fatal error: concurrent map writes"
Trace

	goroutine 1270434 [running]:
	runtime.throw(0x4b0cc5e, 0x15)
		/home/yousong/.usr/go/goroot-1.15.6/src/runtime/panic.go:1116 +0x72 fp=0xc0011151f8 sp=0xc0011151c8 pc=0x439292
	runtime.mapdelete_faststr(0x40876e0, 0xc0006a54a0, 0xc001e84200, 0x3e)
		/home/yousong/.usr/go/goroot-1.15.6/src/runtime/map_faststr.go:377 +0x34c fp=0xc001115260 sp=0xc0011151f8 pc=0x41664c
	yunion.io/x/onecloud/pkg/cloudcommon/etcd.(*SEtcdClient).Unwatch(0xc0003130e0, 0xc001e84200, 0x3e)
		/home/yousong/go/src/yunion.io/x/onecloud/pkg/cloudcommon/etcd/etcd.go:353 +0x134 fp=0xc0011152d0 sp=0xc001115260 pc=0x10031f4
	yunion.io/x/onecloud/pkg/compute/models.(*SHostHealthChecker).WatchHost(0xc000c222a0, 0x5229ca0, 0xc000122000, 0xc001fbc4e0, 0x24)
		/home/yousong/go/src/yunion.io/x/onecloud/pkg/compute/models/host_health.go:149 +0xd5 fp=0xc001115338 sp=0xc0011152d0 pc=0x1816395
	yunion.io/x/onecloud/pkg/compute/models.(*SHost).PerformOnline(0xc001fd8400, 0x5229d20, 0xc001c4d440, 0x52a0c60, 0xc000957c40, 0x5298900, 0xc001629aa0, 0x5298900, 0xc001629ae0, 0xc000957c40, ...)
		/home/yousong/go/src/yunion.io/x/onecloud/pkg/compute/models/hosts.go:3829 +0x227 fp=0xc0011153a0 sp=0xc001115338 pc=0x185a387
	yunion.io/x/onecloud/pkg/compute/models.(*SHost).PerformPing(0xc001fd8400, 0x5229d20, 0xc001c4d440, 0x52a0c60, 0xc000957c40, 0x5298900, 0xc001629aa0, 0x5298900, 0xc001629ae0, 0x0, ...)
		/home/yousong/go/src/yunion.io/x/onecloud/pkg/compute/models/hosts.go:3891 +0xbd fp=0xc001115430 sp=0xc0011153a0 pc=0x185acbd
2021-03-08 09:56:07 +08:00
yunion-ci-robot
30acf67d5c Merge pull request #10338 from rainzm/automated-cherry-pick-of-#10336-upstream-release-3.6
Automated cherry pick of #10336: fix(notify): enable filter of contact type 'email' and 'mobile'
2021-03-06 10:57:27 +08:00
rainzm
a2faac7692 fix(notify): enable filter of contact type 'email' and 'mobile' 2021-03-06 03:02:20 +08:00
Qu Xuan
5910ac16cd fix: optimized bucket tag 2021-03-05 15:36:34 +08:00
rainzm
4f462d614c feat(region): increase the network number and host number limit when recommending the network 2021-03-05 11:14:30 +08:00
Zexi Li
ef0387a023 Merge pull request #10326 from tb365/automated-cherry-pick-of-#10322-upstream-release-3.6
Automated cherry pick of #10322: copyright update brand_cn&brand_en fix
2021-03-05 10:15:50 +08:00
tangbin
31fce9fb78 copyright update brand_cn&brand_en fix 2021-03-05 10:01:23 +08:00
Zexi Li
f774e23248 Merge pull request #10318 from rainzm/automated-cherry-pick-of-#10316-upstream-release-3.6
Automated cherry pick of #10316: fix(region): check whether guest is nil
2021-03-04 19:39:06 +08:00
rainzm
024c14d962 fix(region): check whether guest is nil 2021-03-04 17:55:43 +08:00
Zexi Li
b3ac1d0641 Merge pull request #10308 from tb365/automated-cherry-pick-of-#10305-upstream-release-3.6
Automated cherry pick of #10305: infos copyright add brand_en&brand_cn
2021-03-04 15:25:53 +08:00
tangbin
695139c04e infos copyright add brand_en&brand_cn 2021-03-04 11:20:53 +08:00
Zexi Li
26802d4427 Merge pull request #10294 from zhaoxiangchun/automated-cherry-pick-of-#10292-upstream-release-3.6
Automated cherry pick of #10292: fix(monitor): fix monitor export err
2021-03-02 14:29:51 +08:00
zhaoxiangchun
b46f95ae79 fix(monitor): fix monitor export err
1.修复监控导出报错
2.db_dispatcher.ListItems 方法中对exportKeys的处理新增了一个方法
2021-03-02 11:58:06 +08:00
Zexi Li
7e538b255c Merge pull request #10291 from swordqiu/automated-cherry-pick-of-#10289-upstream-release-3.6
Automated cherry pick of #10289: fix(keystone): adjust default system policy names
2021-03-02 10:17:03 +08:00
yunion-ci-robot
9db72f0722 Merge pull request #10288 from zexi/automated-cherry-pick-of-#10286-upstream-release-3.6
Automated cherry pick of #10286: fix(hostdeployer): windows rootfs umount leak
2021-03-02 10:11:21 +08:00
Zexi Li
cc1b6a2d60 fix(hostdeployer): windows rootfs umount leak 2021-03-02 09:52:49 +08:00
Qiu Jian
1411961035 fix(keystone): adjust default system policy names 2021-03-01 21:30:56 +08:00
Zexi Li
33c979d227 Merge pull request #10280 from swordqiu/automated-cherry-pick-of-#10278-upstream-release-3.6
Automated cherry pick of #10278: fix(baremetal-agent): baremetal fail to stop due to power off soft failed
2021-03-01 10:13:39 +08:00
Qiu Jian
a3621b4707 fix(baremetal-agent): baremetal fail to stop due to power off soft failed 2021-02-27 21:50:50 +08:00
171 changed files with 5624 additions and 1574 deletions

View File

@@ -134,6 +134,11 @@ clean:
fmt:
@git ls-files --exclude '*' '*.go' \
| grep -v '^vendor/' \
| while read f; do \
if ! grep -m1 -q '^// Code generated .* DO NOT EDIT\.$$' "$$f"; then \
echo "$$f"; \
fi ; \
done \
| xargs $(XARGS_FLAGS) gofmt -w
fmt-check: fmt
@@ -206,70 +211,6 @@ mod:
go mod tidy
go mod vendor -v
DOCKER_CENTOS_BUILD_IMAGE?=registry.cn-beijing.aliyuncs.com/yunionio/centos-build:1.1-3
define dockerCentOSBuildCmd
set -o xtrace
set -o errexit
set -o pipefail
cd /root/onecloud
export GOFLAGS=-mod=vendor
make $(1)
chown -R $(shell id -u):$(shell id -g) _output
endef
docker-centos-build: export dockerCentOSBuildCmd:=$(call dockerCentOSBuildCmd,$(F))
docker-centos-build:
docker rm --force onecloud-ci-build &>/dev/null || true
docker run \
--name onecloud-docker-centos-build \
--rm \
--volume $(CURDIR):/root/onecloud \
--volume $(CURDIR)/_output/_cache:/root/.cache \
$(DOCKER_CENTOS_BUILD_IMAGE) \
/bin/bash -c "$$dockerCentOSBuildCmd"
chown -R $$(id -u):$$(id -g) _output
ls -lh _output/bin
# NOTE we need a way to stop and remove the container started by docker-build.
# No --tty, --stop-signal won't work
docker-centos-build-stop:
docker stop --time 0 onecloud-docker-centos-build || true
.PHONY: docker-centos-build
.PHONY: docker-centos-build-stop
DOCKER_ALPINE_BUILD_IMAGE?=registry.cn-beijing.aliyuncs.com/yunionio/alpine-build:1.0-5
define dockerAlpineBuildCmd
set -o xtrace
set -o errexit
set -o pipefail
cd /root/go/src/yunion.io/x/onecloud
export GOFLAGS=-mod=vendor
make $(1)
chown -R $(shell id -u):$(shell id -g) _output
endef
docker-alpine-build: export dockerAlpineBuildCmd:=$(call dockerAlpineBuildCmd,$(F))
docker-alpine-build:
docker rm --force onecloud-docker-alpine-build &>/dev/null || true
docker run --rm \
--name onecloud-docker-alpine-build \
-v $(CURDIR):/root/go/src/yunion.io/x/onecloud \
-v $(CURDIR)/_output/alpine-build:/root/go/src/yunion.io/x/onecloud/_output \
-v $(CURDIR)/_output/alpine-build/_cache:/root/.cache \
$(DOCKER_ALPINE_BUILD_IMAGE) \
/bin/sh -c "$$dockerAlpineBuildCmd"
ls -lh _output/alpine-build/bin
docker-alpine-build-stop:
docker stop --time 0 onecloud-docker-alpine-build || true
.PHONY: docker-alpine-build
.PHONY: docker-alpine-build-stop
define helpText
Build with docker
@@ -329,3 +270,6 @@ image:
%:
@:
ModName:=yunion.io/x/onecloud
include $(CURDIR)/Makefile.common.mk

83
Makefile.common.mk Normal file
View File

@@ -0,0 +1,83 @@
ifeq ($(__inc_Makefile_common_mk),)
__inc_Makefile_common_mk:=1
ifeq ($(ModName),)
$(error ModName must be set, e.g. yunion.io/x/onecloud)
endif
ModBaseName:=$(notdir $(ModName))
DockerImageRegistry?=registry.cn-beijing.aliyuncs.com
DockerImageAlpineBuild?=$(DockerImageRegistry)/yunionio/alpine-build:1.0-5
DockerImageCentOSBuild?=$(DockerImageRegistry)/yunionio/centos-build:1.1-4
EnvIf=$(if $($(1)),$(1)=$($(1)))
define dockerCentOSBuildCmd
set -o xtrace
set -o errexit
set -o pipefail
cd /root/go/src/yunion.io/x/$(ModBaseName)
env \
$(call EnvIf,GOARCH) \
$(call EnvIf,GOOS) \
$(call EnvIf,CGO_ENABLED) \
make $(1)
chown -R $(shell id -u):$(shell id -g) _output
endef
docker-centos-build: export dockerCentOSBuildCmd:=$(call dockerCentOSBuildCmd,$(F))
docker-centos-build:
docker rm --force docker-centos-build-$(ModBaseName) &>/dev/null || true
docker run \
--rm \
--name docker-centos-build-$(ModBaseName) \
-v $(CURDIR):/root/go/src/yunion.io/x/$(ModBaseName) \
-v $(CURDIR)/_output/centos-build:/root/go/src/yunion.io/x/$(ModBaseName)/_output \
-v $(CURDIR)/_output/centos-build/_cache:/root/.cache \
$(DockerImageCentOSBuild) \
/bin/bash -c "$$dockerCentOSBuildCmd"
ls -lh _output/centos-build/bin
# NOTE we need a way to stop and remove the container started by docker-build.
# No --tty, --stop-signal won't work
docker-centos-build-stop:
docker stop --time 0 docker-centos-build-$(ModBaseName) || true
.PHONY: docker-centos-build
.PHONY: docker-centos-build-stop
define dockerAlpineBuildCmd
set -o xtrace
set -o errexit
set -o pipefail
cd /root/go/src/yunion.io/x/$(ModBaseName)
env \
$(call EnvIf,GOARCH) \
$(call EnvIf,GOOS) \
$(call EnvIf,CGO_ENABLED) \
make $(1)
chown -R $(shell id -u):$(shell id -g) _output
endef
docker-alpine-build: export dockerAlpineBuildCmd:=$(call dockerAlpineBuildCmd,$(F))
docker-alpine-build:
docker rm --force docker-alpine-build-$(ModBaseName) &>/dev/null || true
docker run \
--rm \
--name docker-alpine-build-$(ModBaseName) \
-v $(CURDIR):/root/go/src/yunion.io/x/$(ModBaseName) \
-v $(CURDIR)/_output/alpine-build:/root/go/src/yunion.io/x/$(ModBaseName)/_output \
-v $(CURDIR)/_output/alpine-build/_cache:/root/.cache \
$(DockerImageAlpineBuild) \
/bin/sh -c "$$dockerAlpineBuildCmd"
ls -lh _output/alpine-build/bin
docker-alpine-build-stop:
docker stop --time 0 docker-alpine-build-$(ModBaseName) || true
.PHONY: docker-alpine-build
.PHONY: docker-alpine-build-stop
endif # __inc_Makefile_common_mk

View File

@@ -1,3 +1,6 @@
FROM registry.cn-beijing.aliyuncs.com/yunionio/centos-build:1.1-4 as build
RUN yum install -y https://iso.yunion.cn/3.6/rpms/packages/host/baremetal-pxerom-1.1.0-20072810.x86_64.rpm
FROM frolvlad/alpine-glibc:glibc-2.28
MAINTAINER "Yaoqi Wan <wanyaoqi@yunionyun.com>"
@@ -16,17 +19,17 @@ RUN mkdir -p /opt/cloud/yunion/baremetal
RUN wget -O /opt/cloud/yunion/baremetal/pci.ids http://pci-ids.ucw.cz/v2.2/pci.ids
# download baremetal-pxerom-*.x86_64.rpm and unpack rpm in current directory
COPY ./opt/cloud/yunion/baremetal/bootia32.efi /opt/cloud/yunion/baremetal
COPY ./opt/cloud/yunion/baremetal/bootx64.efi /opt/cloud/yunion/baremetal
COPY ./opt/cloud/yunion/baremetal/chain.c32 /opt/cloud/yunion/baremetal
COPY ./opt/cloud/yunion/baremetal/initramfs /opt/cloud/yunion/baremetal
COPY ./opt/cloud/yunion/baremetal/isolinux.bin /opt/cloud/yunion/baremetal
COPY ./opt/cloud/yunion/baremetal/kernel /opt/cloud/yunion/baremetal
COPY ./opt/cloud/yunion/baremetal/ldlinux.c32 /opt/cloud/yunion/baremetal
COPY ./opt/cloud/yunion/baremetal/ldlinux.e32 /opt/cloud/yunion/baremetal
COPY ./opt/cloud/yunion/baremetal/ldlinux.e64 /opt/cloud/yunion/baremetal
COPY ./opt/cloud/yunion/baremetal/libcom32.c32 /opt/cloud/yunion/baremetal
COPY ./opt/cloud/yunion/baremetal/libutil.c32 /opt/cloud/yunion/baremetal
COPY ./opt/cloud/yunion/baremetal/lpxelinux.0 /opt/cloud/yunion/baremetal
COPY ./opt/cloud/yunion/baremetal/menu.c32 /opt/cloud/yunion/baremetal
COPY ./opt/cloud/yunion/baremetal/pxelinux.0 /opt/cloud/yunion/baremetal
COPY --from=build /opt/cloud/yunion/baremetal/bootia32.efi /opt/cloud/yunion/baremetal
COPY --from=build /opt/cloud/yunion/baremetal/bootx64.efi /opt/cloud/yunion/baremetal
COPY --from=build /opt/cloud/yunion/baremetal/chain.c32 /opt/cloud/yunion/baremetal
COPY --from=build ./opt/cloud/yunion/baremetal/initramfs /opt/cloud/yunion/baremetal
COPY --from=build ./opt/cloud/yunion/baremetal/isolinux.bin /opt/cloud/yunion/baremetal
COPY --from=build ./opt/cloud/yunion/baremetal/kernel /opt/cloud/yunion/baremetal
COPY --from=build ./opt/cloud/yunion/baremetal/ldlinux.c32 /opt/cloud/yunion/baremetal
COPY --from=build ./opt/cloud/yunion/baremetal/ldlinux.e32 /opt/cloud/yunion/baremetal
COPY --from=build ./opt/cloud/yunion/baremetal/ldlinux.e64 /opt/cloud/yunion/baremetal
COPY --from=build ./opt/cloud/yunion/baremetal/libcom32.c32 /opt/cloud/yunion/baremetal
COPY --from=build ./opt/cloud/yunion/baremetal/libutil.c32 /opt/cloud/yunion/baremetal
COPY --from=build ./opt/cloud/yunion/baremetal/lpxelinux.0 /opt/cloud/yunion/baremetal
COPY --from=build ./opt/cloud/yunion/baremetal/menu.c32 /opt/cloud/yunion/baremetal
COPY --from=build ./opt/cloud/yunion/baremetal/pxelinux.0 /opt/cloud/yunion/baremetal

View File

@@ -6,4 +6,4 @@ ENV TZ Asia/Shanghai
RUN mkdir -p /opt/yunion/bin
ADD ./_output/alpine-build/bin/host-deployer /opt/yunion/bin/host-deployer
ADD ./_output/centos-build/bin/host-deployer /opt/yunion/bin/host-deployer

View File

@@ -1,3 +0,0 @@
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

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

View File

@@ -0,0 +1,2 @@
_output/alpine-build/_cache

View File

@@ -452,11 +452,15 @@ func init() {
DomainList []string
// 是否允许空referer 访问
AllowEmptyRefer bool `help:"all empty refer access"`
Enabled bool
RerererType string `help:"Referer type" choices:"Black-List|White-List"`
}
R(&BucketSetRefererOption{}, "bucket-set-referer", "Set bucket referer", func(s *mcclient.ClientSession, args *BucketSetRefererOption) error {
conf := api.BucketRefererConf{
WhiteList: args.DomainList,
Enabled: args.Enabled,
AllowEmptyRefer: args.AllowEmptyRefer,
RefererType: args.RerererType,
DomainList: args.DomainList,
}
result, err := modules.Buckets.PerformAction(s, args.ID, "set-referer", jsonutils.Marshal(conf))
if err != nil {

View File

@@ -32,6 +32,8 @@ type GeneralUsageOptions struct {
CloudEnv string `help:"show usage of specified cloudenv" choices:"public|private|onpremise"`
Scope string `help:"show usage of specified privilege scope" choices:"system|domain|project"`
Refresh bool `help:"force refresh usage statistics"`
}
func fetchHostTypeOptions(args *GeneralUsageOptions) *jsonutils.JSONDict {
@@ -48,6 +50,9 @@ func fetchHostTypeOptions(args *GeneralUsageOptions) *jsonutils.JSONDict {
if len(args.CloudEnv) > 0 {
params.Add(jsonutils.NewString(args.CloudEnv), "cloud_env")
}
if args.Refresh {
params.Add(jsonutils.JSONTrue, "refresh")
}
return params
}

View File

@@ -36,6 +36,8 @@ func init() {
Email string `help:"The Email"`
Docs *string `help:"the Docs website address"`
License *string `help:"the license generator website address"`
BrandCn *string `help:"the brand name in Chinese"`
BrandEn *string `help:"the brand name in English"`
}
R(&CopyrightUpdateOptions{}, "copyright-update", "update copyright", func(s *mcclient.ClientSession, args *CopyrightUpdateOptions) error {
@@ -52,6 +54,14 @@ func init() {
params.Add(jsonutils.NewString(*args.License), "license")
}
if args.BrandCn != nil {
params.Add(jsonutils.NewString(*args.BrandCn), "brand_cn")
}
if args.BrandEn != nil {
params.Add(jsonutils.NewString(*args.BrandEn), "brand_en")
}
if len(args.Copyright) > 0 {
params.Add(jsonutils.NewString(args.Copyright), "copyright")
}

8
go.mod
View File

@@ -109,7 +109,7 @@ require (
github.com/spaolacci/murmur3 v1.1.0 // indirect
github.com/stretchr/testify v1.5.1
github.com/tencentcloud/tencentcloud-sdk-go v3.0.135+incompatible
github.com/tencentyun/cos-go-sdk-v5 v0.7.10
github.com/tencentyun/cos-go-sdk-v5 v0.7.24
github.com/tinylib/msgp v1.1.0 // indirect
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 // indirect
github.com/tredoe/osutil v0.0.0-20161130133508-7d3ee1afa71c
@@ -140,13 +140,13 @@ require (
k8s.io/apimachinery v0.19.3
k8s.io/client-go v0.19.3
k8s.io/cluster-bootstrap v0.19.3
yunion.io/x/executor v0.0.0-20201201131200-44fa553abd9e
yunion.io/x/executor v0.0.0-20210310041834-3fcd1574f68e
yunion.io/x/jsonutils v0.0.0-20201110084044-3e4e1cb49769
yunion.io/x/log v0.0.0-20201210064738-43181789dc74
yunion.io/x/ovsdb v0.0.0-20200526071744-27bf0940cbc7
yunion.io/x/pkg v0.0.0-20201123083159-ca3aea986ff2
yunion.io/x/pkg v0.0.0-20210218105412-13a69f60034c
yunion.io/x/s3cli v0.0.0-20190917004522-13ac36d8687e
yunion.io/x/sqlchemy v0.0.0-20210204013753-dbac29c9cedb
yunion.io/x/sqlchemy v0.0.0-20210329171939-2c520f93aee3
yunion.io/x/structarg v0.0.0-20200720093445-9f850fa222ce
)

17
go.sum
View File

@@ -583,8 +583,8 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5
github.com/syncthing/syncthing v0.14.48-rc.4/go.mod h1:nw3siZwHPA6M8iSfjDCWQ402eqvEIasMQOE8nFOxy7M=
github.com/tencentcloud/tencentcloud-sdk-go v3.0.135+incompatible h1:QIMoFqKCmNp4HPLiTR+couZbHsIZfoOllncHYvtqse8=
github.com/tencentcloud/tencentcloud-sdk-go v3.0.135+incompatible/go.mod h1:0PfYow01SHPMhKY31xa+EFz2RStxIqj6JFAJS+IkCi4=
github.com/tencentyun/cos-go-sdk-v5 v0.7.10 h1:hJPLdR4RPsnubB3M9qXNBeUbcOJMVANnO/L6Att/PZU=
github.com/tencentyun/cos-go-sdk-v5 v0.7.10/go.mod h1:wQBO5HdAkLjj2q6XQiIfDSP8DXDNrppDRw2Kp/1BODA=
github.com/tencentyun/cos-go-sdk-v5 v0.7.24 h1:ZsZij764lOaPsj7mEAlyxXvslGt6/m312Tzqj/zeRpo=
github.com/tencentyun/cos-go-sdk-v5 v0.7.24/go.mod h1:wQBO5HdAkLjj2q6XQiIfDSP8DXDNrppDRw2Kp/1BODA=
github.com/texttheater/golang-levenshtein v0.0.0-20180516184445-d188e65d659e h1:T5PdfK/M1xyrHwynxMIVMWLS7f/qHwfslZphxtGnw7s=
github.com/texttheater/golang-levenshtein v0.0.0-20180516184445-d188e65d659e/go.mod h1:XDKHRm5ThF8YJjx001LtgelzsoaEcvnA7lVWz9EeX3g=
github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
@@ -912,8 +912,8 @@ sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs=
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
yunion.io/x/executor v0.0.0-20201201131200-44fa553abd9e h1:NRtqiegW4NME0v10rpChORZnJnuAUbpv31R5DsqqczQ=
yunion.io/x/executor v0.0.0-20201201131200-44fa553abd9e/go.mod h1:Uxuou9WQIeJXNpy7t2fPLL0BYLvLiMvGQwY7Qc6aSws=
yunion.io/x/executor v0.0.0-20210310041834-3fcd1574f68e h1:uGmKmmHm4zeLXhc/MEbAFtEDtGtyEYhC0OaBRGFi+fQ=
yunion.io/x/executor v0.0.0-20210310041834-3fcd1574f68e/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-20201110084044-3e4e1cb49769 h1:LIQ4hhLGQuQK+XxlV+8JrKBuL37WUT+5ZTVxBwHOTD4=
yunion.io/x/jsonutils v0.0.0-20201110084044-3e4e1cb49769/go.mod h1:p0nyMqGA/apTxxyLIU/o1k4V7Vujl2O6ey30L594sYE=
@@ -925,13 +925,12 @@ yunion.io/x/ovsdb v0.0.0-20200526071744-27bf0940cbc7 h1:gjqNa2uQzIEXyySsbvVz0Ult
yunion.io/x/ovsdb v0.0.0-20200526071744-27bf0940cbc7/go.mod h1:0vLkNEhlmA64HViPBAnSTUMrx5QP1CLsxXmxDKQ80tc=
yunion.io/x/pkg v0.0.0-20190620104149-945c25821dbf/go.mod h1:t6rEGG2sQ4J7DhFxSZVOTjNd0YO/KlfWQyK1W4tog+E=
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-20201123083159-ca3aea986ff2 h1:NeCr2J8HjcIuJvEhP0rwWA1UKP8ReOv6HVf5k9YPtyA=
yunion.io/x/pkg v0.0.0-20201123083159-ca3aea986ff2/go.mod h1:t6rEGG2sQ4J7DhFxSZVOTjNd0YO/KlfWQyK1W4tog+E=
yunion.io/x/pkg v0.0.0-20210218105412-13a69f60034c h1:J/joqbA1N2mAlOl0Uqd4LpAq3+DK5aoFMdz+p9Ld7pQ=
yunion.io/x/pkg v0.0.0-20210218105412-13a69f60034c/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-20210204013753-dbac29c9cedb h1:k7s5xMCd/fw29vUaNsGCrLkyn7w8eSghJ5NChuU9SAk=
yunion.io/x/sqlchemy v0.0.0-20210204013753-dbac29c9cedb/go.mod h1:FTdwPdGhMgh4E+UFXc9klI1Ok34fMuybTT+jLhOaIjI=
yunion.io/x/sqlchemy v0.0.0-20210329171939-2c520f93aee3 h1:C4yasW3gXronDIlIVUqHSbkA38PM1X9gxUWTYGsuIuI=
yunion.io/x/sqlchemy v0.0.0-20210329171939-2c520f93aee3/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=

View File

@@ -320,12 +320,16 @@ func (input *BucketCORSRules) Validate() error {
}
type BucketRefererConf struct {
// 白名单域名列表
WhiteList []string
// 黑名单域名列表
BlackList []string
// Referer Type
// enmu: Black-List, White-List
RefererType string
// 域名列表
DomainList []string
// 是否允许空referer 访问
AllowEmptyRefer bool
// 是否开启
Enabled bool `json:"enabled"`
}
func (input *BucketRefererConf) Validate() error {

View File

@@ -335,6 +335,15 @@ type CloudaccountPerformPublicInput struct {
type CloudaccountPerformPrepareNetsInput struct {
CloudaccountCreateInput
// description: Recommended network subnet mask
// example: 24
NetworkBits *int8 `json:"network_bits"`
// description: The upper limit of host number
// example: 254
HostNumberUpperLimit *int `json:"host_number_upper_limit"`
// description: The lower limit of host number
// example: 2
HostNumberLowerLimit *int `json:"host_number_lower_limit"`
// enum: vcenter,datacenter,cluster
WireLevelForVmware string `json:"wire_level_for_vmware"`
}
@@ -427,3 +436,9 @@ type GetCloudaccountSamlOutput struct {
// initial SAML SSO login URL for this cloudaccount
InitLoginUrl string `json:"init_login_url,allowempty"`
}
type CloudaccountEnableAutoSyncInput struct {
// 云账号状态必须是connected
// 最小值为region服务的minimal_sync_interval_seconds
SyncIntervalSeconds int `json:"sync_interval_seconds"`
}

View File

@@ -101,6 +101,50 @@ var (
CLOUD_PROVIDER_GOOGLE,
CLOUD_PROVIDER_CTYUN,
}
CLOUD_PROVIDER_HOST_TYPE_MAP = map[string][]string{
CLOUD_PROVIDER_ONECLOUD: []string{
HOST_TYPE_KVM,
HOST_TYPE_BAREMETAL,
HOST_TYPE_HYPERVISOR,
},
CLOUD_PROVIDER_VMWARE: []string{
HOST_TYPE_ESXI,
},
CLOUD_PROVIDER_ALIYUN: []string{
HOST_TYPE_ALIYUN,
},
CLOUD_PROVIDER_APSARA: []string{
HOST_TYPE_APSARA,
},
CLOUD_PROVIDER_QCLOUD: []string{
HOST_TYPE_QCLOUD,
},
CLOUD_PROVIDER_AZURE: []string{
HOST_TYPE_AZURE,
},
CLOUD_PROVIDER_AWS: []string{
HOST_TYPE_AWS,
},
CLOUD_PROVIDER_HUAWEI: []string{
HOST_TYPE_HUAWEI,
},
CLOUD_PROVIDER_OPENSTACK: []string{
HOST_TYPE_OPENSTACK,
},
CLOUD_PROVIDER_UCLOUD: []string{
HOST_TYPE_UCLOUD,
},
CLOUD_PROVIDER_ZSTACK: []string{
HOST_TYPE_ZSTACK,
},
CLOUD_PROVIDER_GOOGLE: []string{
HOST_TYPE_GOOGLE,
},
CLOUD_PROVIDER_CTYUN: []string{
HOST_TYPE_CTYUN,
},
}
)
const (

View File

@@ -177,6 +177,9 @@ const (
// 尼日利亚
CITY_LAGOS = "Lagos" //拉哥斯
// 巴林王国 (中东国家)
CITY_BAHRAIN = "Bahrain" // 巴林
// 越南
CITY_HO_CHI_MINH = "Ho Chi Minh" //???
@@ -207,4 +210,5 @@ const (
COUNTRY_CODE_NO = "NO" //挪威
COUNTRY_CODE_MX = "MX" //墨西哥
COUNTRY_CODE_CL = "CL" //智利
COUNTRY_CODE_BH = "BH" //巴林
)

View File

@@ -166,11 +166,7 @@ type SDBInstanceChangeConfigInput struct {
apis.Meta
InstanceType string
VCpuCount int
VmemSizeMb int
StorageType string
DiskSizeGB int
Category string
}
type SDBInstanceRecoveryConfigInput struct {

View File

@@ -106,6 +106,7 @@ type DiskListInput struct {
apis.VirtualResourceListInput
apis.ExternalizedResourceBaseListInput
apis.MultiArchResourceBaseListInput
apis.AutoDeleteResourceBaseListInput
billing.BillingResourceListInput
StorageFilterListInput
@@ -134,8 +135,6 @@ type DiskListInput struct {
DiskSize int `json:"disk_size"`
AutoDelete *bool `json:"auto_delete"`
FsFormat string `json:"fs_format"`
// 镜像

View File

@@ -159,6 +159,12 @@ type ElasticcacheCreateInput struct {
// 主可用区名称或Id
Zone string `json:"zone"`
// 备可用区名称或Id列表
// 默认副本与主可用区一致
// 支持此参数的云厂商: 腾讯云
// required: false
SlaveZones []string `json:"slave_zones"`
// Ip子网名称或Id,建议使用Id
// required: true
Network string `json:"network"`

View File

@@ -460,3 +460,25 @@ type ServerStopInput struct {
// 目前仅阿里云,腾讯云此参数生效
StopCharging bool `json:"stop_charging"`
}
type ServerDeleteInput struct {
// 是否越过回收站直接删除
// default: false
OverridePendingDelete bool
// 是否仅删除本地资源
// default: false
Purge bool
// 是否删除快照
// default: false
DeleteSnapshots bool
// 是否删除关联的EIP
// default: false
DeleteEip bool
// 是否删除关联的数据盘
// default: false
DeleteDisks bool
}

View File

@@ -59,6 +59,7 @@ type SchedtagFilterListInput struct {
type SchedtagListInput struct {
apis.StandaloneResourceListInput
apis.ScopedResourceBaseListInput
CloudproviderResourceInput
// fitler by resource_type
ResourceType []string `json:"resource_type"`

View File

@@ -319,3 +319,7 @@ type EnabledStatusInfrasResourceBaseListInput struct {
type MultiArchResourceBaseListInput struct {
OsArch string `json:"os_arch"`
}
type AutoDeleteResourceBaseListInput struct {
AutoDelete *bool
}

View File

@@ -27,4 +27,14 @@ type BaremetalEventListInput struct {
Since time.Time `json:"since"`
// until
Until time.Time `json:"until"`
// host_id
HostId []string `json:"host_id"`
// id
Id []int64 `json:"id"`
// EventId
EventId []string `json:"event_id"`
// Type
Type []string `json:"type"`
// ipmi_ip
IpmiIp []string `json:"ipmi_ip"`
}

View File

@@ -0,0 +1,147 @@
package monitor
var (
ServerTags = map[string]string{
"host": "host",
"host_id": "host_id",
"vm_id": "id",
"vm_ip": "ips",
"vm_name": "name",
"zone": "zone",
"zone_id": "zone_id",
"zone_ext_id": "zone_ext_id",
"os_type": "os_type",
"status": "status",
"cloudregion": "cloudregion",
"cloudregion_id": "cloudregion_id",
"region_ext_id": "region_ext_id",
"tenant": "tenant",
"tenant_id": "tenant_id",
"brand": "brand",
"scaling_group_id": "vm_scaling_group_id",
"domain_id": "domain_id",
"project_domain": "project_domain",
}
HostTags = map[string]string{
"host_id": "id",
"host_ip": "ips",
"host": "name",
"zone": "zone",
"zone_id": "zone_id",
"zone_ext_id": "zone_ext_id",
"os_type": "os_type",
"status": "status",
"cloudregion": "cloudregion",
"cloudregion_id": "cloudregion_id",
"region_ext_id": "region_ext_id",
"tenant": "tenant",
"tenant_id": "tenant_id",
"brand": "brand",
"domain_id": "domain_id",
"project_domain": "project_domain",
}
RdsTags = map[string]string{
"host": "host",
"host_id": "host_id",
"rds_id": "id",
"rds_ip": "ips",
"rds_name": "name",
"zone": "zone",
"zone_id": "zone_id",
"zone_ext_id": "zone_ext_id",
"os_type": "os_type",
"status": "status",
"cloudregion": "cloudregion",
"cloudregion_id": "cloudregion_id",
"region_ext_id": "region_ext_id",
"tenant": "tenant",
"tenant_id": "tenant_id",
"brand": "brand",
"domain_id": "domain_id",
"project_domain": "project_domain",
}
RedisTags = map[string]string{
"host": "host",
"host_id": "host_id",
"redis_id": "id",
"redis_ip": "ips",
"redis_name": "name",
"zone": "zone",
"zone_id": "zone_id",
"zone_ext_id": "zone_ext_id",
"os_type": "os_type",
"status": "status",
"cloudregion": "cloudregion",
"cloudregion_id": "cloudregion_id",
"region_ext_id": "region_ext_id",
"tenant": "tenant",
"tenant_id": "tenant_id",
"brand": "brand",
"domain_id": "domain_id",
"project_domain": "project_domain",
}
OssTags = map[string]string{
"host": "host",
"host_id": "host_id",
"oss_id": "id",
"oss_ip": "ips",
"oss_name": "name",
"zone": "zone",
"zone_id": "zone_id",
"zone_ext_id": "zone_ext_id",
"os_type": "os_type",
"status": "status",
"cloudregion": "cloudregion",
"cloudregion_id": "cloudregion_id",
"region_ext_id": "region_ext_id",
"tenant": "tenant",
"tenant_id": "tenant_id",
"brand": "brand",
"domain_id": "domain_id",
"project_domain": "project_domain",
}
ElbTags = map[string]string{
"host": "host",
"host_id": "host_id",
"elb_id": "id",
"elb_ip": "ips",
"elb_name": "name",
"zone": "zone",
"zone_id": "zone_id",
"zone_ext_id": "zone_ext_id",
"os_type": "os_type",
"status": "status",
"region": "region",
"cloudregion": "cloudregion",
"cloudregion_id": "cloudregion_id",
"tenant": "tenant",
"tenant_id": "tenant_id",
"brand": "brand",
"domain_id": "domain_id",
"project_domain": "project_domain",
}
CloudAccountTags = map[string]string{
"cloudaccount_id": "id",
"cloudaccount_name": "name",
"brand": "brand",
"domain_id": "domain_id",
"project_domain": "project_domain",
}
TenantTags = map[string]string{
"tenant_id": "id",
"tenant": "name",
"domain_id": "domain_id",
"project_domain": "project_domain",
}
DomainTags = map[string]string{
"domain_id": "id",
"project_domain": "name",
}
)

View File

@@ -9,6 +9,8 @@ const (
METRIC_RES_TYPE_OSS = "oss"
METRIC_RES_TYPE_RDS = "rds"
METRIC_RES_TYPE_CLOUDACCOUNT = "cloudaccount"
METRIC_RES_TYPE_TENANT = "tenant"
METRIC_RES_TYPE_DOMAIN = "domain"
METRIC_UNIT_PERCENT = "%"
METRIC_UNIT_BPS = "bps"

View File

@@ -21,12 +21,14 @@ var (
"cloudaccount": "cloudaccount_name",
}
MEASUREMENT_TAG_ID = map[string]string{
"host": "host_id",
"guest": "vm_id",
"redis": "redis_id",
"rds": "rds_id",
"oss": "oss_id",
"cloudaccount": "cloudaccount_id",
METRIC_RES_TYPE_HOST: "host_id",
METRIC_RES_TYPE_GUEST: "vm_id",
METRIC_RES_TYPE_REDIS: "redis_id",
METRIC_RES_TYPE_RDS: "rds_id",
METRIC_RES_TYPE_OSS: "oss_id",
METRIC_RES_TYPE_CLOUDACCOUNT: "cloudaccount_id",
METRIC_RES_TYPE_TENANT: "tenant_id",
METRIC_RES_TYPE_DOMAIN: "domain_id",
}
AlertReduceFunc = map[string]string{
"avg": "average value",

View File

@@ -19,6 +19,7 @@ import (
"time"
"yunion.io/x/jsonutils"
"yunion.io/x/log"
"yunion.io/x/pkg/errors"
"yunion.io/x/onecloud/pkg/cloudcommon/types"
@@ -47,7 +48,7 @@ func NewBaremetalServerStopTask(
func (task *SBaremetalServerStopTask) DoStop(ctx context.Context, args interface{}) error {
task.SetStage(task.WaitForStop)
if err := task.Baremetal.DoPowerShutdown(true); err != nil {
return errors.Wrap(err, "Do power shutdown error")
log.Errorf("Do power shutdown error: %s", err)
}
task.startTime = time.Now()
ExecuteTask(task, nil)
@@ -73,7 +74,7 @@ func (self *SBaremetalServerStopTask) WaitForStop(ctx context.Context, args inte
isSoft = false
}
if err := self.Baremetal.DoPowerShutdown(isSoft); err != nil {
return errors.Wrap(err, "DoPowerShutdown")
log.Errorf("DoPowerShutdown soft=%v error: %s", isSoft, err)
}
time.Sleep(10 * time.Second)
ExecuteTask(self, nil)

View File

@@ -115,6 +115,8 @@ func (dev *MegaRaidPhyDev) parseLine(line string) bool {
dev.Status = "jbod"
} else if strings.Contains(strings.ToLower(val), "online") {
dev.Status = "online"
} else if val == "Rebuild" {
dev.Status = "rebuild"
} else {
dev.Status = "offline"
}
@@ -624,7 +626,7 @@ func (a StorcliAdaptor) key() string {
}
func (a *StorcliAdaptor) isComplete() bool {
return a.Controller >= 0 && a.key() != ""
return a.Controller >= 0 && a.name != "" && a.sn != ""
}
func (a *StorcliAdaptor) parseLine(l string) {

View File

@@ -56,7 +56,7 @@ func (dev *Mpt2SASRaidPhyDev) parseLine(line string) bool {
}
switch key {
case "Drive Type":
if strings.HasSuffix("_HDD", val) {
if strings.HasSuffix(val, "_HDD") {
dev.Rotate = tristate.True
} else {
dev.Rotate = tristate.False

View File

@@ -0,0 +1,54 @@
// 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.
// Code generated by model-api-gen. DO NOT EDIT.
package db
import (
"context"
"yunion.io/x/sqlchemy"
"yunion.io/x/onecloud/pkg/apis"
"yunion.io/x/onecloud/pkg/mcclient"
)
// +onecloud:model-api-gen
type SAutoDeleteResourceBase struct {
// 是否跟随资源自动删除
// example: false
AutoDelete bool `nullable:"false" default:"false" get:"user" update:"user" json:"auto_delete"`
}
type SAutoDeleteResourceBaseManager struct{}
func (manager *SAutoDeleteResourceBaseManager) ListItemFilter(
ctx context.Context,
q *sqlchemy.SQuery,
userCred mcclient.TokenCredential,
query apis.AutoDeleteResourceBaseListInput,
) (*sqlchemy.SQuery, error) {
if query.AutoDelete != nil {
q = q.Equals("auto_delete", *query.AutoDelete)
}
return q, nil
}
func (self *SAutoDeleteResourceBase) SetAutoDelete(model IModel, userCred mcclient.TokenCredential, autoDelete bool) error {
_, err := Update(model, func() error {
self.AutoDelete = autoDelete
return nil
})
return err
}

View File

@@ -425,9 +425,6 @@ func Query2List(manager IModelManager, ctx context.Context, userCred mcclient.To
extraResults[i].Update(jsonDict)
jsonDict = extraResults[i]
}
if len(exportKeys) > 0 {
jsonDict = jsonDict.CopyIncludes(exportKeys...)
}
if len(fieldFilter) > 0 {
jsonDict = jsonDict.CopyIncludes(fieldFilter...)
}
@@ -791,6 +788,9 @@ func ListItems(manager IModelManager, ctx context.Context, userCred mcclient.Tok
if len(retList) != retCount {
totalCnt = len(retList)
}
if query.Contains("export_keys") {
retList = getExportCols(query, retList)
}
paginate := false
if !customizeFilters.IsEmpty() {
// query not use Limit and Offset, do manual pagination
@@ -822,6 +822,18 @@ func calculateListResult(data []jsonutils.JSONObject, total, limit, offset int64
return &retResult
}
func getExportCols(query jsonutils.JSONObject, retList []jsonutils.JSONObject) []jsonutils.JSONObject {
var exportKeys stringutils2.SSortedStrings
exportKeyStr, _ := query.GetString("export_keys")
exportKeys = stringutils2.NewSortedStrings(strings.Split(exportKeyStr, ","))
for i := range retList {
if len(exportKeys) > 0 {
retList[i] = retList[i].(*jsonutils.JSONDict).CopyIncludes(exportKeys...)
}
}
return retList
}
func (dispatcher *DBModelDispatcher) List(ctx context.Context, query jsonutils.JSONObject, ctxIds []dispatcher.SResourceContext) (*modulebase.ListResult, error) {
userCred := fetchUserCredential(ctx)

View File

@@ -18,6 +18,7 @@ import (
"context"
"crypto/tls"
"fmt"
"sync"
"time"
"go.etcd.io/etcd/clientv3"
@@ -45,7 +46,8 @@ type SEtcdClient struct {
onKeepaliveFailure func()
leaseLiving bool
watchers map[string]*SEtcdWatcher
watchers map[string]*SEtcdWatcher
watchersMu *sync.Mutex
}
func defaultOnKeepAliveFailed() {
@@ -115,6 +117,7 @@ func NewEtcdClient(opt *SEtcdOptions, onKeepaliveFailure func()) (*SEtcdClient,
etcdClient.leaseTtlTimeout = timeoutSeconds
etcdClient.watchers = make(map[string]*SEtcdWatcher)
etcdClient.watchersMu = &sync.Mutex{}
etcdClient.namespace = opt.EtcdNamspace
@@ -306,8 +309,10 @@ func (cli *SEtcdClient) Watch(
onModify TEtcdModifyEventFunc,
onDelete TEtcdDeleteEventFunc,
) error {
cli.watchersMu.Lock()
_, ok := cli.watchers[prefix]
if ok {
cli.watchersMu.Unlock()
return errors.Errorf("watch prefix %s already registered", prefix)
}
@@ -318,6 +323,7 @@ func (cli *SEtcdClient) Watch(
watcher: watcher,
cancel: cancel,
}
cli.watchersMu.Unlock()
prefix = cli.getKey(prefix)
@@ -346,6 +352,8 @@ func (cli *SEtcdClient) Watch(
}
func (cli *SEtcdClient) Unwatch(prefix string) {
cli.watchersMu.Lock()
defer cli.watchersMu.Unlock()
watcher, ok := cli.watchers[prefix]
if ok {
log.Debugf("unwatch %s", prefix)

View File

@@ -47,6 +47,7 @@ var (
ActionPendingDelete SAction = "pending_delete"
ActionRebuildRoot SAction = "rebuild_root"
ActionChangeConfig SAction = "change_config"
ActionChangeIpaddr SAction = "change_ipaddr"
)
type SEvent struct {

View File

@@ -339,7 +339,11 @@ func genMsgViaLang(ctx context.Context, p sNotifyParams) ([]npk.SNotifyMessage,
}
func intelliNotify(ctx context.Context, p sNotifyParams) {
log.Infof("recipientId: %v, contacts: %v, event %s priority %s", p.recipientId, p.contacts, p.event, p.priority)
log.Infof("recipientId: %v, contactType: %s, contacts: %v, event %s priority %s", p.recipientId, p.channel, p.contacts, p.event, p.priority)
// hack
if len(p.recipientId) == 0 && len(p.contacts) == 0 {
p.contacts = []string{""}
}
msgs, err := genMsgViaLang(ctx, p)
if err != nil {
log.Errorf("unable send notification: %v", err)

View File

@@ -77,10 +77,7 @@ type SManagedDBInstanceCreateConfig struct {
type SManagedDBInstanceChangeConfig struct {
DiskSizeGB int
StorageType string
InstanceType string
VcpuCount int
VmemSizeMb int
}
type SDBInstanceDatabaseCreateConfig struct {

View File

@@ -19,6 +19,7 @@ import (
"fmt"
"io"
"net/http"
"reflect"
"regexp"
"sort"
"strconv"
@@ -110,12 +111,15 @@ type SBucketCORSRule struct {
}
type SBucketRefererConf struct {
// 白名单域名列表
WhiteList []string
// 黑名单域名列表
BlackList []string
// 域名列表
DomainList []string
// 域名列表
// enmu: Black-List, White-List
RefererType string
// 是否允许空referer 访问
AllowEmptyRefer bool
Enabled bool
}
type SBucketPolicyStatement struct {
@@ -264,8 +268,7 @@ type ICloudBucket interface {
DeletePolicy(id []string) ([]SBucketPolicyStatement, error)
GetTags() (map[string]string, error)
SetTags(tags map[string]string) error
DeleteTags() error
SetTags(tags map[string]string, replace bool) error
}
type ICloudObject interface {
@@ -829,32 +832,27 @@ func DeleteBucketCORS(ibucket ICloudBucket, id []string) ([]SBucketCORSRule, err
return deletedRules, nil
}
func SetBucketMetadata(ibucket ICloudBucket, tags map[string]string, replace bool) error {
newTags := map[string]string{}
if replace {
newTags = tags
} else {
oldTags, err := ibucket.GetTags()
if err != nil {
return errors.Wrap(err, "b.getTags()")
}
for k, v := range oldTags {
if _, ok := tags[k]; !ok {
tags[k] = v
}
}
newTags = tags
}
if len(newTags) == 0 {
err := ibucket.DeleteTags()
if err != nil {
return errors.Wrap(err, "b.DeleteTags()")
}
} else {
err := ibucket.SetTags(newTags)
if err != nil {
return errors.Wrapf(err, "b.setTags(%s)", jsonutils.Marshal(newTags).String())
}
}
return nil
type TagsUpdateInfo struct {
OldTags map[string]string
NewTags map[string]string
}
func (t TagsUpdateInfo) IsChanged() bool {
return !reflect.DeepEqual(t.OldTags, t.NewTags)
}
func SetBucketTags(iBucket ICloudBucket, tags map[string]string) (TagsUpdateInfo, error) {
ret := TagsUpdateInfo{}
old, err := iBucket.GetTags()
if err != nil {
if errors.Cause(err) == ErrNotImplemented || errors.Cause(err) == ErrNotSupported {
return ret, nil
}
return ret, errors.Wrapf(err, "iBucket.GetTags")
}
ret.OldTags, ret.NewTags = old, tags
if !ret.IsChanged() {
return ret, nil
}
return ret, iBucket.SetTags(tags, true)
}

View File

@@ -480,6 +480,7 @@ func (bucket *SBucket) PostCreate(
query jsonutils.JSONObject,
data jsonutils.JSONObject,
) {
bucket.SSharableVirtualResourceBase.PostCreate(ctx, userCred, ownerId, query, data)
pendingUsage := SRegionQuota{Bucket: 1}
keys, err := bucket.GetQuotaKeys()
if err != nil {
@@ -495,10 +496,10 @@ func (bucket *SBucket) PostCreate(
bucket.SetStatus(userCred, api.BUCKET_STATUS_START_CREATE, "PostCreate")
task, err := taskman.TaskManager.NewTask(ctx, "BucketCreateTask", bucket, userCred, nil, "", "", nil)
if err != nil {
log.Errorf("BucketCreateTask newTask error %s", err)
} else {
task.ScheduleRun(nil)
bucket.SetStatus(userCred, api.BUCKET_STATUS_CREATE_FAIL, errors.Wrapf(err, "NewTask").Error())
return
}
task.ScheduleRun(nil)
}
func (bucket *SBucket) ValidateUpdateData(
@@ -538,15 +539,17 @@ func (bucket *SBucket) RemoteCreate(ctx context.Context, userCred mcclient.Token
if err != nil {
return errors.Wrap(err, "db.SetExternalId")
}
tags, _ := bucket.GetAllUserMetadata()
if len(tags) > 0 {
_, err = cloudprovider.SetBucketTags(extBucket, tags)
if err != nil {
logclient.AddSimpleActionLog(bucket, logclient.ACT_UPDATE_TAGS, err, userCred, false)
}
}
err = bucket.syncWithCloudBucket(ctx, userCred, extBucket, nil, false)
if err != nil {
return errors.Wrap(err, "bucket.syncWithCloudBucket")
}
tags, _ := bucket.GetAllUserMetadata()
err = cloudprovider.SetBucketMetadata(extBucket, tags, false)
if err != nil {
log.Errorf("iBucket.SetMetadata failed: %s", err)
}
return nil
}
@@ -1518,8 +1521,11 @@ func (bucket *SBucket) PerformSetReferer(
if err != nil {
return nil, errors.Wrap(err, "GetIBucket")
}
conf := cloudprovider.SBucketRefererConf{
WhiteList: input.WhiteList,
Enabled: input.Enabled,
DomainList: input.DomainList,
RefererType: input.RefererType,
AllowEmptyRefer: input.AllowEmptyRefer,
}
@@ -1554,9 +1560,12 @@ func (bucket *SBucket) GetDetailsReferer(
if err != nil {
return conf, httperrors.NewInternalServerError("iBucket.GetRefer error %s", err)
}
conf.WhiteList = referConf.WhiteList
conf.BlackList = referConf.BlackList
conf.AllowEmptyRefer = referConf.AllowEmptyRefer
conf.Enabled = referConf.Enabled
if conf.Enabled {
conf.DomainList = referConf.DomainList
conf.RefererType = referConf.RefererType
conf.AllowEmptyRefer = referConf.AllowEmptyRefer
}
return conf, nil
}
@@ -1888,15 +1897,21 @@ func (bucket *SBucket) processObjectsActionInput(input api.BucketObjectsActionIn
func (bucket *SBucket) OnMetadataUpdated(ctx context.Context, userCred mcclient.TokenCredential) {
iBucket, err := bucket.GetIBucket()
if err != nil {
log.Errorf("bucket.GetIBucket() failed: %s", err)
return
}
tags, _ := bucket.GetAllUserMetadata()
err = cloudprovider.SetBucketMetadata(iBucket, tags, false)
tags, err := bucket.GetAllUserMetadata()
if err != nil {
log.Errorf("iBucket.SetMetadata failed: %s", err)
return
}
db.OpsLog.LogEvent(bucket, db.ACT_UPDATE_TAGS, tags, userCred)
diff, err := cloudprovider.SetBucketTags(iBucket, tags)
if err != nil {
logclient.AddSimpleActionLog(bucket, logclient.ACT_UPDATE_TAGS, err, userCred, false)
return
}
if diff.IsChanged() {
logclient.AddSimpleActionLog(bucket, logclient.ACT_UPDATE_TAGS, diff, userCred, true)
}
syncVirtualResourceMetadata(ctx, userCred, bucket, iBucket)
}
func (manager *SBucketManager) ListItemExportKeys(ctx context.Context,

View File

@@ -90,7 +90,7 @@ type SCachedimage struct {
// 镜像类型, system: 公有云镜像, customized: 自定义镜像
// example: system
ImageType string `width:"16" default:"customized" list:"user"`
ImageType string `width:"16" default:"customized" list:"user" index:"true"`
}
func (self *SCachedimage) ValidateDeleteCondition(ctx context.Context) error {

View File

@@ -434,13 +434,41 @@ func (scm *SCloudaccountManager) hostVMIPsPrepareNets(ctx context.Context, clien
// Performpreparenets searches for suitable network facilities for physical and virtual machines under the cloud account or provides configuration recommendations for network facilities before importing a cloud account.
func (scm *SCloudaccountManager) PerformPrepareNets(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, input api.CloudaccountPerformPrepareNetsInput) (api.CloudaccountPerformPrepareNetsOutput, error) {
var (
err error
output api.CloudaccountPerformPrepareNetsOutput
err error
output api.CloudaccountPerformPrepareNetsOutput
networkBits int8
hostNumberUpperLimit int
hostNumberLowerLimit int
)
if input.Provider != api.CLOUD_PROVIDER_VMWARE {
return output, httperrors.NewNotSupportedError("not support for cloudaccount with provider '%s'", input.Provider)
}
// validate first
if input.NetworkBits == nil {
networkBits = 24
} else if *input.NetworkBits <= 0 || *input.NetworkBits >= 32 {
return output, httperrors.NewInputParameterError("invalid network_bits, it should be between 0 and 32")
} else {
networkBits = *input.NetworkBits
}
maxHostNumber := int((1 << uint(32-networkBits)) - 2)
if input.HostNumberUpperLimit == nil {
hostNumberUpperLimit = maxHostNumber
} else if *input.HostNumberUpperLimit > maxHostNumber {
return output, httperrors.NewInputParameterError("invalid host numbers, according to networkBits, it should be between 0 and %d", 2^(32-networkBits)-2)
} else {
hostNumberUpperLimit = *input.HostNumberUpperLimit
}
minHostNumber := 1
if input.HostNumberLowerLimit == nil {
hostNumberLowerLimit = minHostNumber
} else if *input.HostNumberLowerLimit < minHostNumber || *input.HostNumberLowerLimit > hostNumberUpperLimit {
return output, httperrors.NewInputParameterError("invalid host numbers, it should be between %d and %d", minHostNumber, hostNumberUpperLimit)
} else {
hostNumberLowerLimit = *input.HostNumberLowerLimit
}
ownerId, err := scm.FetchOwnerId(ctx, jsonutils.Marshal(input))
if err != nil {
return output, errors.Wrap(err, "FetchOwnerId in PerformPrepareNets")
@@ -541,20 +569,26 @@ func (scm *SCloudaccountManager) PerformPrepareNets(ctx context.Context, userCre
networks[i] = nets
}
return scm.parseAndSuggest(sParseAndSuggest{
NInfos: nInfos,
AccountName: input.Name,
ZoneIds: zoneids,
Wires: wires,
Networks: networks,
NInfos: nInfos,
AccountName: input.Name,
ZoneIds: zoneids,
Wires: wires,
Networks: networks,
NetworkBits: networkBits,
HostNumberUpperLimit: hostNumberUpperLimit,
HostNumberLowerLimit: hostNumberLowerLimit,
}), nil
}
type sParseAndSuggest struct {
NInfos []sNetworkInfo
AccountName string
ZoneIds []string
Wires []SWire
Networks [][]SNetwork
NInfos []sNetworkInfo
AccountName string
ZoneIds []string
Wires []SWire
Networks [][]SNetwork
NetworkBits int8
HostNumberUpperLimit int
HostNumberLowerLimit int
}
func (scm *SCloudaccountManager) parseAndSuggest(params sParseAndSuggest) api.CloudaccountPerformPrepareNetsOutput {
@@ -580,7 +614,6 @@ func (scm *SCloudaccountManager) parseAndSuggest(params sParseAndSuggest) api.Cl
Id: nets[i].Id,
WireId: nets[i].WireId,
})
}
}
ipPoolLen := 0
@@ -662,7 +695,7 @@ func (scm *SCloudaccountManager) parseAndSuggest(params sParseAndSuggest) api.Cl
}
if len(noNetHostIP) > 0 {
sConfs := scm.suggestHostNetworks(noNetHostIP)
sConfs := scm.suggestHostNetworks(noNetHostIP, params.NetworkBits)
confs := make([]api.CANetConf, len(sConfs))
for i := range confs {
confs[i].CASimpleNetConf = sConfs[i]
@@ -704,9 +737,9 @@ func (scm *SCloudaccountManager) parseAndSuggest(params sParseAndSuggest) api.Cl
if _, ok := existedNets.Get(ip); ok {
continue
}
net := ip.NetAddr(24)
netLimitLow := net + 1
netLimitUp := net + 254
net := ip.NetAddr(params.NetworkBits)
netLimitLow := net + netutils.IPV4Addr(params.HostNumberLowerLimit)
netLimitUp := net + netutils.IPV4Addr(params.HostNumberUpperLimit)
// find startip
startIp := ip - 1
for ; startIp >= netLimitLow; startIp-- {
@@ -739,7 +772,7 @@ func (scm *SCloudaccountManager) parseAndSuggest(params sParseAndSuggest) api.Cl
VlanID: vlan,
GuestIpStart: (startIp + 1).String(),
GuestIpEnd: (endIp - 1).String(),
GuestIpMask: 24,
GuestIpMask: params.NetworkBits,
GuestGateway: (net + netutils.IPV4Addr(options.Options.DefaultNetworkGatewayAddressEsxi)).
String(),
},
@@ -795,7 +828,7 @@ func (manager *SCloudaccountManager) fetchEsxiZoneIds() ([]string, error) {
// The suggestHostNetworks give the suggest config of network contains the ip in 'ips'.
// The suggested network mask is 24 and the gateway is x.x.x.1.
// The suggests network is the smallest network segment that meets the above conditions.
func (manager *SCloudaccountManager) suggestHostNetworks(ips []netutils.IPV4Addr) []api.CASimpleNetConf {
func (manager *SCloudaccountManager) suggestHostNetworks(ips []netutils.IPV4Addr, mask int8) []api.CASimpleNetConf {
if len(ips) == 0 {
return nil
}
@@ -803,7 +836,6 @@ func (manager *SCloudaccountManager) suggestHostNetworks(ips []netutils.IPV4Addr
return ips[i] < ips[j]
})
var (
mask int8 = 24
lastnetAddr netutils.IPV4Addr
consequent []netutils.IPV4Addr
ret []api.CASimpleNetConf
@@ -2314,7 +2346,7 @@ func (self *SCloudaccount) AllowPerformEnableAutoSync(ctx context.Context, userC
return db.IsAdminAllowPerform(userCred, self, "enable-auto-sync")
}
func (self *SCloudaccount) PerformEnableAutoSync(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) {
func (self *SCloudaccount) PerformEnableAutoSync(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, input api.CloudaccountEnableAutoSyncInput) (jsonutils.JSONObject, error) {
if self.EnableAutoSync {
return nil, nil
}
@@ -2323,10 +2355,11 @@ func (self *SCloudaccount) PerformEnableAutoSync(ctx context.Context, userCred m
return nil, httperrors.NewInvalidStatusError("cannot enable auto sync in status %s", self.Status)
}
syncIntervalSecs := int64(0)
syncIntervalSecs, _ = data.Int("sync_interval_seconds")
if input.SyncIntervalSeconds < options.Options.MinimalSyncIntervalSeconds {
return nil, httperrors.NewOutOfRangeError("sync_interval_seconds should be greater than %d", options.Options.MinimalSyncIntervalSeconds)
}
self.enableAutoSync(ctx, userCred, int(syncIntervalSecs))
self.enableAutoSync(ctx, userCred, input.SyncIntervalSeconds)
return nil, nil
}
@@ -2444,6 +2477,9 @@ func (account *SCloudaccount) needSync() bool {
if time.Now().Sub(account.LastSyncEndAt) > time.Duration(account.getSyncIntervalSeconds())*time.Second {
return true
}
if account.EnableAutoSync && !account.LastAutoSync.IsZero() && time.Now().Sub(account.LastAutoSync) > time.Duration(account.getSyncIntervalSeconds()-1)*time.Second {
return true
}
return false
}
@@ -2468,7 +2504,7 @@ func (manager *SCloudaccountManager) initAllRecords() {
func (self *SCloudaccount) CanSync() bool {
if self.SyncStatus == api.CLOUD_PROVIDER_SYNC_STATUS_QUEUED || self.SyncStatus == api.CLOUD_PROVIDER_SYNC_STATUS_SYNCING || self.getSyncStatus2() == api.CLOUD_PROVIDER_SYNC_STATUS_SYNCING {
if self.LastSync.IsZero() || time.Now().Sub(self.LastSync) > 1800*time.Second {
if self.LastSync.IsZero() || time.Now().Sub(self.LastSync) > time.Duration(self.getSyncIntervalSeconds())*time.Second {
return true
} else {
return false

View File

@@ -80,8 +80,11 @@ func structureTestData() (sParseAndSuggest, error) {
ZoneIds: []string{
"zone_test",
},
Wires: []SWire{},
Networks: [][]SNetwork{},
Wires: []SWire{},
Networks: [][]SNetwork{},
NetworkBits: 24,
HostNumberUpperLimit: 254,
HostNumberLowerLimit: 1,
}, nil
}

View File

@@ -315,11 +315,11 @@ func (self *SCloudproviderregion) markEndSync(ctx context.Context, userCred mccl
log.Debugf("markEndSync deepSync %v", *deepSync)
err := self.markEndSyncInternal(userCred, syncResults, deepSync)
if err != nil {
return err
return errors.Wrapf(err, "markEndSyncInternal")
}
err = self.GetProvider().markEndSyncWithLock(ctx, userCred)
if err != nil {
return err
return errors.Wrapf(err, "markEndSyncWithLock")
}
return nil
}
@@ -335,8 +335,7 @@ func (self *SCloudproviderregion) markEndSyncInternal(userCred mcclient.TokenCre
return nil
})
if err != nil {
log.Errorf("Failed to markEndSyncInternal error: %v", err)
return err
return errors.Wrapf(err, "db.Update")
}
return nil
}
@@ -373,11 +372,18 @@ func (set SSyncResultSet) Add(manager db.IModelManager, result compare.SyncResul
func (self *SCloudproviderregion) DoSync(ctx context.Context, userCred mcclient.TokenCredential, syncRange SSyncRange) error {
syncResults := SSyncResultSet{}
self.markSyncing(userCred)
defer self.markEndSync(ctx, userCred, syncResults, &syncRange.DeepSync)
localRegion := self.GetRegion()
provider := self.GetProvider()
self.markSyncing(userCred)
defer func() {
err := self.markEndSync(ctx, userCred, syncResults, &syncRange.DeepSync)
if err != nil {
log.Errorf("markEndSync for %s(%s) : %v", localRegion.Name, provider.Name, err)
}
}()
driver, err := provider.GetProvider()
if err != nil {
log.Errorf("Failed to get driver, connection problem?")
@@ -480,7 +486,7 @@ func (cpr *SCloudproviderregion) needAutoSyncInternal() bool {
region := cpr.GetRegion()
log.Debugf("empty region %s! no need to check so frequently", region.GetName())
}
if time.Now().Sub(cpr.LastSyncEndAt) > time.Duration(intval)*time.Second {
if time.Now().Sub(cpr.LastSync) > time.Duration(intval)*time.Second {
return true
}
return false

View File

@@ -181,11 +181,11 @@ func (manager *SCloudproviderManager) GetProviderFieldQuery(field string, isPubl
} else if isOnPremise.IsFalse() {
q = q.Filter(sqlchemy.IsFalse(account.Field("is_on_premise")))
}
if len(providers) > 0 {
q = q.Filter(sqlchemy.In(account.Field("provider"), providers))
}
if len(brands) > 0 {
q = q.Filter(sqlchemy.In(account.Field("brand"), brands))
if len(providers) > 0 || len(brands) > 0 {
q = q.Filter(sqlchemy.OR(
sqlchemy.In(account.Field("provider"), providers),
sqlchemy.In(account.Field("brand"), brands),
))
}
return q.SubQuery()
}
@@ -769,8 +769,7 @@ func (self *SCloudprovider) markEndSync(userCred mcclient.TokenCredential) error
return nil
})
if err != nil {
log.Errorf("Failed to markEndSync error: %v", err)
return err
return errors.Wrapf(err, "markEndSync")
}
return nil
}
@@ -1347,7 +1346,10 @@ func (provider *SCloudprovider) syncCloudproviderRegions(ctx context.Context, us
}
}
if syncCnt == 0 {
provider.markEndSyncWithLock(ctx, userCred)
err := provider.markEndSyncWithLock(ctx, userCred)
if err != nil {
log.Errorf("markEndSyncWithLock for %s error: %v", provider.Name, err)
}
}
}
@@ -1497,27 +1499,53 @@ func (self *SCloudprovider) PerformDisable(ctx context.Context, userCred mcclien
return nil, nil
}
func (manager *SCloudproviderManager) filterByDomainId(q *sqlchemy.SQuery, domainId string) *sqlchemy.SQuery {
subq := db.SharedResourceManager.Query("resource_id")
subq = subq.Equals("resource_type", CloudaccountManager.Keyword())
subq = subq.Equals("target_project_id", domainId)
subq = subq.Equals("target_type", db.SharedTargetDomain)
cloudaccounts := CloudaccountManager.Query().SubQuery()
q = q.Join(cloudaccounts, sqlchemy.Equals(
q.Field("cloudaccount_id"),
cloudaccounts.Field("id"),
))
q = q.Filter(sqlchemy.OR(
sqlchemy.AND(
sqlchemy.Equals(q.Field("domain_id"), domainId),
sqlchemy.Equals(cloudaccounts.Field("share_mode"), api.CLOUD_ACCOUNT_SHARE_MODE_PROVIDER_DOMAIN),
),
sqlchemy.AND(
sqlchemy.Equals(cloudaccounts.Field("share_mode"), api.CLOUD_ACCOUNT_SHARE_MODE_SYSTEM),
sqlchemy.OR(
sqlchemy.AND(
sqlchemy.Equals(cloudaccounts.Field("public_scope"), rbacutils.ScopeNone),
sqlchemy.Equals(cloudaccounts.Field("domain_id"), domainId),
),
sqlchemy.AND(
sqlchemy.Equals(cloudaccounts.Field("public_scope"), rbacutils.ScopeDomain),
sqlchemy.OR(
sqlchemy.Equals(cloudaccounts.Field("domain_id"), domainId),
sqlchemy.In(cloudaccounts.Field("id"), subq.SubQuery()),
),
),
sqlchemy.Equals(cloudaccounts.Field("public_scope"), rbacutils.ScopeSystem),
),
),
sqlchemy.AND(
sqlchemy.Equals(cloudaccounts.Field("domain_id"), domainId),
sqlchemy.Equals(cloudaccounts.Field("share_mode"), api.CLOUD_ACCOUNT_SHARE_MODE_ACCOUNT_DOMAIN),
),
))
return q
}
func (manager *SCloudproviderManager) FilterByOwner(q *sqlchemy.SQuery, owner mcclient.IIdentityProvider, scope rbacutils.TRbacScope) *sqlchemy.SQuery {
if owner != nil {
switch scope {
case rbacutils.ScopeProject, rbacutils.ScopeDomain:
if len(owner.GetProjectDomainId()) > 0 {
cloudaccounts := CloudaccountManager.Query().SubQuery()
q = q.Join(cloudaccounts, sqlchemy.Equals(
q.Field("cloudaccount_id"),
cloudaccounts.Field("id"),
))
q = q.Filter(sqlchemy.OR(
sqlchemy.AND(
sqlchemy.Equals(q.Field("domain_id"), owner.GetProjectDomainId()),
sqlchemy.Equals(cloudaccounts.Field("share_mode"), api.CLOUD_ACCOUNT_SHARE_MODE_PROVIDER_DOMAIN),
),
sqlchemy.Equals(cloudaccounts.Field("share_mode"), api.CLOUD_ACCOUNT_SHARE_MODE_SYSTEM),
sqlchemy.AND(
sqlchemy.Equals(cloudaccounts.Field("domain_id"), owner.GetProjectDomainId()),
sqlchemy.Equals(cloudaccounts.Field("share_mode"), api.CLOUD_ACCOUNT_SHARE_MODE_ACCOUNT_DOMAIN),
),
))
q = manager.filterByDomainId(q, owner.GetProjectDomainId())
}
}
}

View File

@@ -628,28 +628,17 @@ func (manager *SCloudregionManager) InitializeData() error {
}
func getCloudRegionIdByDomainId(domainId string) *sqlchemy.SSubQuery {
accounts := CloudaccountManager.Query().SubQuery()
cloudproviderregions := CloudproviderRegionManager.Query().SubQuery()
providers := CloudproviderManager.Query().SubQuery()
// not managed region
q1 := CloudregionManager.Query("id").Equals("provider", api.CLOUD_PROVIDER_ONECLOUD)
// managed region
q2 := cloudproviderregions.Query(cloudproviderregions.Field("cloudregion_id", "id"))
q2 = q2.Join(providers, sqlchemy.Equals(providers.Field("id"), cloudproviderregions.Field("cloudprovider_id")))
q2 = q2.Join(accounts, sqlchemy.Equals(providers.Field("cloudaccount_id"), accounts.Field("id")))
q2 = q2.Filter(sqlchemy.OR(
sqlchemy.AND(
sqlchemy.Equals(providers.Field("domain_id"), domainId),
sqlchemy.Equals(accounts.Field("share_mode"), api.CLOUD_ACCOUNT_SHARE_MODE_PROVIDER_DOMAIN),
),
sqlchemy.Equals(accounts.Field("share_mode"), api.CLOUD_ACCOUNT_SHARE_MODE_SYSTEM),
sqlchemy.AND(
sqlchemy.Equals(accounts.Field("domain_id"), domainId),
sqlchemy.Equals(accounts.Field("share_mode"), api.CLOUD_ACCOUNT_SHARE_MODE_ACCOUNT_DOMAIN),
),
))
providerIds := CloudproviderManager.Query("id")
providerIds = CloudproviderManager.filterByDomainId(providerIds, domainId)
providersIdsQ := providerIds.Distinct().SubQuery()
q2 = q2.Join(providersIdsQ, sqlchemy.Equals(providersIdsQ.Field("id"), cloudproviderregions.Field("cloudprovider_id")))
return sqlchemy.Union(q1, q2).Query().SubQuery()
}

View File

@@ -45,7 +45,7 @@ type SSyncableBaseResourceManager struct{}
func (self *SSyncableBaseResource) CanSync() bool {
if self.SyncStatus == api.CLOUD_PROVIDER_SYNC_STATUS_QUEUED || self.SyncStatus == api.CLOUD_PROVIDER_SYNC_STATUS_SYNCING {
if self.LastSync.IsZero() || time.Now().Sub(self.LastSync) > 1800*time.Second {
if self.LastSync.IsZero() || time.Now().Sub(self.LastSync) > time.Duration(options.Options.MinimalSyncIntervalSeconds)*time.Second {
return true
} else {
return false

View File

@@ -298,6 +298,11 @@ func (manager *SDBInstanceSkuManager) GetPropertyInstanceSpecs(ctx context.Conte
return nil, errors.Wrap(err, "manager.ListItemFilter")
}
q2, err := manager.ListItemFilter(ctx, manager.Query(), userCred, listQuery)
if err != nil {
return nil, errors.Wrap(err, "manager.ListItemFilter")
}
input := &SDBInstanceSku{}
query.Unmarshal(input)
for k, v := range map[string]interface{}{
@@ -317,15 +322,30 @@ func (manager *SDBInstanceSkuManager) GetPropertyInstanceSpecs(ctx context.Conte
value := v.(string)
if len(value) > 0 {
q = q.Equals(k, v)
q2 = q2.Equals(k, v)
}
case int, int64:
value := fmt.Sprintf("%d", v)
if value != "0" {
q = q.Equals(k, v)
q2 = q2.Equals(k, v)
}
}
}
sq := q2.SubQuery()
q2 = sq.Query(sq.Field("zone1"), sq.Field("zone2"), sq.Field("zone3")).Distinct()
skuZones := []struct {
Zone1 string
Zone2 string
Zone3 string
}{}
err = q2.All(&skuZones)
if err != nil {
return nil, errors.Wrapf(err, "query sku zones")
}
skus := []SDBInstanceSku{}
q = q.GroupBy(q.Field("vcpu_count"), q.Field("vmem_size_mb"))
q = q.Asc(q.Field("vcpu_count"), q.Field("vmem_size_mb"))
@@ -360,23 +380,7 @@ func (manager *SDBInstanceSkuManager) GetPropertyInstanceSpecs(ctx context.Conte
result.Zones.Zone1 = map[string]string{}
result.Zones.Zone2 = map[string]string{}
result.Zones.Zone3 = map[string]string{}
for _, sku := range skus {
if _, ok := result.cpuMemsMb[sku.VcpuCount]; !ok {
result.cpuMemsMb[sku.VcpuCount] = map[int]bool{}
result.CpuMemsMb[fmt.Sprintf("%d", sku.VcpuCount)] = []int{}
result.Cpus = append(result.Cpus, sku.VcpuCount)
}
if _, ok := result.cpuMemsMb[sku.VcpuCount][sku.VmemSizeMb]; !ok {
result.cpuMemsMb[sku.VcpuCount][sku.VmemSizeMb] = true
result.CpuMemsMb[fmt.Sprintf("%d", sku.VcpuCount)] = append(result.CpuMemsMb[fmt.Sprintf("%d", sku.VcpuCount)], sku.VmemSizeMb)
}
if _, ok := result.memsMb[sku.VmemSizeMb]; !ok {
result.memsMb[sku.VmemSizeMb] = true
result.MemsMb = append(result.MemsMb, sku.VmemSizeMb)
}
for _, sku := range skuZones {
if _, ok := result.Zones.Zone1[sku.Zone1]; !ok && len(sku.Zone1) > 0 {
result.Zones.Zone1[sku.Zone1] = sku.Zone1
}
@@ -403,20 +407,36 @@ func (manager *SDBInstanceSkuManager) GetPropertyInstanceSpecs(ctx context.Conte
result.Zones.Zones[zoneId] = zoneId
}
}
zq := ZoneManager.Query("id", "name").In("id", result.zones)
rows, err := zq.Rows()
if err != nil {
return nil, err
}
defer rows.Close()
for rows.Next() {
id, name := "", ""
err = rows.Scan(&id, &name)
if err != nil {
return nil, errors.Wrap(err, "rows.Scan")
for _, sku := range skus {
if _, ok := result.cpuMemsMb[sku.VcpuCount]; !ok {
result.cpuMemsMb[sku.VcpuCount] = map[int]bool{}
result.CpuMemsMb[fmt.Sprintf("%d", sku.VcpuCount)] = []int{}
result.Cpus = append(result.Cpus, sku.VcpuCount)
}
result.zoneNames[id] = name
if _, ok := result.cpuMemsMb[sku.VcpuCount][sku.VmemSizeMb]; !ok {
result.cpuMemsMb[sku.VcpuCount][sku.VmemSizeMb] = true
result.CpuMemsMb[fmt.Sprintf("%d", sku.VcpuCount)] = append(result.CpuMemsMb[fmt.Sprintf("%d", sku.VcpuCount)], sku.VmemSizeMb)
}
if _, ok := result.memsMb[sku.VmemSizeMb]; !ok {
result.memsMb[sku.VmemSizeMb] = true
result.MemsMb = append(result.MemsMb, sku.VmemSizeMb)
}
}
zones := []struct {
Id string
Name string
}{}
err = ZoneManager.Query("id", "name").In("id", result.zones).All(&zones)
if err != nil {
return nil, errors.Wrapf(err, "query zones")
}
for _, zone := range zones {
result.zoneNames[zone.Id] = zone.Name
}
for _, zoneId := range result.Zones.Zone1 {

View File

@@ -420,7 +420,7 @@ func (man *SDBInstanceManager) ValidateCreateData(ctx context.Context, userCred
instance := SDBInstance{}
jsonutils.Update(&instance, input)
skus, err := instance.GetAvailableDBInstanceSkus()
skus, err := instance.GetAvailableDBInstanceSkus(false)
if err != nil {
return input, httperrors.NewGeneralError(err)
}
@@ -1062,57 +1062,20 @@ func (self *SDBInstance) AllowPerformChangeConfig(ctx context.Context, userCred
return self.IsOwner(userCred) || db.IsAdminAllowPerform(userCred, self, "change-config")
}
func (self *SDBInstance) PerformChangeConfig(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) {
func (self *SDBInstance) PerformChangeConfig(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, input api.SDBInstanceChangeConfigInput) (jsonutils.JSONObject, error) {
if !utils.IsInStringArray(self.Status, []string{api.DBINSTANCE_RUNNING}) {
return nil, httperrors.NewInputParameterError("Cannot change config in status %s", self.Status)
}
input := api.SDBInstanceChangeConfigInput{}
err := data.Unmarshal(&input)
if err != nil {
return nil, httperrors.NewInputParameterError("Unmarshal input error: %v", err)
if input.DiskSizeGB != 0 && input.DiskSizeGB < self.DiskSizeGB {
return nil, httperrors.NewUnsupportOperationError("DBInstance Disk cannot be thrink")
}
tmp := &SDBInstance{}
jsonutils.Update(tmp, self)
if len(input.StorageType) > 0 {
self.StorageType = input.StorageType
if input.DiskSizeGB == self.DiskSizeGB && input.InstanceType == self.InstanceType {
return nil, nil
}
changed := false
if len(input.InstanceType) > 0 {
tmp.InstanceType = input.InstanceType
changed = true
} else if input.VCpuCount > 0 {
tmp.VcpuCount = input.VCpuCount
self.InstanceType = ""
changed = true
} else if input.VmemSizeMb > 0 {
tmp.VmemSizeMb = input.VmemSizeMb
tmp.InstanceType = ""
changed = true
} else if len(input.Category) > 0 {
tmp.Category = input.Category
tmp.InstanceType = ""
changed = true
}
if changed {
skus, err := tmp.GetAvailableDBInstanceSkus()
if err != nil {
return nil, httperrors.NewGeneralError(errors.Wrap(err, "self.GetAvailableDBInstanceSkus"))
}
if len(skus) == 0 {
return nil, httperrors.NewInputParameterError("failed to match any skus for change config")
}
}
err = self.GetRegion().GetDriver().ValidateChangeDBInstanceConfigData(ctx, userCred, self, &input)
if err != nil {
return nil, err
}
return nil, self.StartDBInstanceChangeConfig(ctx, userCred, data.(*jsonutils.JSONDict), "")
return nil, self.StartDBInstanceChangeConfig(ctx, userCred, jsonutils.Marshal(input).(*jsonutils.JSONDict), "")
}
func (self *SDBInstance) StartDBInstanceChangeConfig(ctx context.Context, userCred mcclient.TokenCredential, data *jsonutils.JSONDict, parentTaskId string) error {
@@ -1511,14 +1474,18 @@ func (self *SDBInstance) ValidateDeleteCondition(ctx context.Context) error {
return self.SStatusStandaloneResourceBase.ValidateDeleteCondition(ctx)
}
func (self *SDBInstance) GetDBInstanceSkuQuery() *sqlchemy.SQuery {
func (self *SDBInstance) GetDBInstanceSkuQuery(skipZoneCheck bool) *sqlchemy.SQuery {
q := DBInstanceSkuManager.Query().Equals("storage_type", self.StorageType).Equals("category", self.Category).
Equals("cloudregion_id", self.CloudregionId).Equals("engine", self.Engine).Equals("engine_version", self.EngineVersion)
for k, v := range map[string]string{"zone1": self.Zone1, "zone2": self.Zone2, "zone3": self.Zone3} {
if len(v) > 0 {
q = q.Equals(k, v)
if !skipZoneCheck {
for k, v := range map[string]string{"zone1": self.Zone1, "zone2": self.Zone2, "zone3": self.Zone3} {
if len(v) > 0 {
q = q.Equals(k, v)
}
}
}
if len(self.InstanceType) > 0 {
q = q.Equals("name", self.InstanceType)
} else {
@@ -1527,9 +1494,9 @@ func (self *SDBInstance) GetDBInstanceSkuQuery() *sqlchemy.SQuery {
return q
}
func (self *SDBInstance) GetAvailableDBInstanceSkus() ([]SDBInstanceSku, error) {
func (self *SDBInstance) GetAvailableDBInstanceSkus(skipZoneCheck bool) ([]SDBInstanceSku, error) {
skus := []SDBInstanceSku{}
q := self.GetDBInstanceSkuQuery().Equals("status", api.DBINSTANCE_SKU_AVAILABLE)
q := self.GetDBInstanceSkuQuery(skipZoneCheck).Equals("status", api.DBINSTANCE_SKU_AVAILABLE)
err := db.FetchModelObjects(DBInstanceSkuManager, q, &skus)
if err != nil {
return nil, err
@@ -1538,9 +1505,9 @@ func (self *SDBInstance) GetAvailableDBInstanceSkus() ([]SDBInstanceSku, error)
}
func (self *SDBInstance) GetDBInstanceSkus() ([]SDBInstanceSku, error) {
func (self *SDBInstance) GetDBInstanceSkus(skipZoneCheck bool) ([]SDBInstanceSku, error) {
skus := []SDBInstanceSku{}
q := self.GetDBInstanceSkuQuery()
q := self.GetDBInstanceSkuQuery(skipZoneCheck)
err := db.FetchModelObjects(DBInstanceSkuManager, q, &skus)
if err != nil {
return nil, err
@@ -1548,23 +1515,9 @@ func (self *SDBInstance) GetDBInstanceSkus() ([]SDBInstanceSku, error) {
return skus, nil
}
func (self *SDBInstance) GetAvailableZoneIds() ([]string, error) {
zoneIds := []string{}
skus, err := self.GetDBInstanceSkus()
if err != nil {
return nil, errors.Wrap(err, "self.GetDBInstanceSkus")
}
for _, sku := range skus {
if !utils.IsInStringArray(sku.ZoneId, zoneIds) {
zoneIds = append(zoneIds, sku.ZoneId)
}
}
return zoneIds, nil
}
func (self *SDBInstance) GetAvailableInstanceTypes() ([]cloudprovider.SInstanceType, error) {
instanceTypes := []cloudprovider.SInstanceType{}
skus, err := self.GetAvailableDBInstanceSkus()
skus, err := self.GetAvailableDBInstanceSkus(false)
if err != nil {
return nil, errors.Wrap(err, "self.GetAvailableDBInstanceSkus")
}
@@ -1580,7 +1533,7 @@ func (self *SDBInstance) GetAvailableInstanceTypes() ([]cloudprovider.SInstanceT
func (self *SDBInstance) setZoneInfo() error {
sku := SDBInstanceSku{}
q := self.GetDBInstanceSkuQuery()
q := self.GetDBInstanceSkuQuery(false)
count, err := q.CountWithError()
if err != nil {
return errors.Wrapf(err, "q.CountWithError")

View File

@@ -60,6 +60,7 @@ type SDiskManager struct {
SStorageResourceBaseManager
SBillingResourceBaseManager
db.SMultiArchResourceBaseManager
db.SAutoDeleteResourceBaseManager
}
var DiskManager *SDiskManager
@@ -83,6 +84,7 @@ type SDisk struct {
SBillingResourceBase
SStorageResourceBase `width:"128" charset:"ascii" nullable:"true" list:"admin" create:"optional"`
db.SMultiArchResourceBase
db.SAutoDeleteResourceBase
// 磁盘存储类型
// example: qcow2
@@ -93,10 +95,6 @@ type SDisk struct {
// 磁盘路径
AccessPath string `width:"256" charset:"ascii" nullable:"true" get:"user" json:"access_path"`
// 是否跟随云主机自动删除, 仅绑定到云主机时才生效
// example: false
AutoDelete bool `nullable:"false" default:"false" get:"user" update:"user" json:"auto_delete"`
// 存储Id
// StorageId string `width:"128" charset:"ascii" nullable:"true" list:"admin" create:"optional"`
@@ -174,6 +172,11 @@ func (manager *SDiskManager) ListItemFilter(
return nil, errors.Wrap(err, "SMultiArchResourceBaseManager.ListItemFilter")
}
q, err = manager.SAutoDeleteResourceBaseManager.ListItemFilter(ctx, q, userCred, query.AutoDeleteResourceBaseListInput)
if err != nil {
return nil, errors.Wrapf(err, "SAutoDeleteResourceBaseManager.ListItemFilter")
}
if query.Unused != nil {
guestdisks := GuestdiskManager.Query().SubQuery()
sq := guestdisks.Query(guestdisks.Field("disk_id"))
@@ -224,14 +227,6 @@ func (manager *SDiskManager) ListItemFilter(
q = q.Equals("disk_size", query.DiskSize)
}
if query.AutoDelete != nil {
if *query.AutoDelete {
q = q.IsTrue("auto_delete")
} else {
q = q.IsFalse("auto_delete")
}
}
if len(query.FsFormat) > 0 {
q = q.Equals("fs_format", query.FsFormat)
}

View File

@@ -83,7 +83,7 @@ type SElasticcache struct {
SZoneResourceBase
// 备可用区
SlaveZones string `width:"128" charset:"ascii" nullable:"false" list:"user" create:"optional" json:"slave_zones"`
SlaveZones string `width:"512" charset:"ascii" nullable:"false" list:"user" create:"optional" json:"slave_zones"`
// 实例规格
// example: redis.master.micro.default
@@ -757,24 +757,28 @@ func (manager *SElasticcacheManager) AllowCreateItem(ctx context.Context, userCr
}
func (manager *SElasticcacheManager) BatchCreateValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) {
input, err := manager.validateCreateData(ctx, userCred, ownerId, query, data)
_data := api.ElasticcacheCreateInput{}
err := data.Unmarshal(&_data)
if err != nil {
return nil, err
return nil, errors.Wrap(err, "ElasticcacheCreateInput.Unmarshal")
}
input, err := manager.validateCreateData(ctx, userCred, ownerId, query, _data)
if err != nil {
return nil, errors.Wrap(err, "validateCreateData")
}
return input, nil
}
func (manager *SElasticcacheManager) ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, input api.ElasticcacheCreateInput) (*jsonutils.JSONDict, error) {
data := input.JSON(&input)
return manager.validateCreateData(ctx, userCred, ownerId, query, data)
return manager.validateCreateData(ctx, userCred, ownerId, query, input)
}
func (manager *SElasticcacheManager) validateCreateData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) {
func (manager *SElasticcacheManager) validateCreateData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, input api.ElasticcacheCreateInput) (*jsonutils.JSONDict, error) {
var region *SCloudregion
var provider *SCloudprovider
if id, _ := data.GetString("network"); len(id) > 0 {
network, err := db.FetchByIdOrName(NetworkManager, userCred, strings.Split(id, ",")[0])
if len(input.Network) > 0 {
network, err := db.FetchByIdOrName(NetworkManager, userCred, strings.Split(input.Network, ",")[0])
if err != nil {
return nil, fmt.Errorf("getting network failed")
}
@@ -788,34 +792,28 @@ func (manager *SElasticcacheManager) validateCreateData(ctx context.Context, use
}
// postpiad billing cycle
billingType, _ := data.GetString("billing_type")
if billingType == billing_api.BILLING_TYPE_POSTPAID {
billingCycle, _ := data.GetString("duration")
if len(billingCycle) > 0 {
cycle, err := bc.ParseBillingCycle(billingCycle)
if input.BillingType == billing_api.BILLING_TYPE_POSTPAID {
_cycle := input.Duration
if len(_cycle) > 0 {
cycle, err := bc.ParseBillingCycle(_cycle)
if err != nil {
return nil, httperrors.NewInputParameterError("invalid billing_cycle %s", billingCycle)
return nil, httperrors.NewInputParameterError("invalid billing_cycle %s", _cycle)
}
tm := time.Time{}
data.Set("billing_cycle", jsonutils.NewString(cycle.String()))
data.Set("expired_at", jsonutils.NewString(cycle.EndAt(tm).Format("2006-01-02 15:04:05")))
input.BillingCycle = cycle.String()
// .Format("2006-01-02 15:04:05")
input.ExpiredAt = cycle.EndAt(tm)
}
}
input := apis.VirtualResourceCreateInput{}
var err error
err = data.Unmarshal(&input)
input.VirtualResourceCreateInput, err = manager.SVirtualResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, input.VirtualResourceCreateInput)
if err != nil {
return nil, httperrors.NewInternalServerError("unmarshal VirtualResourceCreateInput fail %s", err)
return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ValidateCreateData")
}
input, err = manager.SVirtualResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, input)
if err != nil {
return nil, err
}
data.Update(jsonutils.Marshal(input))
ret, err := region.GetDriver().ValidateCreateElasticcacheData(ctx, userCred, nil, data)
ret, err := region.GetDriver().ValidateCreateElasticcacheData(ctx, userCred, nil, input)
if err != nil {
return nil, errors.Wrap(err, "region.GetDriver().ValidateCreateElasticcacheData")
}
@@ -866,6 +864,36 @@ func (self *SElasticcache) StartElasticcacheCreateTask(ctx context.Context, user
return nil
}
func (self *SElasticcache) GetSlaveZones() ([]SZone, error) {
if len(self.SlaveZones) > 0 {
zones := []SZone{}
sz := strings.Split(self.SlaveZones, ",")
err := ZoneManager.Query().In("id", sz).All(&zones)
if err != nil {
return nil, errors.Wrap(err, "GetZones")
}
zoneMap := map[string]SZone{}
for i := range zones {
zoneMap[zones[i].GetId()] = zones[i]
}
ret := make([]SZone, len(sz))
for i := range sz {
z, ok := zoneMap[sz[i]]
if !ok {
return nil, fmt.Errorf("zone %s is not found", sz[i])
}
ret[i] = z
}
return ret, nil
}
return []SZone{}, nil
}
/*func (self *SElasticcache) GetIRegion() (cloudprovider.ICloudRegion, error) {
provider, err := self.GetDriver()
if err != nil {
@@ -1080,11 +1108,21 @@ func (self *SElasticcache) GetCreateQCloudElasticcacheParams(data *jsonutils.JSO
zone := self.GetZone()
if zone != nil {
izone, err := iregion.GetIZoneById(zone.ExternalId)
zones := []SZone{*zone}
// slave zones
sz, err := self.GetSlaveZones()
if err != nil {
return nil, errors.Wrap(err, "elasticcache.GetCreateHuaweiElasticcacheParams.Zone")
return nil, errors.Wrap(err, "GetSlaveZones")
}
zones = append(zones, sz...)
for i := range zones {
izone, err := iregion.GetIZoneById(zones[i].ExternalId)
if err != nil {
return nil, errors.Wrap(err, "elasticcache.GetCreateHuaweiElasticcacheParams.Zone")
}
input.ZoneIds = append(input.ZoneIds, izone.GetId())
}
input.ZoneIds = []string{izone.GetId()}
}
switch self.BillingType {

View File

@@ -1086,24 +1086,17 @@ func (self *SGuest) StartSyncstatus(ctx context.Context, userCred mcclient.Token
func (self *SGuest) StartAutoDeleteGuestTask(ctx context.Context, userCred mcclient.TokenCredential, parentTaskId string) error {
db.OpsLog.LogEvent(self, db.ACT_DELETE, "auto-delete after stop", userCred)
return self.StartDeleteGuestTask(ctx, userCred, parentTaskId, false, false, false)
opts := api.ServerDeleteInput{}
return self.StartDeleteGuestTask(ctx, userCred, parentTaskId, opts)
}
func (self *SGuest) StartDeleteGuestTask(
ctx context.Context, userCred mcclient.TokenCredential, parentTaskId string,
isPurge, overridePendingDelete, deleteSnapshots bool,
opts api.ServerDeleteInput,
) error {
params := jsonutils.NewDict()
params.Add(jsonutils.NewString(self.Status), "guest_status")
if isPurge {
params.Add(jsonutils.JSONTrue, "purge")
}
if overridePendingDelete {
params.Add(jsonutils.JSONTrue, "override_pending_delete")
}
if deleteSnapshots {
params.Add(jsonutils.JSONTrue, "delete_snapshots")
}
params.Update(jsonutils.Marshal(opts))
self.SetStatus(userCred, api.VM_START_DELETE, "")
return self.GetDriver().StartDeleteGuestTask(ctx, userCred, self, params, parentTaskId)
}
@@ -1400,7 +1393,10 @@ func (self *SGuest) PerformPurge(ctx context.Context, userCred mcclient.TokenCre
if host != nil && host.GetEnabled() {
return nil, httperrors.NewInvalidStatusError("Cannot purge server on enabled host")
}
err = self.StartDeleteGuestTask(ctx, userCred, "", true, false, false)
opts := api.ServerDeleteInput{
Purge: true,
}
err = self.StartDeleteGuestTask(ctx, userCred, "", opts)
return nil, err
}
@@ -2131,6 +2127,7 @@ func (self *SGuest) PerformChangeIpaddr(ctx context.Context, userCred mcclient.T
notes.Add(jsonutils.NewString(ngn[0].IpAddr), "ip")
}
logclient.AddActionLogWithContext(ctx, self, logclient.ACT_VM_CHANGE_NIC, notes, userCred, true)
notifyclient.NotifyWebhook(ctx, userCred, self, notifyclient.ActionChangeIpaddr)
err = self.StartSyncTask(ctx, userCred, true, "")
return nil, err
@@ -2219,7 +2216,7 @@ func (self *SGuest) PerformAttachnetwork(ctx context.Context, userCred mcclient.
if err != nil {
return nil, err
}
if IsExitNetworkInfo(input.Nets[i]) {
if IsExitNetworkInfo(userCred, input.Nets[i]) {
enicCnt = count
// ebw = input.BwLimit
} else {

View File

@@ -1747,7 +1747,7 @@ func getGuestResourceRequirements(
eBw := 0
iBw := 0
for _, netConfig := range input.Networks {
if IsExitNetworkInfo(netConfig) {
if IsExitNetworkInfo(userCred, netConfig) {
eNicCnt += 1
eBw += netConfig.BwLimit
} else {
@@ -2676,8 +2676,9 @@ func (manager *SGuestManager) TotalCount(
status []string, hypervisors []string,
includeSystem bool, pendingDelete bool,
hostTypes []string, resourceTypes []string, providers []string, brands []string, cloudEnv string,
since *time.Time,
) SGuestCountStat {
return usageTotalGuestResouceCount(scope, ownerId, rangeObjs, status, hypervisors, includeSystem, pendingDelete, hostTypes, resourceTypes, providers, brands, cloudEnv)
return usageTotalGuestResouceCount(scope, ownerId, rangeObjs, status, hypervisors, includeSystem, pendingDelete, hostTypes, resourceTypes, providers, brands, cloudEnv, since)
}
func (self *SGuest) detachNetworks(ctx context.Context, userCred mcclient.TokenCredential, gns []SGuestnetwork, reserve bool, deploy bool) error {
@@ -2701,12 +2702,26 @@ func (self *SGuest) getAttach2NetworkCount(net *SNetwork) (int, error) {
return q.CountWithError()
}
func (self *SGuest) getMaxNicIndex() int8 {
func (self *SGuest) getUsableNicIndex() int8 {
nics, err := self.GetNetworks("")
if err != nil {
return -1
}
return int8(len(nics))
maxIndex := int8(len(nics))
for i := int8(0); i <= maxIndex; i++ {
found := true
for j := range nics {
if nics[j].Index == i {
found = false
break
}
}
if found {
return i
}
}
panic(fmt.Sprintf("cannot find usable nic index for guest %s(%s)",
self.Name, self.Id))
}
func (self *SGuest) setOSProfile(ctx context.Context, userCred mcclient.TokenCredential, profile jsonutils.JSONObject) error {
@@ -2847,7 +2862,7 @@ func (self *SGuest) attach2NetworkOnce(
nicDriver = args.nicDriver
)
if index < 0 {
index = self.getMaxNicIndex()
index = self.getUsableNicIndex()
}
if nicDriver == "" {
osProf := self.GetOSProfile()
@@ -3272,9 +3287,10 @@ func usageTotalGuestResouceCount(
hostTypes []string,
resourceTypes []string,
providers []string, brands []string, cloudEnv string,
since *time.Time,
) SGuestCountStat {
q, guests := _guestResourceCountQuery(scope, ownerId, rangeObjs, status, hypervisors,
pendingDelete, hostTypes, resourceTypes, providers, brands, cloudEnv)
pendingDelete, hostTypes, resourceTypes, providers, brands, cloudEnv, since)
if !includeSystem {
q = q.Filter(sqlchemy.OR(
sqlchemy.IsNull(guests.Field("is_system")), sqlchemy.IsFalse(guests.Field("is_system"))))
@@ -3302,6 +3318,7 @@ func _guestResourceCountQuery(
hostTypes []string,
resourceTypes []string,
providers []string, brands []string, cloudEnv string,
since *time.Time,
) (*sqlchemy.SQuery, *sqlchemy.SSubQuery) {
guestdisks := GuestdiskManager.Query().SubQuery()
@@ -3328,7 +3345,12 @@ func _guestResourceCountQuery(
isoDevSubQuery := isoDevQuery.SubQuery()
guests := GuestManager.Query().SubQuery()
var guests *sqlchemy.SSubQuery
if since != nil && !since.IsZero() {
guests = GuestManager.RawQuery().SubQuery()
} else {
guests = GuestManager.Query().SubQuery()
}
guestBackupSubQuery := GuestManager.Query(
"id",
"vcpu_count",
@@ -3377,6 +3399,11 @@ func _guestResourceCountQuery(
} else {
q = q.Filter(sqlchemy.OR(sqlchemy.IsNull(guests.Field("pending_deleted")), sqlchemy.IsFalse(guests.Field("pending_deleted"))))
}
if since != nil && !since.IsZero() {
q = q.Filter(sqlchemy.GT(guests.Field("created_at"), *since))
}
return q, guests
}
@@ -3803,18 +3830,9 @@ func (self *SGuest) AllowDeleteItem(ctx context.Context, userCred mcclient.Token
return self.IsOwner(userCred) || db.IsAdminAllowDelete(userCred, self)
}
func (self *SGuest) CustomizeDelete(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) error {
var (
overridePendingDelete = false
purge = false
deleteSnapshots = false
)
if query != nil {
overridePendingDelete = jsonutils.QueryBoolean(query, "override_pending_delete", false)
purge = jsonutils.QueryBoolean(query, "purge", false)
deleteSnapshots = jsonutils.QueryBoolean(query, "delete_snapshots", false)
}
return self.StartDeleteGuestTask(ctx, userCred, "", purge, overridePendingDelete, deleteSnapshots)
// 删除虚拟机
func (self *SGuest) CustomizeDelete(ctx context.Context, userCred mcclient.TokenCredential, query api.ServerDeleteInput, data jsonutils.JSONObject) error {
return self.StartDeleteGuestTask(ctx, userCred, "", query)
}
func (self *SGuest) DeleteAllDisksInDB(ctx context.Context, userCred mcclient.TokenCredential) error {
@@ -4624,7 +4642,10 @@ func (manager *SGuestManager) CleanPendingDeleteServers(ctx context.Context, use
return
}
for i := 0; i < len(guests); i += 1 {
guests[i].StartDeleteGuestTask(ctx, userCred, "", false, true, false)
opts := api.ServerDeleteInput{
OverridePendingDelete: true,
}
guests[i].StartDeleteGuestTask(ctx, userCred, "", opts)
}
}
@@ -4695,7 +4716,7 @@ func (manager *SGuestManager) DeleteExpiredPrepaidServers(ctx context.Context, u
if guests == nil {
return
}
deteleSnapshot := options.Options.DeleteSnapshotExpiredRelease
deleteSnapshot := options.Options.DeleteSnapshotExpiredRelease
for i := 0; i < len(guests); i += 1 {
// fake delete expired prepaid servers
if len(guests[i].ExternalId) > 0 {
@@ -4705,7 +4726,10 @@ func (manager *SGuestManager) DeleteExpiredPrepaidServers(ctx context.Context, u
}
}
guests[i].SetDisableDelete(userCred, false)
guests[i].StartDeleteGuestTask(ctx, userCred, "", false, false, deteleSnapshot)
opts := api.ServerDeleteInput{
DeleteSnapshots: deleteSnapshot,
}
guests[i].StartDeleteGuestTask(ctx, userCred, "", opts)
}
}
@@ -4741,7 +4765,8 @@ func (manager *SGuestManager) DeleteExpiredPostpaidServers(ctx context.Context,
}
}
guests[i].SetDisableDelete(userCred, false)
guests[i].StartDeleteGuestTask(ctx, userCred, "", false, false, deleteSnapshot)
opts := api.ServerDeleteInput{DeleteSnapshots: deleteSnapshot}
guests[i].StartDeleteGuestTask(ctx, userCred, "", opts)
}
}

View File

@@ -90,7 +90,10 @@ func (self *SGuest) DoPerformPrepaidRecycle(ctx context.Context, userCred mcclie
logclient.AddActionLogWithContext(ctx, self, logclient.ACT_RECYCLE_PREPAID, self.GetShortDesc(ctx), userCred, true)
if autoDelete {
self.StartDeleteGuestTask(ctx, userCred, "", false, true, false)
opts := api.ServerDeleteInput{
OverridePendingDelete: true,
}
self.StartDeleteGuestTask(ctx, userCred, "", opts)
}
return nil, nil

View File

@@ -2567,7 +2567,7 @@ func (manager *SHostManager) totalCountQ(
iq.Field("isolated_reserved_storage"),
)
q = AttachUsageQuery(q, hosts, hostTypes, resourceTypes, providers, brands, cloudEnv, rangeObjs)
log.Debugf("hostCount: %s", q.String())
// log.Debugf("hostCount: %s", q.String())
return q
}
@@ -3971,7 +3971,7 @@ func (self *SHost) AllowPerformIpmiProbe(ctx context.Context,
}
func (self *SHost) PerformIpmiProbe(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) {
if utils.IsInStringArray(self.Status, []string{api.BAREMETAL_INIT, api.BAREMETAL_READY, api.BAREMETAL_RUNNING}) {
if utils.IsInStringArray(self.Status, []string{api.BAREMETAL_INIT, api.BAREMETAL_READY, api.BAREMETAL_RUNNING, api.BAREMETAL_PROBE_FAIL}) {
return nil, self.StartIpmiProbeTask(ctx, userCred, "")
}
return nil, httperrors.NewInvalidStatusError("Cannot do Ipmi-probe in status %s", self.Status)

View File

@@ -239,7 +239,7 @@ func (self *SInstanceSnapshot) getMoreDetails(userCred mcclient.TokenCredential,
out.StorageType = snapshots[i].GetStorageType()
}
}
} else {
} else if guest != nil {
out.Size = self.SizeMb
disk, err := guest.GetSystemDisk()
if err != nil {

View File

@@ -816,13 +816,8 @@ func (lblis *SLoadbalancerListener) GetLoadbalancerCertificate() (*SCachedLoadba
return nil, nil
}
region := lblis.GetRegion()
if region == nil {
return nil, errors.Wrap(httperrors.ErrInvalidStatus, "loadbalancer listener is not attached to any region")
}
ret := &SCachedLoadbalancerCertificate{}
err := CachedLoadbalancerCertificateManager.Query().Equals("id", lblis.CachedCertificateId).Equals("cloudregion_id", region.Id).IsFalse("pending_deleted").First(ret)
err := CachedLoadbalancerCertificateManager.Query().Equals("id", lblis.CachedCertificateId).IsFalse("pending_deleted").First(ret)
if err != nil {
if err == sql.ErrNoRows {
return nil, nil

View File

@@ -916,7 +916,7 @@ func (manager *SNetworkManager) TotalPortCount(
userCred mcclient.IIdentityProvider,
providers []string, brands []string, cloudEnv string,
rangeObjs []db.IStandaloneModel,
) NetworkPortStat {
) map[string]NetworkPortStat {
nets := make([]SNetwork, 0)
err := manager.totalPortCountQ(
scope,
@@ -927,17 +927,32 @@ func (manager *SNetworkManager) TotalPortCount(
if err != nil {
log.Errorf("TotalPortCount: %v", err)
}
ct := 0
ctExt := 0
ret := make(map[string]NetworkPortStat)
for _, net := range nets {
var stat NetworkPortStat
var allStat NetworkPortStat
if len(net.ServerType) > 0 {
stat, _ = ret[net.ServerType]
}
allStat, _ = ret[""]
count := net.getIPRange().AddressCount()
if net.IsExitNetwork() {
ctExt += count
if len(net.ServerType) > 0 {
stat.CountExt += count
}
allStat.CountExt += count
} else {
ct += count
if len(net.ServerType) > 0 {
stat.Count += count
}
allStat.Count += count
}
if len(net.ServerType) > 0 {
ret[net.ServerType] = stat
}
ret[""] = allStat
}
return NetworkPortStat{Count: ct, CountExt: ctExt}
return ret
}
type SNicConfig struct {
@@ -1042,9 +1057,9 @@ func isValidNetworkInfo(userCred mcclient.TokenCredential, netConfig *api.Networ
return nil
}
func IsExitNetworkInfo(netConfig *api.NetworkConfig) bool {
func IsExitNetworkInfo(userCred mcclient.TokenCredential, netConfig *api.NetworkConfig) bool {
if len(netConfig.Network) > 0 {
netObj, _ := NetworkManager.FetchById(netConfig.Network)
netObj, _ := NetworkManager.FetchByIdOrName(userCred, netConfig.Network)
net := netObj.(*SNetwork)
if net.IsExitNetwork() {
return true
@@ -1621,6 +1636,10 @@ func (self *SNetwork) validateUpdateData(ctx context.Context, userCred mcclient.
if endIp.NetAddr(masklen) != netAddr {
return input, httperrors.NewInputParameterError("start, end ip must be in the same subnet")
}
} else {
startIp, _ = netutils.NewIPV4Addr(self.GuestIpStart)
endIp, _ = netutils.NewIPV4Addr(self.GuestIpEnd)
netAddr = startIp.NetAddr(masklen)
}
for key, ipStr := range map[string]string{

View File

@@ -188,7 +188,7 @@ func (self *SQuota) FetchUsage(ctx context.Context) error {
diskSize := totalDiskSize(scope, ownerId, tristate.None, tristate.None, false, false, rangeObjs, providers, brands, keys.CloudEnv, hypervisors)
guest := usageTotalGuestResouceCount(scope, ownerId, rangeObjs, nil, hypervisors, false, false, nil, nil, providers, brands, keys.CloudEnv)
guest := usageTotalGuestResouceCount(scope, ownerId, rangeObjs, nil, hypervisors, false, false, nil, nil, providers, brands, keys.CloudEnv, nil)
self.Count = guest.TotalGuestCount
self.Cpu = guest.TotalCpuCount

View File

@@ -159,14 +159,13 @@ type IDBInstanceDriver interface {
ValidateCreateDBInstanceAccountData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, instance *SDBInstance, input api.DBInstanceAccountCreateInput) (api.DBInstanceAccountCreateInput, error)
ValidateCreateDBInstanceDatabaseData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, instance *SDBInstance, input api.DBInstanceDatabaseCreateInput) (api.DBInstanceDatabaseCreateInput, error)
ValidateCreateDBInstanceBackupData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, instance *SDBInstance, input api.DBInstanceBackupCreateInput) (api.DBInstanceBackupCreateInput, error)
ValidateChangeDBInstanceConfigData(ctx context.Context, userCred mcclient.TokenCredential, instance *SDBInstance, input *api.SDBInstanceChangeConfigInput) error
ValidateDBInstanceAccountPrivilege(ctx context.Context, userCred mcclient.TokenCredential, instance *SDBInstance, account string, privilege string) error
ValidateResetDBInstancePassword(ctx context.Context, userCred mcclient.TokenCredential, instance *SDBInstance, account string) error
RequestCreateDBInstance(ctx context.Context, userCred mcclient.TokenCredential, dbinstance *SDBInstance, task taskman.ITask) error
RequestCreateDBInstanceFromBackup(ctx context.Context, userCred mcclient.TokenCredential, dbinstance *SDBInstance, task taskman.ITask) error
RequestCreateDBInstanceBackup(ctx context.Context, userCred mcclient.TokenCredential, instance *SDBInstance, backup *SDBInstanceBackup, task taskman.ITask) error
RequestChangeDBInstanceConfig(ctx context.Context, userCred mcclient.TokenCredential, instance *SDBInstance, task taskman.ITask) error
RequestChangeDBInstanceConfig(ctx context.Context, userCred mcclient.TokenCredential, instance *SDBInstance, input *api.SDBInstanceChangeConfigInput, task taskman.ITask) error
IsSupportedDBInstance() bool
IsSupportedDBInstanceAutoRenew() bool
@@ -191,7 +190,7 @@ type IElasticcacheDriver interface {
AllowCreateElasticcacheBackup(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, elasticcache *SElasticcache) error
AllowUpdateElasticcacheAuthMode(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, elasticcache *SElasticcache) error
ValidateCreateElasticcacheData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error)
ValidateCreateElasticcacheData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, input api.ElasticcacheCreateInput) (*jsonutils.JSONDict, error)
ValidateCreateElasticcacheAccountData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error)
ValidateCreateElasticcacheAclData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error)
ValidateCreateElasticcacheBackupData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error)

View File

@@ -167,8 +167,8 @@ func (manager *SReservedipManager) GetReservedIP(network *SNetwork, ip string) *
func (manager *SReservedipManager) GetReservedIPs(network *SNetwork) []SReservedip {
rips := make([]SReservedip, 0)
now := time.Now().UTC()
q := manager.Query().Equals("network_id", network.Id).GT("expired_at", now)
q := manager.Query().Equals("network_id", network.Id)
q = filterExpiredReservedIps(q)
err := db.FetchModelObjects(manager, q, &rips)
if err != nil {
log.Errorf("GetReservedIPs fail: %s", err)

View File

@@ -219,6 +219,13 @@ func (manager *SSchedtagManager) ListItemFilter(
q = q.In("default_strategy", query.DefaultStrategy)
}
if len(query.CloudproviderId) > 0 {
hostSubq := HostManager.Query("id").Equals("manager_id", query.CloudproviderId).SubQuery()
hostSchedtagQ := HostschedtagManager.Query("schedtag_id")
hostSchedtagSubq := hostSchedtagQ.Join(hostSubq, sqlchemy.Equals(hostSchedtagQ.Field("host_id"), hostSubq.Field("id"))).SubQuery()
q = q.Join(hostSchedtagSubq, sqlchemy.Equals(q.Field("id"), hostSchedtagSubq.Field("schedtag_id")))
}
return q, nil
}

View File

@@ -71,10 +71,10 @@ type SStorage struct {
SZoneResourceBase `update:""`
// 容量大小,单位Mb
Capacity int64 `nullable:"false" list:"domain" update:"domain" create:"domain_required"`
Capacity int64 `nullable:"false" list:"user" update:"domain" create:"domain_required"`
// 实际容量大小单位Mb
// we always expect actual capacity great or equal than zero, otherwise something wrong
ActualCapacityUsed int64 `nullable:"true" list:"domain" update:"domain" create:"domain_optional"`
ActualCapacityUsed int64 `nullable:"true" list:"user" update:"domain" create:"domain_optional"`
// 预留容量大小
Reserved int64 `nullable:"true" default:"0" list:"domain" update:"domain"`
// 存储类型

View File

@@ -143,6 +143,10 @@ func (manager *SVpcPeeringConnectionManager) ValidateCreateData(
}
peerVpc := _peerVpc.(*SVpc)
if len(vpc.ManagerId) == 0 || len(peerVpc.ManagerId) == 0 {
return input, httperrors.NewInputParameterError("Only public cloud support vpcpeering")
}
// get account,providerFactory
account := vpc.GetCloudaccount()
peerAccount := peerVpc.GetCloudaccount()

View File

@@ -458,32 +458,57 @@ func (manager *SWireManager) newFromCloudWire(ctx context.Context, userCred mccl
return &wire, nil
}
func filterByScopeOwnerId(q *sqlchemy.SQuery, scope rbacutils.TRbacScope, ownerId mcclient.IIdentityProvider) *sqlchemy.SQuery {
func filterByScopeOwnerId(q *sqlchemy.SQuery, scope rbacutils.TRbacScope, ownerId mcclient.IIdentityProvider, domainResource bool) *sqlchemy.SQuery {
switch scope {
case rbacutils.ScopeSystem:
case rbacutils.ScopeDomain:
q = q.Equals("domain_id", ownerId.GetProjectDomainId())
case rbacutils.ScopeProject:
q = q.Equals("tenant_id", ownerId.GetProjectId())
if domainResource {
q = q.Equals("domain_id", ownerId.GetProjectId())
} else {
q = q.Equals("tenant_id", ownerId.GetProjectId())
}
}
return q
}
func fixVmwareProvider(providers []string) (bool, []string) {
findVmware := false
findOnecloud := false
newp := make([]string, 0)
for _, p := range providers {
if p == api.CLOUD_PROVIDER_VMWARE {
findVmware = true
} else {
if p == api.CLOUD_PROVIDER_ONECLOUD {
findOnecloud = true
}
newp = append(newp, p)
}
}
if findVmware && !findOnecloud {
newp = append(newp, api.CLOUD_PROVIDER_ONECLOUD)
}
return findVmware, newp
}
func (manager *SWireManager) totalCountQ(
rangeObjs []db.IStandaloneModel,
hostTypes []string,
hostTypes []string, hostProviders, hostBrands []string,
providers []string, brands []string, cloudEnv string,
scope rbacutils.TRbacScope,
ownerId mcclient.IIdentityProvider,
) *sqlchemy.SQuery {
guestsQ := filterByScopeOwnerId(GuestManager.Query(), scope, ownerId)
guestsQ := filterByScopeOwnerId(GuestManager.Query(), scope, ownerId, false)
guests := guestsQ.SubQuery()
// hosts no filter, for guest networks
hostsQ := HostManager.Query()
if len(hostTypes) > 0 {
hostsQ = hostsQ.In("host_type", hostTypes)
}
if len(providers) > 0 || len(brands) > 0 || len(cloudEnv) > 0 {
if len(hostProviders) > 0 || len(hostBrands) > 0 || len(cloudEnv) > 0 {
hostsQ = CloudProviderFilter(hostsQ, hostsQ.Field("manager_id"), providers, brands, cloudEnv)
}
if len(rangeObjs) > 0 {
@@ -491,9 +516,23 @@ func (manager *SWireManager) totalCountQ(
}
hosts := hostsQ.SubQuery()
groups := filterByScopeOwnerId(GroupManager.Query(), scope, ownerId).SubQuery()
// hosts filter by owner, for host networks
hostsQ2 := HostManager.Query()
hostsQ2 = filterByScopeOwnerId(hostsQ2, scope, ownerId, true)
if len(hostTypes) > 0 {
hostsQ2 = hostsQ2.In("host_type", hostTypes)
}
if len(hostProviders) > 0 || len(hostBrands) > 0 || len(cloudEnv) > 0 {
hostsQ2 = CloudProviderFilter(hostsQ2, hostsQ2.Field("manager_id"), providers, brands, cloudEnv)
}
if len(rangeObjs) > 0 {
hostsQ2 = RangeObjectsFilter(hostsQ2, rangeObjs, nil, hostsQ.Field("zone_id"), hostsQ.Field("manager_id"), hostsQ.Field("id"), nil)
}
hosts2 := hostsQ2.SubQuery()
lbsQ := filterByScopeOwnerId(LoadbalancerManager.Query(), scope, ownerId)
groups := filterByScopeOwnerId(GroupManager.Query(), scope, ownerId, false).SubQuery()
lbsQ := filterByScopeOwnerId(LoadbalancerManager.Query(), scope, ownerId, false)
if len(providers) > 0 || len(brands) > 0 || len(cloudEnv) > 0 {
lbsQ = CloudProviderFilter(lbsQ, lbsQ.Field("manager_id"), providers, brands, cloudEnv)
}
@@ -502,7 +541,7 @@ func (manager *SWireManager) totalCountQ(
}
lbs := lbsQ.SubQuery()
dbsQ := filterByScopeOwnerId(DBInstanceManager.Query(), scope, ownerId)
dbsQ := filterByScopeOwnerId(DBInstanceManager.Query(), scope, ownerId, false)
if len(providers) > 0 || len(brands) > 0 || len(cloudEnv) > 0 {
dbsQ = CloudProviderFilter(dbsQ, dbsQ.Field("manager_id"), providers, brands, cloudEnv)
}
@@ -526,14 +565,8 @@ func (manager *SWireManager) totalCountQ(
hNics.Field("network_id"),
sqlchemy.COUNT("hnic_count"),
)
hNicQ = hNicQ.Join(hosts, sqlchemy.Equals(hNics.Field("baremetal_id"), hosts.Field("id")))
hNicQ = hNicQ.Filter(sqlchemy.IsTrue(hosts.Field("enabled")))
revIps := ReservedipManager.Query().SubQuery()
revQ := revIps.Query(
revIps.Field("network_id"),
sqlchemy.COUNT("rnic_count"),
)
hNicQ = hNicQ.Join(hosts2, sqlchemy.Equals(hNics.Field("baremetal_id"), hosts2.Field("id")))
hNicQ = hNicQ.Filter(sqlchemy.IsTrue(hosts2.Field("enabled")))
groupNics := GroupnetworkManager.Query().SubQuery()
grpNicQ := groupNics.Query(
@@ -550,7 +583,8 @@ func (manager *SWireManager) totalCountQ(
lbNicQ = lbNicQ.Join(lbs, sqlchemy.Equals(lbs.Field("id"), lbNics.Field("loadbalancer_id")))
lbNicQ = lbNicQ.Filter(sqlchemy.IsFalse(lbs.Field("pending_deleted")))
eipNics := ElasticipManager.Query().IsNotEmpty("network_id").SubQuery()
eipNicsQ := ElasticipManager.Query().IsNotEmpty("network_id")
eipNics := filterByScopeOwnerId(eipNicsQ, scope, ownerId, false).SubQuery()
eipNicQ := eipNics.Query(
eipNics.Field("network_id"),
sqlchemy.COUNT("eipnic_count"),
@@ -563,6 +597,7 @@ func (manager *SWireManager) totalCountQ(
}
netifsQ := NetworkInterfaceManager.Query()
netifsQ = filterByScopeOwnerId(netifsQ, scope, ownerId, true)
if len(providers) > 0 || len(brands) > 0 || len(cloudEnv) > 0 {
netifsQ = CloudProviderFilter(netifsQ, netifsQ.Field("manager_id"), providers, brands, cloudEnv)
}
@@ -587,7 +622,6 @@ func (manager *SWireManager) totalCountQ(
gNicSQ := gNicQ.GroupBy(gNics.Field("network_id")).SubQuery()
hNicSQ := hNicQ.GroupBy(hNics.Field("network_id")).SubQuery()
revSQ := revQ.GroupBy(revIps.Field("network_id")).SubQuery()
grpNicSQ := grpNicQ.GroupBy(groupNics.Field("network_id")).SubQuery()
lbNicSQ := lbNicQ.GroupBy(lbNics.Field("network_id")).SubQuery()
eipNicSQ := eipNicQ.GroupBy(eipNics.Field("network_id")).SubQuery()
@@ -596,58 +630,90 @@ func (manager *SWireManager) totalCountQ(
networks := NetworkManager.Query().SubQuery()
netQ := networks.Query(
networks.Field("wire_id"),
sqlchemy.COUNT("id").Label("net_count"),
sqlchemy.SUM("gnic_count", gNicSQ.Field("gnic_count")),
sqlchemy.SUM("pending_deleted_gnic_count", gNicSQ.Field("pending_deleted_gnic_count")),
sqlchemy.SUM("hnic_count", hNicSQ.Field("hnic_count")),
sqlchemy.SUM("rev_count", revSQ.Field("rnic_count")),
sqlchemy.SUM("grpnic_count", grpNicSQ.Field("grpnic_count")),
sqlchemy.SUM("lbnic_count", lbNicSQ.Field("lbnic_count")),
sqlchemy.SUM("eipnic_count", eipNicSQ.Field("eipnic_count")),
sqlchemy.SUM("netifnic_count", netifNicSQ.Field("netifnic_count")),
sqlchemy.SUM("dbnic_count", dbNicSQ.Field("dbnic_count")),
sqlchemy.SUM("guest_nic_count", gNicSQ.Field("gnic_count")),
sqlchemy.SUM("pending_deleted_guest_nic_count", gNicSQ.Field("pending_deleted_gnic_count")),
sqlchemy.SUM("host_nic_count", hNicSQ.Field("hnic_count")),
sqlchemy.SUM("group_nic_count", grpNicSQ.Field("grpnic_count")),
sqlchemy.SUM("lb_nic_count", lbNicSQ.Field("lbnic_count")),
sqlchemy.SUM("eip_nic_count", eipNicSQ.Field("eipnic_count")),
sqlchemy.SUM("netif_nic_count", netifNicSQ.Field("netifnic_count")),
sqlchemy.SUM("db_nic_count", dbNicSQ.Field("dbnic_count")),
)
netQ = netQ.LeftJoin(gNicSQ, sqlchemy.Equals(gNicSQ.Field("network_id"), networks.Field("id")))
netQ = netQ.LeftJoin(hNicSQ, sqlchemy.Equals(hNicSQ.Field("network_id"), networks.Field("id")))
netQ = netQ.LeftJoin(revSQ, sqlchemy.Equals(revSQ.Field("network_id"), networks.Field("id")))
netQ = netQ.LeftJoin(grpNicSQ, sqlchemy.Equals(grpNicSQ.Field("network_id"), networks.Field("id")))
netQ = netQ.LeftJoin(lbNicSQ, sqlchemy.Equals(lbNicSQ.Field("network_id"), networks.Field("id")))
netQ = netQ.LeftJoin(eipNicSQ, sqlchemy.Equals(eipNicSQ.Field("network_id"), networks.Field("id")))
netQ = netQ.LeftJoin(netifNicSQ, sqlchemy.Equals(netifNicSQ.Field("network_id"), networks.Field("id")))
netQ = netQ.LeftJoin(dbNicSQ, sqlchemy.Equals(dbNicSQ.Field("network_id"), networks.Field("id")))
netQ = netQ.GroupBy(networks.Field("wire_id"))
netSQ := netQ.SubQuery()
return netQ
}
func (manager *SWireManager) totalCountQ2(
rangeObjs []db.IStandaloneModel,
hostTypes []string,
providers []string, brands []string, cloudEnv string,
scope rbacutils.TRbacScope,
ownerId mcclient.IIdentityProvider,
) *sqlchemy.SQuery {
revIps := filterExpiredReservedIps(ReservedipManager.Query()).SubQuery()
revQ := revIps.Query(
revIps.Field("network_id"),
sqlchemy.COUNT("rnic_count"),
)
revSQ := revQ.GroupBy(revIps.Field("network_id")).SubQuery()
ownerNetworks := filterByScopeOwnerId(NetworkManager.Query(), scope, ownerId, false).SubQuery()
ownerNetQ := ownerNetworks.Query(
ownerNetworks.Field("wire_id"),
sqlchemy.COUNT("id").Label("net_count"),
sqlchemy.SUM("rev_count", revSQ.Field("rnic_count")),
)
ownerNetQ = ownerNetQ.LeftJoin(revSQ, sqlchemy.Equals(revSQ.Field("network_id"), ownerNetworks.Field("id")))
ownerNetQ = ownerNetQ.GroupBy(ownerNetworks.Field("wire_id"))
ownerNetSQ := ownerNetQ.SubQuery()
wires := WireManager.Query().SubQuery()
q := wires.Query(
sqlchemy.SUM("net_count", ownerNetSQ.Field("net_count")),
sqlchemy.SUM("reserved_count", ownerNetSQ.Field("rev_count")),
)
q = q.LeftJoin(ownerNetSQ, sqlchemy.Equals(wires.Field("id"), ownerNetSQ.Field("wire_id")))
return filterWiresCountQuery(q, hostTypes, providers, brands, cloudEnv, rangeObjs)
}
func (manager *SWireManager) totalCountQ3(
rangeObjs []db.IStandaloneModel,
hostTypes []string,
providers []string, brands []string, cloudEnv string,
scope rbacutils.TRbacScope,
ownerId mcclient.IIdentityProvider,
) *sqlchemy.SQuery {
wires := filterByScopeOwnerId(WireManager.Query(), scope, ownerId, true).SubQuery()
q := wires.Query(
sqlchemy.COUNT("id").Label("wires_count"),
sqlchemy.SUM("emulated_wires_count", wires.Field("is_emulated")),
sqlchemy.SUM("net_count", netSQ.Field("net_count")),
sqlchemy.SUM("guest_nic_count", netSQ.Field("gnic_count")),
sqlchemy.SUM("pending_deleted_guest_nic_count", netSQ.Field("pending_deleted_gnic_count")),
sqlchemy.SUM("host_nic_count", netSQ.Field("hnic_count")),
sqlchemy.SUM("reserved_count", netSQ.Field("rev_count")),
sqlchemy.SUM("group_nic_count", netSQ.Field("grpnic_count")),
sqlchemy.SUM("lb_nic_count", netSQ.Field("lbnic_count")),
sqlchemy.SUM("eip_nic_count", netSQ.Field("eipnic_count")),
sqlchemy.SUM("netif_nic_count", netSQ.Field("netifnic_count")),
sqlchemy.SUM("db_nic_count", netSQ.Field("dbnic_count")),
)
q = q.LeftJoin(netSQ, sqlchemy.Equals(wires.Field("id"), netSQ.Field("wire_id")))
return filterWiresCountQuery(q, hostTypes, providers, brands, cloudEnv, rangeObjs)
}
func filterWiresCountQuery(q *sqlchemy.SQuery, hostTypes, providers, brands []string, cloudEnv string, rangeObjs []db.IStandaloneModel) *sqlchemy.SQuery {
if len(hostTypes) > 0 {
hostwires := HostwireManager.Query().SubQuery()
hosts := HostManager.Query().SubQuery()
q = q.Join(hostwires, sqlchemy.Equals(q.Field("id"), hostwires.Field("wire_id")))
q = q.Join(hosts, sqlchemy.Equals(hostwires.Field("host_id"), hosts.Field("id")))
q = q.Filter(sqlchemy.In(hosts.Field("host_type"), hostTypes))
hostWireQ := hostwires.Query(hostwires.Field("wire_id"))
hostWireQ = hostWireQ.Join(hosts, sqlchemy.Equals(hostWireQ.Field("host_id"), hosts.Field("id")))
hostWireQ = hostWireQ.Filter(sqlchemy.In(hosts.Field("host_type"), hostTypes))
hostWireQ = hostWireQ.GroupBy(hostwires.Field("wire_id"))
hostWireSQ := hostWireQ.SubQuery()
q = q.Join(hostWireSQ, sqlchemy.Equals(hostWireSQ.Field("wire_id"), q.Field("id")))
}
if len(rangeObjs) > 0 || len(providers) > 0 || len(brands) > 0 || len(cloudEnv) > 0 {
vpcs := VpcManager.Query().SubQuery()
q = q.Join(vpcs, sqlchemy.Equals(q.Field("vpc_id"), vpcs.Field("id")))
q = CloudProviderFilter(q, vpcs.Field("manager_id"), providers, brands, cloudEnv)
q = RangeObjectsFilter(q, rangeObjs, vpcs.Field("cloudregion_id"), q.Field("zone_id"), vpcs.Field("manager_id"), nil, nil)
@@ -683,15 +749,60 @@ func (manager *SWireManager) TotalCount(
scope rbacutils.TRbacScope,
ownerId mcclient.IIdentityProvider,
) WiresCountStat {
vmwareP, hostProviders := fixVmwareProvider(providers)
vmwareB, hostBrands := fixVmwareProvider(brands)
if vmwareP || vmwareB {
if !utils.IsInStringArray(api.HOST_TYPE_ESXI, hostTypes) {
hostTypes = append(hostTypes, api.HOST_TYPE_ESXI)
}
} else {
if utils.IsInStringArray(api.HOST_TYPE_ESXI, hostTypes) {
providers = append(providers, api.CLOUD_PROVIDER_VMWARE)
brands = append(brands, api.CLOUD_PROVIDER_VMWARE)
}
}
if len(hostTypes) > 0 {
for _, p := range providers {
if hs, ok := api.CLOUD_PROVIDER_HOST_TYPE_MAP[p]; ok {
hostTypes = append(hostTypes, hs...)
}
}
for _, p := range brands {
if hs, ok := api.CLOUD_PROVIDER_HOST_TYPE_MAP[p]; ok {
hostTypes = append(hostTypes, hs...)
}
}
}
log.Debugf("providers: %#v hostProviders: %#v brands: %#v hostBrands: %#v hostTypes: %#v", providers, hostProviders, brands, hostBrands, hostTypes)
stat := WiresCountStat{}
err := manager.totalCountQ(
rangeObjs,
hostTypes, hostProviders, hostBrands,
providers, brands, cloudEnv,
scope, ownerId,
).First(&stat)
if err != nil {
log.Errorf("Wire total count: %v", err)
}
err = manager.totalCountQ2(
rangeObjs,
hostTypes,
providers, brands, cloudEnv,
scope, ownerId,
).First(&stat)
if err != nil {
log.Errorf("Wire total count: %v", err)
log.Errorf("Wire total count 2: %v", err)
}
err = manager.totalCountQ3(
rangeObjs,
hostTypes,
providers, brands, cloudEnv,
scope, ownerId,
).First(&stat)
if err != nil {
log.Errorf("Wire total count 2: %v", err)
}
return stat
}

View File

@@ -121,8 +121,8 @@ type ComputeOptions struct {
CloudSyncWorkerCount int `help:"how many current synchronization threads" default:"5"`
CloudAutoSyncIntervalSeconds int `help:"frequency to check auto sync tasks" default:"30"`
DefaultSyncIntervalSeconds int `help:"minimal synchronization interval, default 1 minutes" default:"900"`
MinimalSyncIntervalSeconds int `help:"minimal synchronization interval, default 1 minutes" default:"300"`
DefaultSyncIntervalSeconds int `help:"minimal synchronization interval, default 15 minutes" default:"900"`
MinimalSyncIntervalSeconds int `help:"minimal synchronization interval, default 30 minutes" default:"1800"`
MaxCloudAccountErrorCount int `help:"maximal consecutive error count allow for a cloud account" default:"5"`
NameSyncResources []string `help:"resources that need synchronization of name"`

View File

@@ -1171,7 +1171,8 @@ func (self *SAliyunRegionDriver) ValidateDBInstanceAccountPrivilege(ctx context.
return nil
}
func (self *SAliyunRegionDriver) ValidateCreateElasticcacheData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) {
func (self *SAliyunRegionDriver) ValidateCreateElasticcacheData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, input api.ElasticcacheCreateInput) (*jsonutils.JSONDict, error) {
data := input.JSON(input)
zoneV := validators.NewModelIdOrNameValidator("zone", "zone", ownerId)
networkV := validators.NewModelIdOrNameValidator("network", "network", ownerId)

View File

@@ -319,7 +319,7 @@ func (self *SBaseRegionDriver) InitDBInstanceUser(ctx context.Context, dbinstanc
return nil
}
func (self *SBaseRegionDriver) RequestChangeDBInstanceConfig(ctx context.Context, userCred mcclient.TokenCredential, instance *models.SDBInstance, task taskman.ITask) error {
func (self *SBaseRegionDriver) RequestChangeDBInstanceConfig(ctx context.Context, userCred mcclient.TokenCredential, instance *models.SDBInstance, input *api.SDBInstanceChangeConfigInput, task taskman.ITask) error {
return fmt.Errorf("Not Implement RequestChangeDBInstanceConfig")
}
@@ -335,10 +335,6 @@ func (self *SBaseRegionDriver) ValidateCreateDBInstanceBackupData(ctx context.Co
return input, fmt.Errorf("Not Implement ValidateCreateDBInstanceBackupData")
}
func (self *SBaseRegionDriver) ValidateChangeDBInstanceConfigData(ctx context.Context, userCred mcclient.TokenCredential, instance *models.SDBInstance, input *api.SDBInstanceChangeConfigInput) error {
return fmt.Errorf("Not Implement ValidateChangeDBInstanceConfigData")
}
func (self *SBaseRegionDriver) ValidateDBInstanceAccountPrivilege(ctx context.Context, userCred mcclient.TokenCredential, instance *models.SDBInstance, account string, privilege string) error {
return fmt.Errorf("Not Implement ValidateDBInstanceAccountPrivilege")
}

View File

@@ -2247,12 +2247,6 @@ func (self *SHuaWeiRegionDriver) ValidateChangeDBInstanceConfigData(ctx context.
if input.DiskSizeGB != 0 && input.DiskSizeGB < instance.DiskSizeGB {
return httperrors.NewUnsupportOperationError("Huawei DBInstance Disk cannot be thrink")
}
if len(input.Category) > 0 && input.Category != instance.Category {
return httperrors.NewUnsupportOperationError("Huawei DBInstance category cannot change")
}
if len(input.StorageType) > 0 && input.StorageType != instance.StorageType {
return httperrors.NewUnsupportOperationError("Huawei DBInstance storage type cannot change")
}
return nil
}
@@ -2301,7 +2295,7 @@ func (self *SHuaWeiRegionDriver) ValidateDBInstanceRecovery(ctx context.Context,
return nil
}
func validatorSlaveZones(ownerId mcclient.IIdentityProvider, data *jsonutils.JSONDict, optional bool) error {
func validatorSlaveZones(ownerId mcclient.IIdentityProvider, regionId string, data *jsonutils.JSONDict, optional bool) error {
s, err := data.GetString("slave_zones")
if err != nil {
if optional {
@@ -2314,33 +2308,36 @@ func validatorSlaveZones(ownerId mcclient.IIdentityProvider, data *jsonutils.JSO
zones := strings.Split(s, ",")
ret := []string{}
zoneV := validators.NewModelIdOrNameValidator("zone", "zone", ownerId)
for _, zone := range zones {
for i := range zones {
_data := jsonutils.NewDict()
_data.Add(jsonutils.NewString(zone), "zone")
_data.Set("zone", jsonutils.NewString(zones[i]))
if err := zoneV.Validate(_data); err != nil {
return errors.Wrap(err, "validatorSlaveZones")
} else {
if zoneV.Model.(*models.SZone).GetCloudRegionId() != regionId {
return errors.Wrap(fmt.Errorf("zone %s is not in region %s", zoneV.Model.GetName(), regionId), "GetCloudRegionId")
}
ret = append(ret, zoneV.Model.GetId())
}
}
if sku, err := data.GetString("sku"); err != nil || len(sku) == 0 {
return httperrors.NewMissingParameterError("sku")
} else {
chargeType, _ := data.GetString("charge_type")
_skuModel, err := db.FetchByIdOrName(models.ElasticcacheSkuManager, ownerId, sku)
if err != nil {
return err
}
skuModel := _skuModel.(*models.SElasticcacheSku)
for _, zoneId := range zones {
if err := ValidateElasticcacheSku(zoneId, chargeType, skuModel, nil); err != nil {
return err
}
}
}
//if sku, err := data.GetString("sku"); err != nil || len(sku) == 0 {
// return httperrors.NewMissingParameterError("sku")
//} else {
// chargeType, _ := data.GetString("charge_type")
//
// _skuModel, err := db.FetchByIdOrName(models.ElasticcacheSkuManager, ownerId, sku)
// if err != nil {
// return err
// }
//
// skuModel := _skuModel.(*models.SElasticcacheSku)
// for _, zoneId := range zones {
// if err := ValidateElasticcacheSku(zoneId, chargeType, skuModel, nil); err != nil {
// return err
// }
// }
//}
data.Set("slave_zones", jsonutils.NewString(strings.Join(ret, ",")))
return nil
@@ -2370,7 +2367,8 @@ func ValidateElasticcacheSku(zoneId string, chargeType string, sku *models.SElas
return nil
}
func (self *SHuaWeiRegionDriver) ValidateCreateElasticcacheData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) {
func (self *SHuaWeiRegionDriver) ValidateCreateElasticcacheData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, input api.ElasticcacheCreateInput) (*jsonutils.JSONDict, error) {
data := input.JSON(input)
zoneV := validators.NewModelIdOrNameValidator("zone", "zone", ownerId)
networkV := validators.NewModelIdOrNameValidator("network", "network", ownerId)
// secgroupV := validators.NewModelIdOrNameValidator("security_group", "secgroup", ownerId)
@@ -2423,7 +2421,10 @@ func (self *SHuaWeiRegionDriver) ValidateCreateElasticcacheData(ctx context.Cont
}
// validate slave zones
if err := validatorSlaveZones(ownerId, data, true); err != nil {
if len(input.SlaveZones) > 0 {
data.Set("slave_zones", jsonutils.NewString(strings.Join(input.SlaveZones, ",")))
}
if err := validatorSlaveZones(ownerId, zoneV.Model.(*models.SZone).GetCloudRegionId(), data, true); err != nil {
return nil, err
}

View File

@@ -1270,8 +1270,8 @@ func (self *SKVMRegionDriver) RequestCreateElasticcache(ctx context.Context, use
return nil
}
func (self *SKVMRegionDriver) ValidateCreateElasticcacheData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) {
return data, nil
func (self *SKVMRegionDriver) ValidateCreateElasticcacheData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, input api.ElasticcacheCreateInput) (*jsonutils.JSONDict, error) {
return input.JSON(input), nil
}
func (self *SKVMRegionDriver) RequestRestartElasticcache(ctx context.Context, userCred mcclient.TokenCredential, elasticcache *models.SElasticcache, task taskman.ITask) error {

View File

@@ -1914,8 +1914,15 @@ func (self *SManagedVirtualizationRegionDriver) RequestCreateElasticcache(ctx co
return nil
}
func (self *SManagedVirtualizationRegionDriver) ValidateCreateElasticcacheData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) {
return self.ValidateManagerId(ctx, userCred, data)
func (self *SManagedVirtualizationRegionDriver) ValidateCreateElasticcacheData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, input api.ElasticcacheCreateInput) (*jsonutils.JSONDict, error) {
m := jsonutils.NewDict()
m.Set("manager_id", jsonutils.NewString(input.ManagerId))
_, err := self.ValidateManagerId(ctx, userCred, m)
if err != nil {
return nil, errors.Wrap(err, "ValidateManagerId")
}
return input.JSON(input), nil
}
func (self *SManagedVirtualizationRegionDriver) RequestRestartElasticcache(ctx context.Context, userCred mcclient.TokenCredential, ec *models.SElasticcache, task taskman.ITask) error {
@@ -2461,74 +2468,27 @@ func (self *SManagedVirtualizationRegionDriver) RequestCreateElasticcacheAcl(ctx
return nil
}
func (self *SManagedVirtualizationRegionDriver) RequestChangeDBInstanceConfig(ctx context.Context, userCred mcclient.TokenCredential, instance *models.SDBInstance, task taskman.ITask) error {
func (self *SManagedVirtualizationRegionDriver) RequestChangeDBInstanceConfig(ctx context.Context, userCred mcclient.TokenCredential, rds *models.SDBInstance, input *api.SDBInstanceChangeConfigInput, task taskman.ITask) error {
taskman.LocalTaskRun(task, func() (jsonutils.JSONObject, error) {
input := &api.SDBInstanceChangeConfigInput{}
err := task.GetParams().Unmarshal(input)
conf := cloudprovider.SManagedDBInstanceChangeConfig{}
if input.DiskSizeGB > 0 && input.DiskSizeGB != rds.DiskSizeGB {
conf.DiskSizeGB = input.DiskSizeGB
}
if len(input.InstanceType) > 0 && input.InstanceType != rds.InstanceType {
conf.InstanceType = input.InstanceType
}
iRds, err := rds.GetIDBInstance()
if err != nil {
return nil, errors.Wrap(err, "task.GetParams().Unmarshal")
}
if len(input.StorageType) > 0 {
instance.StorageType = input.StorageType
return nil, errors.Wrap(err, "rds.GetIDBInstance")
}
conf := cloudprovider.SManagedDBInstanceChangeConfig{
DiskSizeGB: input.DiskSizeGB,
StorageType: instance.StorageType,
}
opts := []cloudprovider.SManagedDBInstanceChangeConfig{}
if len(input.InstanceType) > 0 || input.VCpuCount > 0 || input.VmemSizeMb > 0 {
instance.InstanceType = input.InstanceType
if input.VCpuCount > 0 {
instance.VcpuCount = input.VCpuCount
}
if input.VmemSizeMb > 0 {
instance.VmemSizeMb = input.VmemSizeMb
}
skus, err := instance.GetDBInstanceSkus()
if err != nil {
return nil, errors.Wrap(err, "instance.GetDBInstanceSkus")
}
for i := range skus {
conf.InstanceType = skus[i].Name
conf.VcpuCount = skus[i].VcpuCount
conf.VmemSizeMb = skus[i].VmemSizeMb
opts = append(opts, conf)
}
} else {
conf.InstanceType = instance.InstanceType
conf.VcpuCount = instance.VcpuCount
conf.VmemSizeMb = instance.VmemSizeMb
opts = append(opts, conf)
}
iRds, err := instance.GetIDBInstance()
log.Infof("change config: %s", jsonutils.Marshal(conf).String())
err = iRds.ChangeConfig(ctx, &conf)
if err != nil {
return nil, errors.Wrap(err, "instance.GetIDBInstance")
}
var changeConfig = func() error {
errMsgs := []string{}
for i := range opts {
log.Infof("change config: %s", jsonutils.Marshal(opts[i]).String())
err = iRds.ChangeConfig(ctx, &opts[i])
if err != nil {
errMsgs = append(errMsgs, err.Error())
continue
}
return nil
}
if len(errMsgs) > 0 {
return fmt.Errorf(strings.Join(errMsgs, "\n"))
}
return fmt.Errorf("no available dbinstance sku to change")
}
err = changeConfig()
if err != nil {
return nil, err
return nil, errors.Wrapf(err, "iRds.ChangeConfig")
}
err = cloudprovider.WaitStatus(iRds, api.DBINSTANCE_RUNNING, time.Second*10, time.Minute*40)
@@ -2541,13 +2501,13 @@ func (self *SManagedVirtualizationRegionDriver) RequestChangeDBInstanceConfig(ct
return nil, errors.Wrapf(err, "iRds.Refresh")
}
_, err = db.Update(instance, func() error {
instance.InstanceType = iRds.GetInstanceType()
instance.Category = iRds.GetCategory()
instance.VcpuCount = iRds.GetVcpuCount()
instance.VmemSizeMb = iRds.GetVmemSizeMB()
instance.StorageType = iRds.GetStorageType()
instance.DiskSizeGB = iRds.GetDiskSizeGB()
_, err = db.Update(rds, func() error {
rds.InstanceType = iRds.GetInstanceType()
rds.Category = iRds.GetCategory()
rds.VcpuCount = iRds.GetVcpuCount()
rds.VmemSizeMb = iRds.GetVmemSizeMB()
rds.StorageType = iRds.GetStorageType()
rds.DiskSizeGB = iRds.GetDiskSizeGB()
return nil
})
if err != nil {
@@ -2610,10 +2570,6 @@ func (self *SManagedVirtualizationRegionDriver) RequestCreateDBInstanceBackup(ct
return nil
}
func (self *SManagedVirtualizationRegionDriver) ValidateChangeDBInstanceConfigData(ctx context.Context, userCred mcclient.TokenCredential, instance *models.SDBInstance, input *api.SDBInstanceChangeConfigInput) error {
return nil
}
func (self *SManagedVirtualizationRegionDriver) ValidateResetDBInstancePassword(ctx context.Context, userCred mcclient.TokenCredential, instance *models.SDBInstance, account string) error {
return nil
}

View File

@@ -18,6 +18,7 @@ import (
"context"
"fmt"
"regexp"
"strings"
"time"
"yunion.io/x/jsonutils"
@@ -1465,7 +1466,8 @@ func (self *SQcloudRegionDriver) GetMaxElasticcacheSecurityGroupCount() int {
return 10
}
func (self *SQcloudRegionDriver) ValidateCreateElasticcacheData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) {
func (self *SQcloudRegionDriver) ValidateCreateElasticcacheData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, input api.ElasticcacheCreateInput) (*jsonutils.JSONDict, error) {
data := input.JSON(input)
zoneV := validators.NewModelIdOrNameValidator("zone", "zone", ownerId)
networkV := validators.NewModelIdOrNameValidator("network", "network", ownerId)
instanceTypeV := validators.NewModelIdOrNameValidator("instance_type", "elasticcachesku", ownerId)
@@ -1507,6 +1509,28 @@ func (self *SQcloudRegionDriver) ValidateCreateElasticcacheData(ctx context.Cont
data.Set("capacity_mb", jsonutils.NewInt(int64(sku.MemorySizeMB)))
}
// validate slave zones
if len(input.SlaveZones) > 0 {
if len(input.SlaveZones) < sku.ReplicasNum {
padding := make([]string, sku.ReplicasNum-len(input.SlaveZones))
for i := range padding {
padding[i] = zoneId
}
input.SlaveZones = append(input.SlaveZones, padding...)
}
data.Set("slave_zones", jsonutils.NewString(strings.Join(input.SlaveZones, ",")))
}
if err := validatorSlaveZones(ownerId, zoneV.Model.(*models.SZone).GetCloudRegionId(), data, true); err != nil {
return nil, err
}
sz, _ := data.GetString("slave_zones")
if len(strings.Split(sz, ",")) > sku.ReplicasNum {
return nil, fmt.Errorf("the number of slave zones can not beyond redis replicas number")
}
// validate secgroups
secgroups := []string{}
err := data.Unmarshal(&secgroups, "secgroup_ids")

View File

@@ -90,7 +90,8 @@ func (self *BaremetalConvertHypervisorTask) OnGuestDeployCompleteFailed(ctx cont
guest := self.getGuest()
guest.SetDisableDelete(self.UserCred, false)
self.SetStage("OnGuestDeleteComplete", nil)
guest.StartDeleteGuestTask(ctx, self.UserCred, self.GetTaskId(), false, true, false)
opts := api.ServerDeleteInput{OverridePendingDelete: true}
guest.StartDeleteGuestTask(ctx, self.UserCred, self.GetTaskId(), opts)
logclient.AddActionLogWithStartable(self, baremetal, logclient.ACT_BM_CONVERT_HYPER, fmt.Sprintf("convert deploy failed: %s", body.String()), self.UserCred, false)
}

View File

@@ -51,7 +51,8 @@ func (self *BaremetalUnconvertHypervisorTask) OnInit(ctx context.Context, obj db
if len(guests) == 1 {
guest := guests[0]
self.SetStage("OnGuestDeleteComplete", nil)
guest.StartDeleteGuestTask(ctx, self.UserCred, self.GetTaskId(), false, true, false)
opts := api.ServerDeleteInput{OverridePendingDelete: true}
guest.StartDeleteGuestTask(ctx, self.UserCred, self.GetTaskId(), opts)
} else {
self.OnGuestDeleteComplete(ctx, baremetal, nil)
}

View File

@@ -19,6 +19,7 @@ import (
"fmt"
"yunion.io/x/jsonutils"
"yunion.io/x/pkg/errors"
api "yunion.io/x/onecloud/pkg/apis/compute"
"yunion.io/x/onecloud/pkg/cloudcommon/db"
@@ -44,11 +45,18 @@ func (self *DBInstanceChangeConfigTask) taskFailed(ctx context.Context, dbinstan
}
func (self *DBInstanceChangeConfigTask) OnInit(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) {
instance := obj.(*models.SDBInstance)
rds := obj.(*models.SDBInstance)
self.SetStage("OnDBInstanceChangeConfigComplete", nil)
err := instance.GetRegion().GetDriver().RequestChangeDBInstanceConfig(ctx, self.UserCred, instance, self)
input := &api.SDBInstanceChangeConfigInput{}
err := self.GetParams().Unmarshal(input)
if err != nil {
self.taskFailed(ctx, instance, err)
self.taskFailed(ctx, rds, errors.Wrapf(err, "GetParams().Unmarshal"))
return
}
err = rds.GetRegion().GetDriver().RequestChangeDBInstanceConfig(ctx, self.UserCred, rds, input, self)
if err != nil {
self.taskFailed(ctx, rds, err)
return
}
}

View File

@@ -127,7 +127,8 @@ func (self *GuestDeleteTask) OnStartEipDissociate(ctx context.Context, guest *mo
self.OnEipDissociateComplete(ctx, guest, nil)
} else {
self.SetStage("OnEipDissociateComplete", nil)
eip.StartEipDissociateTask(ctx, self.UserCred, false, self.GetTaskId())
autoDelete := jsonutils.QueryBoolean(self.GetParams(), "delete_eip", false)
eip.StartEipDissociateTask(ctx, self.UserCred, autoDelete, self.GetTaskId())
}
} else {
self.OnEipDissociateComplete(ctx, guest, nil)
@@ -157,6 +158,10 @@ func (self *GuestDeleteTask) OnDiskDetachComplete(ctx context.Context, obj db.IS
}
// detach last detachable disk
lastDisk := guestdisks[len(guestdisks)-1].GetDisk()
deleteDisks := jsonutils.QueryBoolean(self.Params, "delete_disks", false)
if deleteDisks {
lastDisk.SetAutoDelete(lastDisk, self.GetUserCred(), true)
}
log.Debugf("lastDisk IsDetachable?? %v", lastDisk.IsDetachable())
if !lastDisk.IsDetachable() {
// no more disk need detach

View File

@@ -98,7 +98,9 @@ func (self *GuestDetachScalingGroupTask) OnDetachLoadbalancerComplete(ctx contex
}
self.Params.Set("guest_name", jsonutils.NewString(guest.GetName()))
self.SetStage("OnDeleteGuestComplete", nil)
if err := guest.StartDeleteGuestTask(ctx, self.UserCred, self.Id, false, true, true); err != nil {
opts := api.ServerDeleteInput{Purge: false, OverridePendingDelete: true, DeleteSnapshots: true}
err := guest.StartDeleteGuestTask(ctx, self.UserCred, self.Id, opts)
if err != nil {
self.taskFailed(ctx, sg, nil, jsonutils.NewString(err.Error()))
}
}

View File

@@ -0,0 +1,85 @@
// 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 usages
import (
"time"
"yunion.io/x/jsonutils"
"yunion.io/x/onecloud/pkg/cloudcommon/db"
"yunion.io/x/onecloud/pkg/mcclient"
"yunion.io/x/onecloud/pkg/util/hashcache"
"yunion.io/x/onecloud/pkg/util/rbacutils"
)
var (
usageCache = hashcache.NewCache(1024, time.Second*300) // 5 minutes, 1024 buckets cache
)
func getCacheKey(
scope rbacutils.TRbacScope,
userCred mcclient.IIdentityProvider,
isOwner bool,
rangeObjs []db.IStandaloneModel,
hostTypes []string,
providers []string,
brands []string,
cloudEnv string,
includeSystem bool,
) string {
type RangeObject struct {
Resource string `json:"resource"`
Id string `json:"id"`
}
type KeyStruct struct {
Scope rbacutils.TRbacScope `json:"scope"`
Domain string `json:"domain"`
Project string `json:"project"`
IsOwner bool `json:"is_owner"`
Ranges []RangeObject `json:"ranges"`
HostTypes []string `json:"host_types"`
Providers []string `json:"providers"`
Brands []string `json:"brands"`
CloudEnv string `json:"cloud_env"`
System bool `json:"system"`
}
key := KeyStruct{}
key.Scope = scope
switch scope {
case rbacutils.ScopeSystem:
case rbacutils.ScopeDomain:
key.Domain = userCred.GetProjectDomainId()
case rbacutils.ScopeProject:
key.Project = userCred.GetProjectId()
}
if isOwner {
key.IsOwner = true
}
for _, obj := range rangeObjs {
robj := RangeObject{
Resource: obj.Keyword(),
Id: obj.GetId(),
}
key.Ranges = append(key.Ranges, robj)
}
key.HostTypes = hostTypes
key.Providers = providers
key.Brands = brands
key.CloudEnv = cloudEnv
key.System = includeSystem
jsonObj := jsonutils.Marshal(key)
return jsonObj.QueryString()
}

View File

@@ -18,6 +18,7 @@ import (
"context"
"fmt"
"net/http"
"time"
json "yunion.io/x/jsonutils"
"yunion.io/x/log"
@@ -121,11 +122,21 @@ func rangeObjHandler(
if obj != nil {
rangeObjs = []db.IStandaloneModel{obj}
}
refresh := json.QueryBoolean(query, "refresh", false)
key := getCacheKey(scope, ownerId, isOwner, rangeObjs, hostTypes, providers, brands, cloudEnv, includeSystem)
if !refresh {
cached := usageCache.Get(key)
if cached != nil {
response(w, cached)
return
}
}
usage, err := reporter(scope, ownerId, isOwner, rangeObjs, hostTypes, providers, brands, cloudEnv, includeSystem)
if err != nil {
httperrors.GeneralServerError(ctx, w, err)
return
}
usageCache.AtomicSet(key, usage)
response(w, usage)
}
}
@@ -241,49 +252,57 @@ func getSystemGeneralUsage(userCred mcclient.IIdentityProvider, rangeObjs []db.I
count.Add("all.memory_commit_rate.running", runningMemCmtRate)
count.Add("all.cpu_commit_rate.running", runningCpuCmtRate)
lastWeek := time.Now().Add(-7 * 24 * time.Hour)
count.Include(
VpcUsage("", providers, brands, cloudEnv, nil, rbacutils.ScopeSystem, rangeObjs),
DnsZoneUsage("", nil, rbacutils.ScopeSystem),
HostAllUsage("", userCred, rbacutils.ScopeSystem, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv),
HostAllUsage("prepaid_pool", userCred, rbacutils.ScopeSystem, rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv),
HostAllUsage("any_pool", userCred, rbacutils.ScopeSystem, rangeObjs, hostTypes, nil, providers, brands, cloudEnv),
// HostAllUsage("prepaid_pool", userCred, rbacutils.ScopeSystem, rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv),
// HostAllUsage("any_pool", userCred, rbacutils.ScopeSystem, rangeObjs, hostTypes, nil, providers, brands, cloudEnv),
hostEnabledUsage,
HostEnabledUsage("prepaid_pool", userCred, rbacutils.ScopeSystem, rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv),
HostEnabledUsage("any_pool", userCred, rbacutils.ScopeSystem, rangeObjs, hostTypes, nil, providers, brands, cloudEnv),
// HostEnabledUsage("prepaid_pool", userCred, rbacutils.ScopeSystem, rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv),
// HostEnabledUsage("any_pool", userCred, rbacutils.ScopeSystem, rangeObjs, hostTypes, nil, providers, brands, cloudEnv),
BaremetalUsage(userCred, rbacutils.ScopeSystem, rangeObjs, hostTypes, providers, brands, cloudEnv),
StorageUsage("", rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, includeSystem, rbacutils.ScopeSystem, nil),
StorageUsage("system", rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, true, rbacutils.ScopeSystem, nil),
StorageUsage("prepaid_pool", rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv, false, includeSystem, rbacutils.ScopeSystem, nil),
StorageUsage("any_pool", rangeObjs, hostTypes, nil, providers, brands, cloudEnv, false, includeSystem, rbacutils.ScopeSystem, nil),
StorageUsage("any_pool.system", rangeObjs, hostTypes, nil, providers, brands, cloudEnv, false, true, rbacutils.ScopeSystem, nil),
StorageUsage("any_pool.pending_delete", rangeObjs, hostTypes, nil, providers, brands, cloudEnv, true, includeSystem, rbacutils.ScopeSystem, nil),
StorageUsage("any_pool.pending_delete.system", rangeObjs, hostTypes, nil, providers, brands, cloudEnv, true, true, rbacutils.ScopeSystem, nil),
// StorageUsage("prepaid_pool", rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv, false, includeSystem, rbacutils.ScopeSystem, nil),
// StorageUsage("any_pool", rangeObjs, hostTypes, nil, providers, brands, cloudEnv, false, includeSystem, rbacutils.ScopeSystem, nil),
// StorageUsage("any_pool.system", rangeObjs, hostTypes, nil, providers, brands, cloudEnv, false, true, rbacutils.ScopeSystem, nil),
// StorageUsage("any_pool.pending_delete", rangeObjs, hostTypes, nil, providers, brands, cloudEnv, true, includeSystem, rbacutils.ScopeSystem, nil),
// StorageUsage("any_pool.pending_delete.system", rangeObjs, hostTypes, nil, providers, brands, cloudEnv, true, true, rbacutils.ScopeSystem, nil),
GuestNormalUsage("all.servers", rbacutils.ScopeSystem, nil, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, includeSystem),
GuestNormalUsage("all.servers.prepaid_pool", rbacutils.ScopeSystem, nil, rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv, includeSystem),
GuestNormalUsage("all.servers.any_pool", rbacutils.ScopeSystem, nil, rangeObjs, hostTypes, nil, providers, brands, cloudEnv, includeSystem),
GuestNormalUsage("all.servers", rbacutils.ScopeSystem, nil, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, includeSystem, nil),
GuestNormalUsage("all.servers.last_week", rbacutils.ScopeSystem, nil, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, includeSystem, &lastWeek),
// GuestNormalUsage("all.servers.prepaid_pool", rbacutils.ScopeSystem, nil, rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv, includeSystem),
// GuestNormalUsage("all.servers.any_pool", rbacutils.ScopeSystem, nil, rangeObjs, hostTypes, nil, providers, brands, cloudEnv, includeSystem),
GuestPendingDeleteUsage("all.pending_delete_servers", rbacutils.ScopeSystem, nil, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, includeSystem),
GuestPendingDeleteUsage("all.pending_delete_servers.prepaid_pool", rbacutils.ScopeSystem, nil, rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv, includeSystem),
GuestPendingDeleteUsage("all.pending_delete_servers.any_pool", rbacutils.ScopeSystem, nil, rangeObjs, hostTypes, nil, providers, brands, cloudEnv, includeSystem),
GuestPendingDeleteUsage("all.pending_delete_servers", rbacutils.ScopeSystem, nil, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, includeSystem, nil),
GuestPendingDeleteUsage("all.pending_delete_servers.last_week", rbacutils.ScopeSystem, nil, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, includeSystem, &lastWeek),
// GuestPendingDeleteUsage("all.pending_delete_servers.prepaid_pool", rbacutils.ScopeSystem, nil, rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv, includeSystem),
// GuestNormalUsage("all.servers.prepaid_pool", rbacutils.ScopeSystem, nil, rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv, includeSystem),
// GuestNormalUsage("all.servers.any_pool", rbacutils.ScopeSystem, nil, rangeObjs, hostTypes, nil, providers, brands, cloudEnv, includeSystem),
// GuestPendingDeleteUsage("all.pending_delete_servers", rbacutils.ScopeSystem, nil, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, includeSystem),
// GuestPendingDeleteUsage("all.pending_delete_servers.prepaid_pool", rbacutils.ScopeSystem, nil, rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv, includeSystem),
// GuestPendingDeleteUsage("all.pending_delete_servers.any_pool", rbacutils.ScopeSystem, nil, rangeObjs, hostTypes, nil, providers, brands, cloudEnv, includeSystem),
GuestReadyUsage("all.ready_servers", rbacutils.ScopeSystem, nil, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, includeSystem),
GuestReadyUsage("all.ready_servers.prepaid_pool", rbacutils.ScopeSystem, nil, rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv, includeSystem),
GuestReadyUsage("all.ready_servers.any_pool", rbacutils.ScopeSystem, nil, rangeObjs, hostTypes, nil, providers, brands, cloudEnv, includeSystem),
GuestRunningUsage("all.running_servers.prepaid_pool", rbacutils.ScopeSystem, nil, rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv, includeSystem),
GuestRunningUsage("all.running_servers.any_pool", rbacutils.ScopeSystem, nil, rangeObjs, hostTypes, nil, providers, brands, cloudEnv, includeSystem),
// GuestReadyUsage("all.ready_servers.prepaid_pool", rbacutils.ScopeSystem, nil, rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv, includeSystem),
// GuestReadyUsage("all.ready_servers.any_pool", rbacutils.ScopeSystem, nil, rangeObjs, hostTypes, nil, providers, brands, cloudEnv, includeSystem),
// GuestRunningUsage("all.running_servers.prepaid_pool", rbacutils.ScopeSystem, nil, rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv, includeSystem),
// GuestRunningUsage("all.running_servers.any_pool", rbacutils.ScopeSystem, nil, rangeObjs, hostTypes, nil, providers, brands, cloudEnv, includeSystem),
guestRunningUsage,
// containerRunningUsage,
IsolatedDeviceUsage("", rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv),
IsolatedDeviceUsage("prepaid_pool", rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv),
IsolatedDeviceUsage("any_pool", rangeObjs, hostTypes, nil, providers, brands, cloudEnv),
// IsolatedDeviceUsage("prepaid_pool", rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv),
// IsolatedDeviceUsage("any_pool", rangeObjs, hostTypes, nil, providers, brands, cloudEnv),
WireUsage(rangeObjs, hostTypes, providers, brands, cloudEnv),
@@ -308,7 +327,8 @@ func getSystemGeneralUsage(userCred mcclient.IIdentityProvider, rangeObjs []db.I
}
func getDomainGeneralUsage(scope rbacutils.TRbacScope, cred mcclient.IIdentityProvider, rangeObjs []db.IStandaloneModel, hostTypes []string, providers []string, brands []string, cloudEnv string) (Usage, error) {
count := GuestNormalUsage(getKey(scope, "servers"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false)
lastWeek := time.Now().Add(-7 * 24 * time.Hour)
count := GuestNormalUsage(getKey(scope, "servers"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, nil)
var pmemTotal float64
var pcpuTotal float64
@@ -338,38 +358,40 @@ func getDomainGeneralUsage(scope rbacutils.TRbacScope, cred mcclient.IIdentityPr
DnsZoneUsage("domain", cred, rbacutils.ScopeDomain),
HostAllUsage("", cred, rbacutils.ScopeDomain, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv),
HostAllUsage("prepaid_pool", cred, rbacutils.ScopeDomain, rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv),
HostAllUsage("any_pool", cred, rbacutils.ScopeDomain, rangeObjs, hostTypes, nil, providers, brands, cloudEnv),
// HostAllUsage("prepaid_pool", cred, rbacutils.ScopeDomain, rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv),
// HostAllUsage("any_pool", cred, rbacutils.ScopeDomain, rangeObjs, hostTypes, nil, providers, brands, cloudEnv),
hostEnabledUsage,
HostEnabledUsage("prepaid_pool", cred, rbacutils.ScopeDomain, rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv),
HostEnabledUsage("any_pool", cred, rbacutils.ScopeDomain, rangeObjs, hostTypes, nil, providers, brands, cloudEnv),
// HostEnabledUsage("prepaid_pool", cred, rbacutils.ScopeDomain, rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv),
// HostEnabledUsage("any_pool", cred, rbacutils.ScopeDomain, rangeObjs, hostTypes, nil, providers, brands, cloudEnv),
BaremetalUsage(cred, rbacutils.ScopeDomain, rangeObjs, hostTypes, providers, brands, cloudEnv),
StorageUsage("", rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, false, rbacutils.ScopeDomain, cred),
StorageUsage("system", rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, true, rbacutils.ScopeDomain, cred),
StorageUsage("prepaid_pool", rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv, false, false, rbacutils.ScopeDomain, cred),
StorageUsage("any_pool", rangeObjs, hostTypes, nil, providers, brands, cloudEnv, false, false, rbacutils.ScopeDomain, cred),
StorageUsage("any_pool.system", rangeObjs, hostTypes, nil, providers, brands, cloudEnv, false, true, rbacutils.ScopeDomain, cred),
StorageUsage("any_pool.pending_delete", rangeObjs, hostTypes, nil, providers, brands, cloudEnv, true, false, rbacutils.ScopeDomain, cred),
StorageUsage("any_pool.pending_delete.system", rangeObjs, hostTypes, nil, providers, brands, cloudEnv, true, true, rbacutils.ScopeDomain, cred),
// StorageUsage("prepaid_pool", rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv, false, false, rbacutils.ScopeDomain, cred),
// StorageUsage("any_pool", rangeObjs, hostTypes, nil, providers, brands, cloudEnv, false, false, rbacutils.ScopeDomain, cred),
// StorageUsage("any_pool.system", rangeObjs, hostTypes, nil, providers, brands, cloudEnv, false, true, rbacutils.ScopeDomain, cred),
// StorageUsage("any_pool.pending_delete", rangeObjs, hostTypes, nil, providers, brands, cloudEnv, true, false, rbacutils.ScopeDomain, cred),
// StorageUsage("any_pool.pending_delete.system", rangeObjs, hostTypes, nil, providers, brands, cloudEnv, true, true, rbacutils.ScopeDomain, cred),
GuestNormalUsage(getKey(scope, "servers.prepaid_pool"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv, false),
GuestNormalUsage(getKey(scope, "servers.any_pool"), scope, cred, rangeObjs, hostTypes, nil, providers, brands, cloudEnv, false),
GuestNormalUsage(getKey(scope, "servers.last_week"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, &lastWeek),
// GuestNormalUsage(getKey(scope, "servers.prepaid_pool"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv, false),
// GuestNormalUsage(getKey(scope, "servers.any_pool"), scope, cred, rangeObjs, hostTypes, nil, providers, brands, cloudEnv, false),
guestRunningUsage,
// GuestRunningUsage(getKey(scope, "running_servers"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv),
GuestRunningUsage(getKey(scope, "running_servers.prepaid_pool"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv, false),
GuestRunningUsage(getKey(scope, "running_servers.any_pool"), scope, cred, rangeObjs, hostTypes, nil, providers, brands, cloudEnv, false),
// GuestRunningUsage(getKey(scope, "running_servers.prepaid_pool"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv, false),
// GuestRunningUsage(getKey(scope, "running_servers.any_pool"), scope, cred, rangeObjs, hostTypes, nil, providers, brands, cloudEnv, false),
GuestPendingDeleteUsage(getKey(scope, "pending_delete_servers"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false),
GuestPendingDeleteUsage(getKey(scope, "pending_delete_servers.prepaid_pool"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv, false),
GuestPendingDeleteUsage(getKey(scope, "pending_delete_servers.any_pool"), scope, cred, rangeObjs, hostTypes, nil, providers, brands, cloudEnv, false),
GuestPendingDeleteUsage(getKey(scope, "pending_delete_servers"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, nil),
GuestPendingDeleteUsage(getKey(scope, "pending_delete_servers.last_week"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, &lastWeek),
// GuestPendingDeleteUsage(getKey(scope, "pending_delete_servers.prepaid_pool"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv, false),
// GuestPendingDeleteUsage(getKey(scope, "pending_delete_servers.any_pool"), scope, cred, rangeObjs, hostTypes, nil, providers, brands, cloudEnv, false),
GuestReadyUsage(getKey(scope, "ready_servers"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false),
GuestReadyUsage(getKey(scope, "ready_servers.prepaid_pool"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv, false),
GuestReadyUsage(getKey(scope, "ready_servers.any_pool"), scope, cred, rangeObjs, hostTypes, nil, providers, brands, cloudEnv, false),
// GuestReadyUsage(getKey(scope, "ready_servers.prepaid_pool"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv, false),
// GuestReadyUsage(getKey(scope, "ready_servers.any_pool"), scope, cred, rangeObjs, hostTypes, nil, providers, brands, cloudEnv, false),
NetworkUsage(getKey(scope, ""), scope, cred, providers, brands, cloudEnv, rangeObjs),
@@ -377,7 +399,7 @@ func getDomainGeneralUsage(scope rbacutils.TRbacScope, cred mcclient.IIdentityPr
BucketUsage(scope, cred, rangeObjs, providers, brands, cloudEnv),
nicsUsage("domain", rangeObjs, hostTypes, providers, brands, cloudEnv, scope, cred),
// nicsUsage("domain", rangeObjs, hostTypes, providers, brands, cloudEnv, scope, cred),
SnapshotUsage(scope, cred, rangeObjs, providers, brands, cloudEnv),
@@ -393,22 +415,25 @@ func getDomainGeneralUsage(scope rbacutils.TRbacScope, cred mcclient.IIdentityPr
}
func getProjectGeneralUsage(scope rbacutils.TRbacScope, cred mcclient.IIdentityProvider, rangeObjs []db.IStandaloneModel, hostTypes []string, providers []string, brands []string, cloudEnv string) (Usage, error) {
count := GuestNormalUsage(getKey(scope, "servers"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false)
lastWeek := time.Now().Add(-7 * 24 * time.Hour)
count := GuestNormalUsage(getKey(scope, "servers"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, nil)
count.Include(
GuestNormalUsage(getKey(scope, "servers.prepaid_pool"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv, false),
GuestNormalUsage(getKey(scope, "servers.any_pool"), scope, cred, rangeObjs, hostTypes, nil, providers, brands, cloudEnv, false),
GuestNormalUsage(getKey(scope, "servers.last_week"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, &lastWeek),
// GuestNormalUsage(getKey(scope, "servers.prepaid_pool"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv, false),
// GuestNormalUsage(getKey(scope, "servers.any_pool"), scope, cred, rangeObjs, hostTypes, nil, providers, brands, cloudEnv, false),
GuestRunningUsage(getKey(scope, "running_servers"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false),
GuestRunningUsage(getKey(scope, "running_servers.prepaid_pool"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv, false),
GuestRunningUsage(getKey(scope, "running_servers.any_pool"), scope, cred, rangeObjs, hostTypes, nil, providers, brands, cloudEnv, false),
// GuestRunningUsage(getKey(scope, "running_servers.prepaid_pool"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv, false),
// GuestRunningUsage(getKey(scope, "running_servers.any_pool"), scope, cred, rangeObjs, hostTypes, nil, providers, brands, cloudEnv, false),
GuestPendingDeleteUsage(getKey(scope, "pending_delete_servers"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false),
GuestPendingDeleteUsage(getKey(scope, "pending_delete_servers.prepaid_pool"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv, false),
GuestPendingDeleteUsage(getKey(scope, "pending_delete_servers.any_pool"), scope, cred, rangeObjs, hostTypes, nil, providers, brands, cloudEnv, false),
GuestPendingDeleteUsage(getKey(scope, "pending_delete_servers"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, nil),
GuestPendingDeleteUsage(getKey(scope, "pending_delete_servers.last_week"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, &lastWeek),
// GuestPendingDeleteUsage(getKey(scope, "pending_delete_servers.prepaid_pool"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv, false),
// GuestPendingDeleteUsage(getKey(scope, "pending_delete_servers.any_pool"), scope, cred, rangeObjs, hostTypes, nil, providers, brands, cloudEnv, false),
GuestReadyUsage(getKey(scope, "ready_servers"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false),
GuestReadyUsage(getKey(scope, "ready_servers.prepaid_pool"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv, false),
GuestReadyUsage(getKey(scope, "ready_servers.any_pool"), scope, cred, rangeObjs, hostTypes, nil, providers, brands, cloudEnv, false),
// GuestReadyUsage(getKey(scope, "ready_servers.prepaid_pool"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypePrepaidRecycle}, providers, brands, cloudEnv, false),
// GuestReadyUsage(getKey(scope, "ready_servers.any_pool"), scope, cred, rangeObjs, hostTypes, nil, providers, brands, cloudEnv, false),
NetworkUsage(getKey(scope, ""), scope, cred, providers, brands, cloudEnv, rangeObjs),
@@ -421,7 +446,7 @@ func getProjectGeneralUsage(scope rbacutils.TRbacScope, cred mcclient.IIdentityP
DisksUsage(getKey(scope, "pending_delete_disks"), rangeObjs, hostTypes, nil, providers, brands, cloudEnv, scope, cred, true, false),
DisksUsage(getKey(scope, "pending_delete_disks.system"), rangeObjs, hostTypes, nil, providers, brands, cloudEnv, scope, cred, true, true),
nicsUsage("", rangeObjs, hostTypes, providers, brands, cloudEnv, scope, cred),
// nicsUsage("", rangeObjs, hostTypes, providers, brands, cloudEnv, scope, cred),
SnapshotUsage(scope, cred, rangeObjs, providers, brands, cloudEnv),
@@ -450,21 +475,24 @@ func ReportGeneralUsage(
) (count Usage, err error) {
count = make(map[string]interface{})
if scope == rbacutils.ScopeSystem || isOwner {
// if scope == rbacutils.ScopeSystem || isOwner {
if scope == rbacutils.ScopeSystem {
count, err = getSystemGeneralUsage(userCred, rangeObjs, hostTypes, providers, brands, cloudEnv, includeSystem)
if err != nil {
return
}
}
if scope.HigherEqual(rbacutils.ScopeDomain) {
// if scope.HigherEqual(rbacutils.ScopeDomain) && len(userCred.GetProjectDomainId()) > 0 {
if scope == rbacutils.ScopeDomain && len(userCred.GetProjectDomainId()) > 0 {
commonUsage, err := getDomainGeneralUsage(rbacutils.ScopeDomain, userCred, rangeObjs, hostTypes, providers, brands, cloudEnv)
if err == nil {
count.Include(commonUsage)
}
}
if scope.HigherEqual(rbacutils.ScopeProject) {
// if scope.HigherEqual(rbacutils.ScopeProject) && len(userCred.GetProjectId()) > 0 {
if scope == rbacutils.ScopeProject && len(userCred.GetProjectId()) > 0 {
commonUsage, err := getProjectGeneralUsage(rbacutils.ScopeProject, userCred, rangeObjs, hostTypes, providers, brands, cloudEnv)
if err == nil {
count.Include(commonUsage)
@@ -570,6 +598,10 @@ func StorageUsage(
count[fmt.Sprintf("%s.attached.count.owner", dPrefix)] = result.CountAttached
count[fmt.Sprintf("%s.detached.owner", dPrefix)] = result.DetachedCapacity
count[fmt.Sprintf("%s.detached.count.owner", dPrefix)] = result.CountDetached
count[fmt.Sprintf("%s.mounted.owner", dPrefix)] = result.AttachedCapacity
count[fmt.Sprintf("%s.mounted.count.owner", dPrefix)] = result.CountAttached
count[fmt.Sprintf("%s.unmounted.owner", dPrefix)] = result.DetachedCapacity
count[fmt.Sprintf("%s.unmounted.count.owner", dPrefix)] = result.CountDetached
storageCmtRate := 0.0
if result.Capacity > 0 {
@@ -594,6 +626,10 @@ func StorageUsage(
count[fmt.Sprintf("%s.attached.count", dPrefix)] = result.CountAttached
count[fmt.Sprintf("%s.detached", dPrefix)] = result.DetachedCapacity
count[fmt.Sprintf("%s.detached.count", dPrefix)] = result.CountDetached
count[fmt.Sprintf("%s.mounted", dPrefix)] = result.AttachedCapacity
count[fmt.Sprintf("%s.mounted.count", dPrefix)] = result.CountAttached
count[fmt.Sprintf("%s.unmounted", dPrefix)] = result.DetachedCapacity
count[fmt.Sprintf("%s.unmounted.count", dPrefix)] = result.CountDetached
return count
}
@@ -621,6 +657,10 @@ func DisksUsage(
count[fmt.Sprintf("%s.attached.count", dPrefix)] = result.CountAttached
count[fmt.Sprintf("%s.detached", dPrefix)] = result.DetachedCapacity
count[fmt.Sprintf("%s.detached.count", dPrefix)] = result.CountDetached
count[fmt.Sprintf("%s.mounted", dPrefix)] = result.AttachedCapacity
count[fmt.Sprintf("%s.mounted.count", dPrefix)] = result.CountAttached
count[fmt.Sprintf("%s.unmounted", dPrefix)] = result.DetachedCapacity
count[fmt.Sprintf("%s.unmounted.count", dPrefix)] = result.CountDetached
return count
}
@@ -645,7 +685,7 @@ func WireUsage(rangeObjs []db.IStandaloneModel, hostTypes []string, providers []
return count
}
func nicsUsage(prefix string, rangeObjs []db.IStandaloneModel, hostTypes []string, providers []string, brands []string, cloudEnv string, scope rbacutils.TRbacScope, ownerId mcclient.IIdentityProvider) Usage {
/*func nicsUsage(prefix string, rangeObjs []db.IStandaloneModel, hostTypes []string, providers []string, brands []string, cloudEnv string, scope rbacutils.TRbacScope, ownerId mcclient.IIdentityProvider) Usage {
count := make(map[string]interface{})
result := models.WireManager.TotalCount(rangeObjs, hostTypes, providers, brands, cloudEnv, scope, ownerId)
// including nics for pending_deleted guests
@@ -658,7 +698,7 @@ func nicsUsage(prefix string, rangeObjs []db.IStandaloneModel, hostTypes []strin
count[prefixKey(prefix, "nics.eip")] = result.EipNicCount
count[prefixKey(prefix, "nics")] = result.GuestNicCount + result.GroupNicCount + result.LbNicCount + result.DbNicCount + result.EipNicCount
return count
}
}*/
func prefixKey(prefix string, key string) string {
if len(prefix) > 0 {
@@ -671,8 +711,15 @@ func prefixKey(prefix string, key string) string {
func NetworkUsage(prefix string, scope rbacutils.TRbacScope, userCred mcclient.IIdentityProvider, providers []string, brands []string, cloudEnv string, rangeObjs []db.IStandaloneModel) Usage {
count := make(map[string]interface{})
ret := models.NetworkManager.TotalPortCount(scope, userCred, providers, brands, cloudEnv, rangeObjs)
count[prefixKey(prefix, "ports")] = ret.Count
count[prefixKey(prefix, "ports_exit")] = ret.CountExt
for k, v := range ret {
if len(k) > 0 {
count[prefixKey(prefix, fmt.Sprintf("ports.%s", k))] = v.Count
count[prefixKey(prefix, fmt.Sprintf("ports_exit.%s", k))] = v.CountExt
} else {
count[prefixKey(prefix, "ports")] = v.Count
count[prefixKey(prefix, "ports_exit")] = v.CountExt
}
}
return count
}
@@ -729,26 +776,26 @@ func hostUsage(
func GuestNormalUsage(prefix string, scope rbacutils.TRbacScope, cred mcclient.IIdentityProvider,
rangeObjs []db.IStandaloneModel, hostTypes []string, resourceTypes []string, providers []string,
brands []string, cloudEnv string, includeSystem bool) Usage {
return guestUsage(prefix, scope, cred, rangeObjs, hostTypes, resourceTypes, providers, brands, cloudEnv, nil, false, includeSystem)
brands []string, cloudEnv string, includeSystem bool, since *time.Time) Usage {
return guestUsage(prefix, scope, cred, rangeObjs, hostTypes, resourceTypes, providers, brands, cloudEnv, nil, false, includeSystem, since)
}
func GuestPendingDeleteUsage(prefix string, scope rbacutils.TRbacScope, cred mcclient.IIdentityProvider,
rangeObjs []db.IStandaloneModel, hostTypes []string, resourceTypes []string, providers []string,
brands []string, cloudEnv string, includeSystem bool) Usage {
return guestUsage(prefix, scope, cred, rangeObjs, hostTypes, resourceTypes, providers, brands, cloudEnv, nil, true, includeSystem)
brands []string, cloudEnv string, includeSystem bool, since *time.Time) Usage {
return guestUsage(prefix, scope, cred, rangeObjs, hostTypes, resourceTypes, providers, brands, cloudEnv, nil, true, includeSystem, since)
}
func GuestRunningUsage(prefix string, scope rbacutils.TRbacScope, cred mcclient.IIdentityProvider,
rangeObjs []db.IStandaloneModel, hostTypes []string, resourceTypes []string, providers []string,
brands []string, cloudEnv string, includeSystem bool) Usage {
return guestUsage(prefix, scope, cred, rangeObjs, hostTypes, resourceTypes, providers, brands, cloudEnv, []string{api.VM_RUNNING}, false, includeSystem)
return guestUsage(prefix, scope, cred, rangeObjs, hostTypes, resourceTypes, providers, brands, cloudEnv, []string{api.VM_RUNNING}, false, includeSystem, nil)
}
func GuestReadyUsage(prefix string, scope rbacutils.TRbacScope, cred mcclient.IIdentityProvider,
rangeObjs []db.IStandaloneModel, hostTypes []string, resourceTypes []string, providers []string,
brands []string, cloudEnv string, includeSystem bool) Usage {
return guestUsage(prefix, scope, cred, rangeObjs, hostTypes, resourceTypes, providers, brands, cloudEnv, []string{api.VM_READY}, false, includeSystem)
return guestUsage(prefix, scope, cred, rangeObjs, hostTypes, resourceTypes, providers, brands, cloudEnv, []string{api.VM_READY}, false, includeSystem, nil)
}
func guestHypervisorsUsage(
@@ -759,11 +806,12 @@ func guestHypervisorsUsage(
hostTypes []string, resourceTypes []string, providers []string, brands []string, cloudEnv string,
status, hypervisors []string,
pendingDelete, includeSystem bool,
since *time.Time,
) Usage {
// temporarily hide system resources
// XXX needs more work later
guest := models.GuestManager.TotalCount(scope, ownerId, rangeObjs, status, hypervisors,
includeSystem, pendingDelete, hostTypes, resourceTypes, providers, brands, cloudEnv)
includeSystem, pendingDelete, hostTypes, resourceTypes, providers, brands, cloudEnv, since)
count := make(map[string]interface{})
count[prefix] = guest.TotalGuestCount
count[fmt.Sprintf("%s.cpu", prefix)] = guest.TotalCpuCount
@@ -786,10 +834,10 @@ func guestHypervisorsUsage(
func guestUsage(prefix string, scope rbacutils.TRbacScope, userCred mcclient.IIdentityProvider, rangeObjs []db.IStandaloneModel,
hostTypes []string, resourceTypes []string, providers []string, brands []string, cloudEnv string,
status []string, pendingDelete, includeSystem bool) Usage {
status []string, pendingDelete, includeSystem bool, since *time.Time) Usage {
hypervisors := sets.NewString(api.HYPERVISORS...)
hypervisors.Delete(api.HYPERVISOR_CONTAINER)
return guestHypervisorsUsage(prefix, scope, userCred, rangeObjs, hostTypes, resourceTypes, providers, brands, cloudEnv, status, hypervisors.List(), pendingDelete, includeSystem)
return guestHypervisorsUsage(prefix, scope, userCred, rangeObjs, hostTypes, resourceTypes, providers, brands, cloudEnv, status, hypervisors.List(), pendingDelete, includeSystem, since)
}
/*func containerUsage(prefix string, scope rbacutils.TRbacScope, userCred mcclient.IIdentityProvider, rangeObjs []db.IStandaloneModel,

View File

@@ -120,7 +120,18 @@ func ResizeDiskFs(diskPath string, sizeMb int) error {
var cmds = []string{"parted", "-a", "none", "-s", diskPath, "--", "unit", "s", "print"}
lines, err := procutils.NewCommand(cmds[0], cmds[1:]...).Output()
if err != nil {
log.Errorf("resize disk fs fail: %s", err)
hasPartTable := func() bool {
for _, line := range strings.Split(string(lines), "\n") {
if strings.Contains(line, "Partition Table") {
return true
}
}
return false
}
if hasPartTable() {
return nil
}
log.Errorf("resize disk fs fail, output: %s , error: %s", lines, err)
return err
}
parts, label := ParseDiskPartition(diskPath, lines)

View File

@@ -24,7 +24,7 @@ type IDisk interface {
Connect() error
Disconnect() error
MountRootfs() fsdriver.IRootFsDriver
UmountRootfs(driver fsdriver.IRootFsDriver)
UmountRootfs(driver fsdriver.IRootFsDriver) error
ResizePartition() error
}

View File

@@ -110,17 +110,18 @@ func (d *SKVMGuestDisk) MountKvmRootfsReadOnly() fsdriver.IRootFsDriver {
return d.mountKvmRootfs(true)
}
func (d *SKVMGuestDisk) UmountKvmRootfs(fd fsdriver.IRootFsDriver) {
func (d *SKVMGuestDisk) UmountKvmRootfs(fd fsdriver.IRootFsDriver) error {
if part := fd.GetPartition(); part != nil {
part.Umount()
return part.Umount()
}
return nil
}
func (d *SKVMGuestDisk) UmountRootfs(fd fsdriver.IRootFsDriver) {
func (d *SKVMGuestDisk) UmountRootfs(fd fsdriver.IRootFsDriver) error {
if fd == nil {
return
return nil
}
d.UmountKvmRootfs(fd)
return d.UmountKvmRootfs(fd)
}
func (d *SKVMGuestDisk) MakePartition(fs string) error {

View File

@@ -162,11 +162,11 @@ func (vd *VDDKDisk) MountRootfs() fsdriver.IRootFsDriver {
return vd.kvmDisk.MountRootfs()
}
func (vd *VDDKDisk) UmountRootfs(fd fsdriver.IRootFsDriver) {
func (vd *VDDKDisk) UmountRootfs(fd fsdriver.IRootFsDriver) error {
if vd.kvmDisk == nil {
return
return nil
}
vd.kvmDisk.UmountRootfs(fd)
return vd.kvmDisk.UmountRootfs(fd)
}
func (vd *VDDKDisk) ParsePartitions(buf string) error {
@@ -435,18 +435,18 @@ type VDDKPartition struct {
}
func (vp *VDDKPartition) Mount() bool {
log.Debugf("VDDKPartition.Mount not implement")
log.Warningf("VDDKPartition.Mount not implement")
return true
}
func (vp *VDDKPartition) MountPartReadOnly() bool {
log.Debugf("VDDKPartition.MountPartReadOnly not implement")
log.Warningf("VDDKPartition.MountPartReadOnly not implement")
return true
}
func (vp *VDDKPartition) Umount() bool {
log.Debugf("VDDKPartition.Umount not implement")
return true
func (vp *VDDKPartition) Umount() error {
log.Warningf("VDDKPartition.Umount not implement")
return nil
}
func (vp *VDDKPartition) IsReadonly() bool {
@@ -454,7 +454,7 @@ func (vp *VDDKPartition) IsReadonly() bool {
}
func (vp *VDDKPartition) GetPhysicalPartitionType() string {
log.Debugf("VDDKPartition.GetPhysicalPartitionType not implement")
log.Warningf("VDDKPartition.GetPhysicalPartitionType not implement")
return ""
}

View File

@@ -50,7 +50,7 @@ type IDiskPartition interface {
IsMounted() bool
Mount() bool
MountPartReadOnly() bool
Umount() bool
Umount() error
GetMountPath() string
IsReadonly() bool
GetPhysicalPartitionType() string

View File

@@ -156,22 +156,25 @@ func (d *SGuestfishDiskPartition) MountPartReadOnly() bool {
return true
}
func (d *SGuestfishDiskPartition) Umount() bool {
if d.IsMounted() {
var tries = 0
for tries < 10 {
tries += 1
output, err := procutils.NewCommand("umount", d.GetMountPath()).Output()
if err != nil {
log.Errorf("failed umount %s: %s %s", d.GetMountPath(), output, err)
time.Sleep(time.Second * 1)
} else {
d.mounted = false
return true
}
func (d *SGuestfishDiskPartition) Umount() error {
if !d.IsMounted() {
return nil
}
var tries = 0
var err error
for tries < 10 {
tries += 1
output, err := procutils.NewCommand("umount", d.GetMountPath()).Output()
if err != nil {
err = errors.Wrapf(err, "failed umount %s: %s %s", d.GetMountPath(), output, err)
time.Sleep(time.Second * 1)
} else {
d.mounted = false
return nil
}
}
return false
return err
}
func (d *SGuestfishDiskPartition) IsReadonly() bool {

View File

@@ -15,6 +15,7 @@
package kvmpart
import (
"context"
"fmt"
"math/rand"
"os"
@@ -133,7 +134,7 @@ func (p *SKVMGuestDiskPartition) Mount() bool {
p.readonly = true
}
}
log.Infof("mount fs %s on %s success", p.fs, p.partDev)
log.Infof("mount fs %s on %s successfully", p.fs, p.partDev)
return true
}
@@ -185,7 +186,7 @@ func (p *SKVMGuestDiskPartition) mount(readonly bool) error {
return false, errors.Wrap(err, "")
}
}
_, err = utils.NewFibonacciRetrierMaxTries(3, retrier).Start()
_, err = utils.NewFibonacciRetrierMaxTries(3, retrier).Start(context.Background())
if err != nil {
return errors.Wrap(err, "mount failed")
}
@@ -244,29 +245,37 @@ func (p *SKVMGuestDiskPartition) IsMounted() bool {
}
}
func (p *SKVMGuestDiskPartition) Umount() bool {
if p.IsMounted() {
var tries = 0
for tries < 10 {
tries += 1
_, err := procutils.NewCommand("umount", p.mountPath).Output()
if err == nil {
if p.fs == "xfs" {
uuids := fileutils2.GetDevUuid(p.partDev)
uuid := uuids["UUID"]
if len(uuid) > 0 {
UnlockXfsPartition(uuid)
}
func (p *SKVMGuestDiskPartition) Umount() error {
if !p.IsMounted() {
return nil
}
var tries = 0
var err error
for tries < 10 {
tries += 1
_, err = procutils.NewCommand("umount", p.mountPath).Output()
if err == nil {
if p.fs == "xfs" {
uuids := fileutils2.GetDevUuid(p.partDev)
uuid := uuids["UUID"]
if len(uuid) > 0 {
UnlockXfsPartition(uuid)
}
procutils.NewCommand("blockdev", "--flushbufs", p.partDev).Output()
os.Remove(p.mountPath)
return true
} else {
time.Sleep(time.Second * 1)
}
if _, err := procutils.NewCommand("blockdev", "--flushbufs", p.partDev).Output(); err != nil {
log.Warningf("blockdev --flushbufs %s error: %v", p.partDev, err)
}
if err := os.Remove(p.mountPath); err != nil {
log.Warningf("remove mount path %s error: %v", p.mountPath)
}
log.Infof("umount %s successfully", p.partDev)
return nil
} else {
time.Sleep(time.Second * 1)
}
}
return false
return errors.Wrapf(err, "umount %s", p.mountPath)
}
func (p *SKVMGuestDiskPartition) Zerofree() {

View File

@@ -162,10 +162,10 @@ func (p *SSHPartition) Mount() bool {
return true
}
func (p *SSHPartition) Umount() bool {
func (p *SSHPartition) Umount() error {
if !p.IsMounted() {
log.Errorf("%s is not mounted", p.mountPath)
return false
log.Warningf("%s is not mounted", p.mountPath)
return nil
}
var err error
for tries := 0; tries < 10; tries++ {
@@ -182,13 +182,12 @@ func (p *SSHPartition) Umount() bool {
time.Sleep(1 * time.Second)
} else {
if err := p.osRmDir(p.mountPath); err != nil {
log.Errorf("remove mount path %s: %v", p.mountPath, err)
return false
log.Warningf("remove mount path %s: %v", p.mountPath, err)
}
return true
return nil
}
}
return err == nil
return err
}
func (p *SSHPartition) IsMounted() bool {

View File

@@ -141,8 +141,6 @@ func (s *SKVMGuestInstance) generateArmStartScript(data *jsonutils.JSONDict) (st
if s.IsKvmSupport() {
cmd += "-enable-kvm"
} else {
cmd += "-no-kvm"
}
cmd += " -device virtio-net-pci,? 2>&1 | grep .speed= > /dev/null\n"
@@ -165,7 +163,6 @@ func (s *SKVMGuestInstance) generateArmStartScript(data *jsonutils.JSONDict) (st
cpuType = "max"
}
} else {
cmd += " -no-kvm"
accel = "tcg"
cpuType = "max"
}
@@ -273,7 +270,9 @@ func (s *SKVMGuestInstance) generateArmStartScript(data *jsonutils.JSONDict) (st
} else {
cmd += nicCmd
}
cmd += s.getVnicDesc(nics[i])
// aarch64 with addr lead to:
// virtio_net: probe of virtioN failed with error -22
cmd += s.getVnicDesc(nics[i], false)
}
if isolatedDevsParams != nil {

View File

@@ -276,7 +276,7 @@ func (s *SKVMGuestInstance) getNicAddr(index int) int {
return s.GetDiskAddr(pciBase + index)
}
func (s *SKVMGuestInstance) getVnicDesc(nic jsonutils.JSONObject) string {
func (s *SKVMGuestInstance) getVnicDesc(nic jsonutils.JSONObject, withAddr bool) string {
bridge, _ := nic.GetString("bridge")
ifname, _ := nic.GetString("ifname")
driver, _ := nic.GetString("driver")
@@ -290,7 +290,9 @@ func (s *SKVMGuestInstance) getVnicDesc(nic jsonutils.JSONObject) string {
cmd += fmt.Sprintf(",netdev=%s", ifname)
cmd += fmt.Sprintf(",mac=%s", mac)
cmd += fmt.Sprintf(",addr=0x%x", s.getNicAddr(int(index)))
if withAddr {
cmd += fmt.Sprintf(",addr=0x%x", s.getNicAddr(int(index)))
}
if driver == "virtio" {
if nic.Contains("vectors") {
cmd += fmt.Sprintf(",vectors=%d", vectors)
@@ -312,7 +314,7 @@ func (s *SKVMGuestInstance) getQgaDesc() string {
}
func (s *SKVMGuestInstance) generateStartScript(data *jsonutils.JSONDict) (string, error) {
if s.manager.host.GetCpuArchitecture() == "aarch64" {
if s.manager.host.IsAarch64() {
return s.generateArmStartScript(data)
} else {
return s._generateStartScript(data)
@@ -617,7 +619,7 @@ function nic_mtu() {
} else {
cmd += nicCmd
}
cmd += s.getVnicDesc(nics[i])
cmd += s.getVnicDesc(nics[i], true)
}
if isolatedDevsParams != nil {

View File

@@ -116,15 +116,29 @@ func (*DeployerServer) ResizeFs(ctx context.Context, req *deployapi.ResizeFsPara
return new(deployapi.Empty), errors.Wrap(err, "disk connect failed")
}
unmount := func(root fsdriver.IRootFsDriver) error {
if err := disk.UmountRootfs(root); err != nil {
return errors.Wrap(err, "unmount rootfs")
}
return nil
}
root := disk.MountRootfs()
if root != nil && !root.IsResizeFsPartitionSupport() {
if err := unmount(root); err != nil {
return new(deployapi.Empty), err
}
return new(deployapi.Empty), errors.ErrNotSupported
}
// must umount rootfs before resize partition
disk.UmountRootfs(root)
err = disk.ResizePartition()
return new(deployapi.Empty), err
if err := unmount(root); err != nil {
return new(deployapi.Empty), err
}
if err := disk.ResizePartition(); err != nil {
return new(deployapi.Empty), errors.Wrap(err, "resize disk partition")
}
return new(deployapi.Empty), nil
}
func (*DeployerServer) FormatFs(ctx context.Context, req *deployapi.FormatFsParams) (*deployapi.Empty, error) {

View File

@@ -713,8 +713,9 @@ func (h *SHostInfo) detectOvsKOVersion() error {
}
lines := strings.Split(string(output), "\n")
for i := 0; i < len(lines); i++ {
if strings.HasPrefix(lines[i], "version:") {
log.Infof("kernel module openvswitch %s", lines[i])
line := lines[i]
if strings.HasPrefix(line, "version:") || (h.IsAarch64() && strings.HasPrefix(line, "vermagic")) {
log.Infof("kernel module openvswitch %s", line)
return nil
}
}
@@ -1721,6 +1722,14 @@ func (h *SHostInfo) GetCpuArchitecture() string {
return h.Cpu.CpuArchitecture
}
func (h *SHostInfo) IsAarch64() bool {
return h.GetCpuArchitecture() == "aarch64"
}
func (h *SHostInfo) IsX8664() bool {
return h.GetCpuArchitecture() == "x86_64"
}
func NewHostInfo() (*SHostInfo, error) {
var res = new(SHostInfo)
res.sysinfo = &SSysInfo{}
@@ -1731,9 +1740,9 @@ func NewHostInfo() (*SHostInfo, error) {
res.Cpu = cpu
}
if cpu.CpuArchitecture == "aarch64" {
if res.IsAarch64() {
qemutils.UseAarch64()
} else if cpu.CpuArchitecture != "x86_64" {
} else if !res.IsX8664() {
return nil, fmt.Errorf("unsupport cpu architecture %s", cpu.CpuArchitecture)
}

View File

@@ -499,14 +499,14 @@ func (m *SGuestMonitor) Netio() jsonutils.JSONObject {
uptime, _ := host.Uptime()
meta.Set("uptime", jsonutils.NewInt(int64(uptime)))
data.Set("meta", meta)
data.Set("bps_sent", jsonutils.NewInt(int64(nicStat.BytesRecv*8)))
data.Set("bps_recv", jsonutils.NewInt(int64(nicStat.BytesSent*8)))
data.Set("packets_sent", jsonutils.NewInt(int64(nicStat.PacketsRecv)))
data.Set("packets_recv", jsonutils.NewInt(int64(nicStat.PacketsSent)))
data.Set("err_in", jsonutils.NewInt(int64(nicStat.Errout)))
data.Set("err_out", jsonutils.NewInt(int64(nicStat.Errin)))
data.Set("drop_in", jsonutils.NewInt(int64(nicStat.Dropout)))
data.Set("drop_out", jsonutils.NewInt(int64(nicStat.Dropin)))
data.Set("bits_recv", jsonutils.NewInt(int64(nicStat.BytesRecv*8)))
data.Set("bits_sent", jsonutils.NewInt(int64(nicStat.BytesSent*8)))
data.Set("packets_recv", jsonutils.NewInt(int64(nicStat.PacketsRecv)))
data.Set("packets_sent", jsonutils.NewInt(int64(nicStat.PacketsSent)))
data.Set("err_out", jsonutils.NewInt(int64(nicStat.Errout)))
data.Set("err_in", jsonutils.NewInt(int64(nicStat.Errin)))
data.Set("drop_out", jsonutils.NewInt(int64(nicStat.Dropout)))
data.Set("drop_in", jsonutils.NewInt(int64(nicStat.Dropin)))
res.Add(data)
}
return res

View File

@@ -41,6 +41,7 @@ type IHost interface {
GetMediumType() string
GetMasterIp() string
GetCpuArchitecture() string
IsAarch64() bool
IsHugepagesEnabled() bool
IsKvmSupport() bool

View File

@@ -22,10 +22,9 @@ import (
"path"
"strings"
"github.com/pkg/errors"
"yunion.io/x/jsonutils"
"yunion.io/x/log"
"yunion.io/x/pkg/errors"
"yunion.io/x/pkg/utils"
api "yunion.io/x/onecloud/pkg/apis/compute"
@@ -155,7 +154,9 @@ func (d *SLocalDisk) Resize(ctx context.Context, params interface{}) (jsonutils.
// d.Fallocate()
}
d.ResizeFs(d.GetPath())
if err := d.ResizeFs(d.GetPath()); err != nil {
return nil, errors.Wrapf(err, "resize fs %s", d.GetPath())
}
return d.GetDiskDesc(), nil
}

View File

@@ -24,6 +24,7 @@ import (
"yunion.io/x/jsonutils"
"yunion.io/x/log"
"yunion.io/x/pkg/errors"
"yunion.io/x/pkg/utils"
api "yunion.io/x/onecloud/pkg/apis/compute"
@@ -124,7 +125,10 @@ func (d *SRBDDisk) Resize(ctx context.Context, params interface{}) (jsonutils.JS
return nil, err
}
d.ResizeFs(d.GetPath())
if err := d.ResizeFs(d.GetPath()); err != nil {
return nil, errors.Wrapf(err, "resize fs %s", d.GetPath())
}
return d.GetDiskDesc(), nil
}

View File

@@ -71,7 +71,7 @@ func AddDiskHandler(prefix string, app *appsrv.Application) {
app.AddHandler("POST",
fmt.Sprintf("%s/%s/<storageId>/<action>/<diskId>", prefix, keyWord),
auth.Authenticate(perfomrDiskActions))
auth.Authenticate(performDiskActions))
app.AddHandler("GET",
fmt.Sprintf("%s/%s/<storageId>/<diskId>/status", prefix, keyWord),
auth.Authenticate(getDiskStatus))
@@ -206,7 +206,7 @@ func saveToGlance(ctx context.Context, w http.ResponseWriter, r *http.Request) {
hostutils.ResponseOk(ctx, w)
}
func perfomrDiskActions(ctx context.Context, w http.ResponseWriter, r *http.Request) {
func performDiskActions(ctx context.Context, w http.ResponseWriter, r *http.Request) {
params, _, body := appsrv.FetchEnv(ctx, w, r)
if body == nil {
body = jsonutils.NewDict()
@@ -230,7 +230,8 @@ func perfomrDiskActions(ctx context.Context, w http.ResponseWriter, r *http.Requ
var disk storageman.IDisk
var err error
if action != "create" {
rebuild, _ := body.Bool("disk", "rebuild")
if action != "create" || rebuild {
disk, err = storage.GetDiskById(diskId)
if err != nil {
hostutils.Response(ctx, w, httperrors.NewGeneralError(errors.Wrapf(err, "GetDiskById(%s)", diskId)))

View File

@@ -154,7 +154,7 @@ func (c *SAgentImageCacheManager) prefetchImageCacheByUpload(ctx context.Context
return nil, err
}
localImgPath, _ := localImage.GetString("path")
localImgSize, _ := localImage.Int("size")
//localImgSize, _ := localImage.Int("size")
client, err := esxi.NewESXiClientFromAccessInfo(ctx, &data.Datastore)
if err != nil {
@@ -180,14 +180,13 @@ func (c *SAgentImageCacheManager) prefetchImageCacheByUpload(ctx context.Context
exists = true
}
} else {
ret, err := ds.CheckFile(ctx, remotePath)
_, err := ds.ListPath(ctx, remotePath)
if err != nil {
log.Debugf("ds.CheckFile failed: %s", err)
} else {
if int64(ret.Size) == localImgSize {
// exist and same size
exists = true
if errors.Cause(err) != errors.ErrNotFound {
return nil, errors.Wrapf(err, "unable to check file with path %s", remotePath)
}
} else {
exists = true
}
}
log.Debugf("exist: %t, remotePath: %s", exists, remotePath)

View File

@@ -134,36 +134,36 @@ func (as *SAgentStorage) agentRebuildRoot(ctx context.Context, data jsonutils.JS
return vm.DoRebuildRoot(ctx, newPath, diskId)
}
func (as *SAgentStorage) agentCreateGuest(ctx context.Context, data *jsonutils.JSONDict) error {
func (as *SAgentStorage) agentCreateGuest(ctx context.Context, data *jsonutils.JSONDict) (bool, error) {
hd := SHostDatastore{}
err := data.Unmarshal(&hd)
if err != nil {
return errors.Wrap(err, hostutils.ParamsError.Error())
return false, errors.Wrap(err, hostutils.ParamsError.Error())
}
host, ds, err := as.getHostAndDatastore(ctx, hd)
if err != nil {
return err
return false, err
}
desc, _ := data.Get("desc")
descDict, ok := desc.(*jsonutils.JSONDict)
if !ok {
return errors.Wrap(hostutils.ParamsError, "agentCreateGuest data format error")
return false, errors.Wrap(hostutils.ParamsError, "agentCreateGuest data format error")
}
createParam := esxi.SCreateVMParam{}
err = descDict.Unmarshal(&createParam)
if err != nil {
return errors.Wrapf(err, "%s: fail to unmarshal to esxi.SCreateVMParam", hostutils.ParamsError)
return false, errors.Wrapf(err, "%s: fail to unmarshal to esxi.SCreateVMParam", hostutils.ParamsError)
}
vm, err := host.CreateVM2(ctx, ds, createParam)
needDeploy, vm, err := host.CreateVM2(ctx, ds, createParam)
if err != nil {
return errors.Wrap(err, "SHost.CreateVM2")
return false, errors.Wrap(err, "SHost.CreateVM2")
}
name, _ := descDict.GetString("name")
err = as.tryRenameVm(ctx, vm, name)
if err != nil {
return errors.Wrapf(err, "RenameVm name '%s'", name)
return false, errors.Wrapf(err, "RenameVm name '%s'", name)
}
return nil
return needDeploy, nil
}
func (as *SAgentStorage) tryRenameVm(ctx context.Context, vm *esxi.SVirtualMachine, name string) error {
@@ -194,8 +194,12 @@ func (as *SAgentStorage) AgentDeployGuest(ctx context.Context, data interface{})
init := false
dataDict := data.(*jsonutils.JSONDict)
action, _ := dataDict.GetString("action")
var (
needDeploy bool
err error
)
if action == "create" {
err := as.agentCreateGuest(ctx, dataDict)
needDeploy, err = as.agentCreateGuest(ctx, dataDict)
if err != nil {
return nil, errors.Wrap(err, "agentCreateGuest")
}
@@ -275,49 +279,52 @@ func (as *SAgentStorage) AgentDeployGuest(ctx context.Context, data interface{})
}
log.Debugf("host: %s, port: %d, user: %s, passwd: %s", info.Host, info.Port, info.Account, info.Password)
vddkInfo := deployapi.VDDKConInfo{
Host: info.Host,
Port: int32(info.Port),
User: info.Account,
Passwd: info.Password,
Vmref: vmref,
}
guestDesc := deployapi.GuestDesc{}
err = dataDict.Unmarshal(&guestDesc, "desc")
if err != nil {
return nil, errors.Wrapf(err, "%s: unmarshal to guestDesc", hostutils.ParamsError.Error())
}
desc, _ := dataDict.Get("desc")
guestDesc.Hypervisor = api.HYPERVISOR_ESXI
deploy, err := deployclient.GetDeployClient().DeployGuestFs(ctx, &deployapi.DeployParams{
DiskPath: rootPath,
GuestDesc: &guestDesc,
DeployInfo: &deployapi.DeployInfo{
PublicKey: &key,
Deploys: deployArray,
Password: passwd,
IsInit: init,
WindowsDefaultAdminUser: true,
},
VddkInfo: &vddkInfo,
})
customize := false
if err != nil {
log.Errorf("unable to DeployGuestFs: %v", err)
customize = true
} else if deploy == nil {
log.Errorf("unable to DeployGuestFs: deploy is nil")
customize = true
} else if len(deploy.Os) == 0 {
log.Errorf("unable to DeployGuestFs: os is empty")
customize = true
}
if customize == true {
as.waitVmToolsVersion(ctx, vm)
err = vm.DoCustomize(ctx, desc)
var deploy *deployapi.DeployGuestFsResponse
if needDeploy {
vddkInfo := deployapi.VDDKConInfo{
Host: info.Host,
Port: int32(info.Port),
User: info.Account,
Passwd: info.Password,
Vmref: vmref,
}
guestDesc := deployapi.GuestDesc{}
err = dataDict.Unmarshal(&guestDesc, "desc")
if err != nil {
log.Errorf("unable to DoCustomize for vm %s: %v", vm.GetId(), err)
return nil, errors.Wrapf(err, "%s: unmarshal to guestDesc", hostutils.ParamsError.Error())
}
desc, _ := dataDict.Get("desc")
guestDesc.Hypervisor = api.HYPERVISOR_ESXI
deploy, err = deployclient.GetDeployClient().DeployGuestFs(ctx, &deployapi.DeployParams{
DiskPath: rootPath,
GuestDesc: &guestDesc,
DeployInfo: &deployapi.DeployInfo{
PublicKey: &key,
Deploys: deployArray,
Password: passwd,
IsInit: init,
WindowsDefaultAdminUser: true,
},
VddkInfo: &vddkInfo,
})
customize := false
if err != nil {
log.Errorf("unable to DeployGuestFs: %v", err)
customize = true
} else if deploy == nil {
log.Errorf("unable to DeployGuestFs: deploy is nil")
customize = true
} else if len(deploy.Os) == 0 {
log.Errorf("unable to DeployGuestFs: os is empty")
customize = true
}
if customize == true {
as.waitVmToolsVersion(ctx, vm)
err = vm.DoCustomize(ctx, desc)
if err != nil {
log.Errorf("unable to DoCustomize for vm %s: %v", vm.GetId(), err)
}
}
}

View File

@@ -192,10 +192,13 @@ func (s *SLocalStorage) DeleteDiskfile(diskpath string) error {
destFile = fmt.Sprintf("%s.%d", path.Base(diskpath), time.Now().Unix())
)
if err := procutils.NewCommand("mkdir", "-p", destDir).Run(); err != nil {
log.Errorf("Fail to mkdir %s for recycle: %s", destDir, err)
return err
}
log.Infof("Move deleted disk file %s to recycle %s", diskpath, destDir)
return procutils.NewCommand("mv", "-f", diskpath, path.Join(destDir, destFile)).Run()
} else {
log.Infof("Delete disk file %s immediately", diskpath)
return procutils.NewCommand("rm", "-rf", diskpath).Run()
}
}

View File

@@ -620,7 +620,7 @@ func (self *SImage) ValidateUpdateData(ctx context.Context, userCred mcclient.To
if appParams != nil && appParams.Request.ContentLength > 0 {
return nil, httperrors.NewInvalidStatusError("cannot upload in status %s", self.Status)
}
if minDiskSize, err := data.Int("min_disk"); err == nil {
if minDiskSize, err := data.Int("min_disk"); err == nil && self.DiskFormat != string(qemuimg.ISO) {
img, err := qemuimg.NewQemuImage(self.getLocalLocation())
if err != nil {
return nil, errors.Wrap(err, "open image")
@@ -917,9 +917,9 @@ func (manager *SImageManager) count(scope rbacutils.TRbacScope, ownerId mcclient
sq = sq.IsFalse("pending_deleted")
}
if isISO.IsTrue() {
sq = sq.Equals("disk_format", "iso")
sq = sq.Equals("disk_format", string(qemuimg.ISO))
} else if isISO.IsFalse() {
sq = sq.NotEquals("disk_format", "iso")
sq = sq.NotEquals("disk_format", string(qemuimg.ISO))
}
cnt, _ := sq.CountWithError()
@@ -973,13 +973,13 @@ func (manager *SImageManager) Usage(scope rbacutils.TRbacScope, ownerId mcclient
count := manager.count(scope, ownerId, api.IMAGE_STATUS_ACTIVE, tristate.False, false, tristate.False)
expandUsageCount(usages, prefix, "img", "", count)
count = manager.count(scope, ownerId, api.IMAGE_STATUS_ACTIVE, tristate.True, false, tristate.False)
expandUsageCount(usages, prefix, "iso", "", count)
expandUsageCount(usages, prefix, string(qemuimg.ISO), "", count)
count = manager.count(scope, ownerId, api.IMAGE_STATUS_ACTIVE, tristate.None, false, tristate.False)
expandUsageCount(usages, prefix, "imgiso", "", count)
count = manager.count(scope, ownerId, "", tristate.False, true, tristate.False)
expandUsageCount(usages, prefix, "img", "pending_delete", count)
count = manager.count(scope, ownerId, "", tristate.True, true, tristate.False)
expandUsageCount(usages, prefix, "iso", "pending_delete", count)
expandUsageCount(usages, prefix, string(qemuimg.ISO), "pending_delete", count)
count = manager.count(scope, ownerId, "", tristate.None, true, tristate.False)
expandUsageCount(usages, prefix, "imgiso", "pending_delete", count)
return usages

View File

@@ -15,7 +15,6 @@
package locale
import (
"fmt"
"strings"
"yunion.io/x/jsonutils"
@@ -197,7 +196,20 @@ func generatePolicies(scope rbacutils.TRbacScope, def sPolicyDefinition) []SPoli
ret := make([]SPolicyData, 0)
for _, role := range roleConfs {
name := fmt.Sprintf("%s%s%s", level, def.Name, role.name)
nameSegs := make([]string, 0)
if len(level) > 0 {
nameSegs = append(nameSegs, level)
}
if len(def.Name) > 0 {
nameSegs = append(nameSegs, def.Name)
}
if len(role.name) > 0 {
nameSegs = append(nameSegs, role.name)
}
name := strings.Join(nameSegs, "-")
if name == "sys-admin" {
name = "sysadmin"
}
var policy jsonutils.JSONObject
if def.Services != nil {
policy = role.policyFunc(def.Services)

View File

@@ -437,7 +437,7 @@ var (
DescriptionCN: "域管理员",
Description: "Domain administrator",
Policies: []string{
"domainadmin",
"domain-admin",
},
IsPublic: true,
},
@@ -446,7 +446,7 @@ var (
DescriptionCN: "项目主管",
Description: "Project owner",
Policies: []string{
"projectadmin",
"project-admin",
},
IsPublic: true,
},
@@ -455,8 +455,8 @@ var (
DescriptionCN: "系统财务管理员",
Description: "System finance administrator",
Policies: []string{
"sysmeteradmin",
"sysdashboard",
"sys-meter-admin",
"sys-dashboard",
},
IsPublic: false,
},
@@ -465,8 +465,8 @@ var (
DescriptionCN: "域财务管理员",
Description: "Domain finance administrator",
Policies: []string{
"domainmeteradmin",
"domaindashboard",
"domain-meter-admin",
"domain-dashboard",
},
IsPublic: true,
},
@@ -475,8 +475,8 @@ var (
DescriptionCN: "项目财务管理员",
Description: "Project finance administrator",
Policies: []string{
"projectmeteradmin",
"projectdashboard",
"project-meter-admin",
"project-dashboard",
},
IsPublic: true,
},
@@ -485,8 +485,8 @@ var (
DescriptionCN: "项目操作员",
Description: "Project operator",
Policies: []string{
"projecteditor",
"projectdashboard",
"project-editor",
"project-dashboard",
},
IsPublic: true,
},
@@ -495,8 +495,8 @@ var (
DescriptionCN: "项目只读成员",
Description: "Project read-only member",
Policies: []string{
"projectviewer",
"projectdashboard",
"project-viewer",
"project-dashboard",
},
IsPublic: true,
},

View File

@@ -29,7 +29,6 @@ import (
"yunion.io/x/onecloud/pkg/appsrv"
"yunion.io/x/onecloud/pkg/cloudcommon/db"
"yunion.io/x/onecloud/pkg/httperrors"
"yunion.io/x/onecloud/pkg/keystone/options"
"yunion.io/x/onecloud/pkg/mcclient"
"yunion.io/x/onecloud/pkg/mcclient/auth"
"yunion.io/x/onecloud/pkg/util/rbacutils"
@@ -249,9 +248,10 @@ func (manager *SAssignmentManager) ProjectAddUser(ctx context.Context, userCred
return err
}
if project.DomainId != user.DomainId {
if project.DomainId != api.DEFAULT_DOMAIN_ID && !options.Options.AllowJoinProjectsAcrossDomains {
return httperrors.NewInputParameterError("join user into project of default domain or identical domain")
} else if !db.IsAllowPerform(rbacutils.ScopeSystem, userCred, user, "join-project") {
// if project.DomainId != api.DEFAULT_DOMAIN_ID && !options.Options.AllowJoinProjectsAcrossDomains {
// return httperrors.NewInputParameterError("join user into project of default domain or identical domain")
// } else
if !db.IsAllowPerform(rbacutils.ScopeSystem, userCred, user, "join-project") {
return httperrors.NewForbiddenError("not enough privilege")
}
} else {
@@ -349,9 +349,10 @@ func (manager *SAssignmentManager) projectAddGroup(ctx context.Context, userCred
return err
}
if project.DomainId != group.DomainId {
if project.DomainId != api.DEFAULT_DOMAIN_ID && !options.Options.AllowJoinProjectsAcrossDomains {
return httperrors.NewInputParameterError("join group into project of default domain or identical domain")
} else if !db.IsAllowPerform(rbacutils.ScopeSystem, userCred, group, "join-project") {
// if project.DomainId != api.DEFAULT_DOMAIN_ID && !options.Options.AllowJoinProjectsAcrossDomains {
// return httperrors.NewInputParameterError("join group into project of default domain or identical domain")
// } else
if !db.IsAllowPerform(rbacutils.ScopeSystem, userCred, group, "join-project") {
return httperrors.NewForbiddenError("not enough privilege")
}
} else {

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