From 4eb68e7fb2c2b70cc72b54132870c06d5c835b9b Mon Sep 17 00:00:00 2001 From: Hanxiang Gao Date: Tue, 1 Jun 2021 23:26:19 +0800 Subject: [PATCH] feat: Add initial code of skyline-console Add initial code of skyline-console Change-Id: Icba2152a014761f53789357b5085d0779cd0e2a4 --- .babelrc | 66 + .dockerignore | 13 + .eslintignore | 4 + .eslintrc | 77 + .gitignore | 29 + .prettierignore | 3 + .prettierrc | 5 + Gruntfile.js | 57 + LICENSE | 177 + Makefile | 83 + README.md | 63 + config/theme.js | 27 + config/webpack.common.js | 142 + config/webpack.dev.js | 150 + config/webpack.e2e.js | 175 + config/webpack.prod.js | 174 + cypress.json | 28 + jest.config.js | 36 + jsconfig.json | 24 + package.json | 156 + poetry.lock | 8 + pyproject.toml | 10 + skyline_console/__init__.py | 1 + skyline_console/__main__.py | 12 + src/api/cinder/backup.js | 47 + src/api/cinder/base.js | 23 + src/api/cinder/os-availability-zone.js | 31 + src/api/cinder/os-quota-sets.js | 52 + src/api/cinder/os-services.js | 54 + src/api/cinder/qos-specs.js | 106 + src/api/cinder/snapshots.js | 62 + src/api/cinder/types.js | 180 + src/api/cinder/volume-transfers.js | 80 + src/api/cinder/volume.js | 62 + src/api/glance/base.js | 23 + src/api/glance/images.js | 174 + src/api/glance/metadefs.js | 106 + src/api/gocron/base.js | 23 + src/api/heat/base.js | 23 + src/api/heat/stacks.js | 86 + src/api/ironic-inspector/base.js | 23 + src/api/ironic/base.js | 23 + src/api/ironic/nodes.js | 205 + src/api/ironic/port-groups.js | 51 + src/api/ironic/ports.js | 63 + src/api/keystone/base.js | 23 + src/api/keystone/domain.js | 134 + src/api/keystone/group.js | 113 + src/api/keystone/project.js | 170 + src/api/keystone/role-assignment.js | 27 + src/api/keystone/role.js | 38 + src/api/keystone/system.js | 76 + src/api/keystone/user.js | 126 + src/api/neutron/agent.js | 79 + src/api/neutron/availability-zones.js | 32 + src/api/neutron/base.js | 23 + src/api/neutron/extensions.js | 27 + src/api/neutron/floating-ips.js | 89 + src/api/neutron/networks.js | 72 + src/api/neutron/ports.js | 58 + src/api/neutron/qos-policies.js | 144 + src/api/neutron/quotas.js | 49 + src/api/neutron/routers.js | 102 + src/api/neutron/security-groups.js | 28 + src/api/neutron/subnets.js | 69 + src/api/neutron/vpn.js | 108 + src/api/nova/base.js | 23 + src/api/nova/flavor.js | 116 + src/api/nova/os-aggregates.js | 32 + src/api/nova/os-hypervisors.js | 38 + src/api/nova/os-quota-sets.js | 45 + src/api/nova/os-service.js | 47 + src/api/nova/server.js | 202 + src/api/octavia/base.js | 23 + src/api/octavia/lbaas.js | 132 + src/api/octavia/pools.js | 28 + src/api/panko/base.js | 23 + src/api/panko/event.js | 50 + src/api/placement/base.js | 23 + src/api/placement/resource-providers.js | 28 + src/api/placement/traits.js | 31 + src/api/skyline/base.js | 23 + src/api/skyline/contrib.js | 47 + src/api/skyline/extension.js | 155 + src/api/skyline/login.js | 64 + src/api/skyline/policy.js | 40 + src/api/skyline/setting.js | 63 + src/api/storage/storage-classes.js | 27 + src/api/swift/base.js | 23 + src/asset/image/ArchLinux.svg | 1 + src/asset/image/TmpFileImage.png | Bin 0 -> 4042 bytes src/asset/image/adminImage.svg | 13 + src/asset/image/adminInstance.svg | 7 + src/asset/image/adminNetwork.svg | 13 + src/asset/image/adminRouter.svg | 13 + src/asset/image/adminSecurityGroup.svg | 16 + src/asset/image/adminVolume.svg | 13 + src/asset/image/animnbus.png | Bin 0 -> 41237 bytes src/asset/image/arch.svg | 12 + src/asset/image/centos.svg | 1 + src/asset/image/cloud.png | Bin 0 -> 17009 bytes src/asset/image/coreos.svg | 1 + src/asset/image/critical-alert.svg | 1 + src/asset/image/debian.svg | 1 + src/asset/image/empty-card.svg | 76 + src/asset/image/favicon.ico | Bin 0 -> 6512 bytes src/asset/image/fedora.svg | 1 + src/asset/image/freebsd.svg | 1 + src/asset/image/image.svg | 1 + src/asset/image/instance.png | Bin 0 -> 7589 bytes src/asset/image/instance.svg | 1 + src/asset/image/interface.png | Bin 0 -> 3960 bytes src/asset/image/interface.svg | 1 + src/asset/image/loadBalancer.png | Bin 0 -> 15330 bytes src/asset/image/lock.svg | 12 + src/asset/image/login.png | Bin 0 -> 362273 bytes src/asset/image/loginFull.png | Bin 0 -> 229330 bytes src/asset/image/loginRightLogo.png | Bin 0 -> 3230 bytes src/asset/image/logo-extend.svg | 11 + src/asset/image/logo-small.svg | 18 + src/asset/image/logo.png | Bin 0 -> 3803 bytes src/asset/image/major-alert.svg | 1 + src/asset/image/minor-alert.svg | 1 + src/asset/image/others.svg | 1 + src/asset/image/overview-instance.svg | 13 + src/asset/image/overview-network.svg | 12 + src/asset/image/overview-router.svg | 14 + src/asset/image/overview-volume.svg | 17 + src/asset/image/router.png | Bin 0 -> 14823 bytes src/asset/image/security-group.svg | 1 + src/asset/image/ubuntu.svg | 1 + src/asset/image/unlock.svg | 12 + src/asset/image/volume-container.svg | 34 + src/asset/image/volume.svg | 1 + src/asset/image/windows.svg | 1 + src/asset/template/index.html | 12 + src/components/Cards/EmptyTable/index.jsx | 69 + src/components/Cards/EmptyTable/index.less | 18 + src/components/Cards/NotFound/index.jsx | 69 + src/components/Cards/NotFound/index.less | 41 + src/components/CodeEditor/AceEditor.jsx | 41 + src/components/CodeEditor/custom.less | 59 + src/components/CodeEditor/index.jsx | 101 + src/components/CodeEditor/index.less | 4 + src/components/Confirm/index.jsx | 107 + src/components/Confirm/index.less | 25 + src/components/DetailCard/index.jsx | 157 + src/components/DetailCard/index.less | 54 + src/components/Empty/index.jsx | 43 + src/components/Empty/index.less | 15 + src/components/Form/index.jsx | 511 + src/components/Form/index.less | 104 + src/components/FormItem/AddSelect/index.jsx | 272 + src/components/FormItem/AddSelect/index.less | 37 + src/components/FormItem/Checkbox/index.jsx | 48 + .../FormItem/CheckboxGroup/index.jsx | 68 + .../FormItem/Descriptions/index.jsx | 75 + .../FormItem/Descriptions/index.less | 9 + .../FormItem/IPDistributer/IPAddress.jsx | 71 + .../FormItem/IPDistributer/Item.jsx | 83 + .../FormItem/IPDistributer/index.jsx | 121 + src/components/FormItem/InputInt/index.jsx | 27 + .../FormItem/InstanceVolume/index.jsx | 191 + .../FormItem/InstanceVolume/index.less | 15 + src/components/FormItem/IpInput/index.jsx | 163 + src/components/FormItem/IpInput/index.less | 45 + .../FormItem/IpInputSimple/index.jsx | 58 + .../FormItem/IpInputSimple/index.less | 45 + src/components/FormItem/JsonInput/index.jsx | 63 + .../FormItem/KeyValueInput/index.jsx | 108 + src/components/FormItem/Label/index.jsx | 96 + src/components/FormItem/Label/index.less | 3 + .../FormItem/MacAddressInput/index.jsx | 116 + .../FormItem/MemberAllocator/IPAddress.jsx | 86 + .../FormItem/MemberAllocator/Item.jsx | 51 + .../FormItem/MemberAllocator/index.jsx | 309 + .../FormItem/MetadataTransfer/EnumSelect.jsx | 110 + .../FormItem/MetadataTransfer/index.jsx | 508 + src/components/FormItem/More/index.jsx | 61 + src/components/FormItem/More/index.less | 3 + src/components/FormItem/NUMAInput/index.jsx | 94 + src/components/FormItem/NUMAInput/index.less | 7 + src/components/FormItem/NameInput/index.jsx | 165 + .../FormItem/NetworkSelect/index.jsx | 369 + .../FormItem/NetworkSelect/index.less | 36 + .../FormItem/NetworkSelectTable/index.jsx | 190 + src/components/FormItem/PortRange/index.jsx | 49 + src/components/FormItem/Radio/index.jsx | 90 + src/components/FormItem/Radio/index.less | 18 + src/components/FormItem/Select/index.jsx | 105 + src/components/FormItem/Select/index.less | 6 + src/components/FormItem/SelectTable/index.jsx | 812 + .../FormItem/SelectTable/index.less | 69 + src/components/FormItem/SliderInput/index.jsx | 102 + src/components/FormItem/Switch/index.jsx | 54 + .../FormItem/TabSelectTable/index.jsx | 189 + .../FormItem/TextareaFromFile/index.jsx | 76 + src/components/FormItem/Title/index.jsx | 34 + src/components/FormItem/Title/index.less | 7 + src/components/FormItem/Transfer/index.jsx | 171 + src/components/FormItem/Upload/index.jsx | 95 + .../FormItem/VolumeSelectTable/index.jsx | 152 + src/components/FormItem/index.jsx | 378 + src/components/FormItem/index.less | 5 + src/components/ImageType/index.jsx | 83 + src/components/ImageType/index.less | 6 + src/components/Infos/index.jsx | 56 + src/components/Infos/index.less | 14 + .../Layout/GlobalHeader/AvatarDropdown.jsx | 164 + src/components/Layout/GlobalHeader/OpenRc.jsx | 177 + .../Layout/GlobalHeader/Password.jsx | 86 + .../Layout/GlobalHeader/ProjectDropdown.jsx | 181 + .../Layout/GlobalHeader/ProjectTable.jsx | 147 + .../Layout/GlobalHeader/RightContent.jsx | 107 + src/components/Layout/GlobalHeader/Token.jsx | 132 + src/components/Layout/GlobalHeader/index.jsx | 28 + src/components/Layout/GlobalHeader/index.less | 192 + src/components/Layout/GlobalNav/index.jsx | 81 + src/components/Layout/GlobalNav/index.less | 102 + src/components/Layout/GlobalNav/item.jsx | 57 + .../Layout/HeaderDropdown/index.jsx | 28 + .../Layout/HeaderDropdown/index.less | 16 + src/components/Layout/Nav/index.jsx | 81 + src/components/Layout/Nav/index.less | 134 + src/components/Layout/Nav/item.jsx | 88 + src/components/Layout/Selector/index.jsx | 150 + src/components/Layout/Selector/index.less | 98 + src/components/Layout/index.js | 17 + src/components/Loading/index.jsx | 47 + src/components/MagicInput/index.jsx | 574 + src/components/MagicInput/index.less | 133 + src/components/ModalButton/index.jsx | 195 + src/components/NotFound/index.jsx | 70 + src/components/NotFound/index.less | 39 + src/components/Notify/index.jsx | 160 + src/components/Notify/index.less | 21 + src/components/PageLoading/index.jsx | 33 + src/components/Pagination/index.jsx | 228 + src/components/Pagination/index.less | 8 + src/components/Progress/index.jsx | 70 + src/components/ProjectProgress/index.jsx | 79 + src/components/SelectLang/index.jsx | 67 + src/components/SelectLang/index.less | 23 + src/components/SimpleForm/index.jsx | 96 + src/components/Status/index.jsx | 112 + src/components/StepForm/index.jsx | 397 + src/components/StepForm/index.less | 65 + src/components/TableButton/RuleButton.jsx | 32 + src/components/TableButton/index.jsx | 61 + src/components/Tables/Base/Action/index.jsx | 85 + .../Tables/Base/ActionButton/index.jsx | 499 + .../Tables/Base/ActionButton/index.less | 7 + .../Tables/Base/BatchActionButtons/index.jsx | 156 + .../Tables/Base/BatchActionButtons/index.less | 15 + .../Tables/Base/CustomColumns/index.jsx | 95 + .../Tables/Base/CustomColumns/index.less | 4 + src/components/Tables/Base/Download/index.jsx | 348 + .../Tables/Base/Download/index.less | 4 + .../Tables/Base/ItemActionButtons/index.jsx | 338 + .../Tables/Base/ItemActionButtons/index.less | 41 + .../Base/PrimaryActionButtons/index.jsx | 128 + src/components/Tables/Base/index.jsx | 902 + src/components/Tables/Base/index.less | 124 + src/components/Tables/SimpleTable/index.jsx | 316 + src/components/Tables/SimpleTable/index.less | 22 + src/components/TimeFilter/index.jsx | 116 + src/components/TimeFilter/index.less | 3 + src/components/VisibleObserver/index.jsx | 62 + src/containers/Action/ConfirmAction/index.jsx | 240 + src/containers/Action/FormAction/index.jsx | 39 + src/containers/Action/ModalAction/index.jsx | 159 + src/containers/Action/StepAction/index.jsx | 43 + src/containers/Action/index.jsx | 18 + src/containers/BaseDetail/index.jsx | 178 + src/containers/BaseDetail/index.less | 21 + src/containers/List/index.jsx | 1081 ++ src/containers/List/index.less | 21 + src/containers/TabDetail/index.jsx | 417 + src/containers/TabDetail/index.less | 170 + src/containers/TabList/index.jsx | 161 + src/containers/TabList/index.less | 22 + src/core/App.jsx | 61 + src/core/i18n.js | 135 + src/core/index.jsx | 97 + src/core/routes.js | 102 + src/layouts/Base/Menu.jsx | 244 + src/layouts/Base/Right.jsx | 179 + src/layouts/Base/index.jsx | 232 + src/layouts/Base/index.less | 311 + src/layouts/Blank/index.jsx | 57 + src/layouts/Blank/index.less | 43 + src/layouts/User/index.jsx | 78 + src/layouts/User/index.less | 80 + src/layouts/admin-menu.jsx | 601 + src/layouts/menu.jsx | 396 + src/libs/axios.js | 170 + src/libs/base-url.js | 19 + src/locales/en.json | 1967 +++ src/locales/index.js | 25 + src/locales/zh.json | 1967 +++ src/pages/Management/App.jsx | 21 + .../containers/RecycleBin/actions/Delete.jsx | 52 + .../containers/RecycleBin/actions/Recover.js | 52 + .../containers/RecycleBin/actions/index.jsx | 30 + .../containers/RecycleBin/index.jsx | 156 + src/pages/Management/routes/index.js | 42 + src/pages/base/App.jsx | 21 + src/pages/base/containers/404/index.jsx | 35 + .../components/ComputeService.jsx | 86 + .../components/NetworkService.jsx | 86 + .../AdminOverview/components/PlatformInfo.jsx | 104 + .../components/ResourceOverview.jsx | 202 + .../components/VirtualResource.jsx | 132 + .../base/containers/AdminOverview/index.jsx | 65 + .../base/containers/AdminOverview/style.less | 141 + .../Overview/components/ProjectInfo.jsx | 90 + .../Overview/components/QuotaOverview.jsx | 275 + .../Overview/components/ResourceStatistic.jsx | 233 + src/pages/base/containers/Overview/index.jsx | 96 + src/pages/base/containers/Overview/style.less | 213 + src/pages/base/routes/index.js | 32 + src/pages/compute/App.jsx | 21 + .../BareMetalNode/Detail/BaseDetail.jsx | 187 + .../Detail/Port/actions/Create.jsx | 173 + .../Detail/Port/actions/Delete.jsx | 50 + .../Detail/Port/actions/Edit.jsx | 233 + .../Detail/Port/actions/index.jsx | 32 + .../BareMetalNode/Detail/Port/index.jsx | 77 + .../Detail/PortGroup/actions/Create.jsx | 130 + .../Detail/PortGroup/actions/Delete.jsx | 50 + .../Detail/PortGroup/actions/Edit.jsx | 195 + .../Detail/PortGroup/actions/index.jsx | 32 + .../BareMetalNode/Detail/PortGroup/index.jsx | 77 + .../containers/BareMetalNode/Detail/index.jsx | 111 + .../actions/ClearMaintenance.jsx | 41 + .../actions/Create/DriveInfo.jsx | 166 + .../actions/Create/DriveInterface.jsx | 123 + .../BareMetalNode/actions/Create/NodeInfo.jsx | 247 + .../BareMetalNode/actions/Create/index.jsx | 224 + .../BareMetalNode/actions/Delete.jsx | 50 + .../containers/BareMetalNode/actions/Edit.jsx | 42 + .../BareMetalNode/actions/Inspect.jsx | 71 + .../BareMetalNode/actions/ManageState.jsx | 97 + .../BareMetalNode/actions/PowerOff.jsx | 48 + .../BareMetalNode/actions/PowerOn.jsx | 48 + .../BareMetalNode/actions/SetBootDevice.jsx | 109 + .../BareMetalNode/actions/SetMaintenance.jsx | 66 + .../BareMetalNode/actions/index.jsx | 68 + .../containers/BareMetalNode/index.jsx | 110 + .../containers/Flavor/Arm/actions/Create.jsx | 29 + .../containers/Flavor/Arm/actions/index.jsx | 34 + .../compute/containers/Flavor/Arm/index.jsx | 71 + .../Flavor/BareMetal/actions/Create.jsx | 29 + .../Flavor/BareMetal/actions/index.jsx | 34 + .../containers/Flavor/BareMetal/index.jsx | 72 + .../containers/Flavor/Detail/BaseDetail.jsx | 263 + .../containers/Flavor/Detail/index.jsx | 98 + .../Flavor/Heterogeneous/actions/Create.jsx | 29 + .../Flavor/Heterogeneous/actions/index.jsx | 34 + .../containers/Flavor/Heterogeneous/index.jsx | 73 + .../containers/Flavor/Other/actions/index.jsx | 37 + .../compute/containers/Flavor/Other/index.jsx | 64 + .../containers/Flavor/X86/actions/Create.jsx | 29 + .../containers/Flavor/X86/actions/index.jsx | 34 + .../compute/containers/Flavor/X86/index.jsx | 71 + .../containers/Flavor/actions/Delete.jsx | 53 + .../containers/Flavor/actions/Edit.jsx | 35 + .../Flavor/actions/ManageAccess.jsx | 118 + .../Flavor/actions/ManageMetadata.jsx | 215 + .../actions/StepCreate/AccessTypeSetting.jsx | 79 + .../actions/StepCreate/ParamSetting.jsx | 522 + .../Flavor/actions/StepCreate/index.jsx | 190 + .../containers/Flavor/actions/index.jsx | 34 + src/pages/compute/containers/Flavor/index.jsx | 56 + .../Aggregate/actions/Create.jsx | 112 + .../Aggregate/actions/Delete.jsx | 49 + .../HostAggregate/Aggregate/actions/Edit.jsx | 133 + .../Aggregate/actions/ManageHost.jsx | 150 + .../Aggregate/actions/ManageMetadata.jsx | 180 + .../HostAggregate/Aggregate/actions/index.jsx | 40 + .../HostAggregate/Aggregate/index.jsx | 105 + .../HostAggregate/AvailabilityZone/index.jsx | 82 + .../containers/HostAggregate/index.jsx | 38 + .../ComputeHost/actions/Disable.jsx | 87 + .../ComputeHost/actions/Enable.jsx | 50 + .../Hypervisors/ComputeHost/actions/index.jsx | 33 + .../Hypervisors/ComputeHost/index.jsx | 113 + .../Hypervisors/Hypervisor/Detail/index.jsx | 84 + .../Hypervisors/Hypervisor/index.jsx | 57 + .../compute/containers/Hypervisors/index.jsx | 38 + .../containers/Keypair/Detail/BaseDetail.jsx | 51 + .../containers/Keypair/Detail/index.jsx | 72 + .../containers/Keypair/Detail/index.less | 14 + .../containers/Keypair/actions/Create.jsx | 95 + .../containers/Keypair/actions/Delete.jsx | 54 + .../containers/Keypair/actions/index.jsx | 31 + .../compute/containers/Keypair/index.jsx | 76 + .../containers/ServerGroup/Detail/index.jsx | 81 + .../containers/ServerGroup/Detail/index.less | 40 + .../containers/ServerGroup/actions/Create.jsx | 94 + .../containers/ServerGroup/actions/Delete.jsx | 47 + .../containers/ServerGroup/actions/index.jsx | 34 + .../compute/containers/ServerGroup/index.jsx | 90 + .../containers/image/Detail/BaseDetail.jsx | 204 + .../compute/containers/image/Detail/index.jsx | 94 + src/pages/compute/containers/image/Image.jsx | 210 + .../containers/image/actions/Create.jsx | 299 + .../image/actions/CreateInstance.jsx | 36 + .../containers/image/actions/CreateIronic.jsx | 41 + .../containers/image/actions/CreateVolume.jsx | 112 + .../containers/image/actions/Delete.jsx | 61 + .../compute/containers/image/actions/Edit.jsx | 252 + .../containers/image/actions/ManageAccess.jsx | 115 + .../image/actions/ManageMetadata.jsx | 262 + .../containers/image/actions/index.jsx | 66 + src/pages/compute/containers/image/index.jsx | 49 + .../instance/Detail/BaseDetail/index.jsx | 424 + .../instance/Detail/BaseDetail/index.less | 146 + .../Detail/SecurityGroup/action/Detach.jsx | 54 + .../action/ManageSecurityGroup.jsx | 93 + .../instance/Detail/SecurityGroup/index.jsx | 241 + .../instance/Detail/SecurityGroup/index.less | 41 + .../containers/instance/Detail/index.jsx | 157 + .../instance/actions/AssociateFip.jsx | 193 + .../instance/actions/AttachInterface.jsx | 236 + .../instance/actions/AttachIsoVolume.jsx | 130 + .../instance/actions/AttachVolume.jsx | 113 + .../instance/actions/ChangePassword.jsx | 100 + .../containers/instance/actions/Console.jsx | 71 + .../instance/actions/CreateImage.jsx | 89 + .../actions/CreateIronic/BaseStep/index.jsx | 206 + .../CreateIronic/ConfirmStep/index.jsx | 173 + .../CreateIronic/NetworkStep/index.jsx | 254 + .../actions/CreateIronic/SystemStep/index.jsx | 147 + .../instance/actions/CreateIronic/index.jsx | 312 + .../instance/actions/CreateIronic/index.less | 4 + .../instance/actions/CreateSnapshot.jsx | 89 + .../containers/instance/actions/Delete.jsx | 95 + .../instance/actions/DeleteIronic.jsx | 53 + .../instance/actions/DetachInterface.jsx | 135 + .../instance/actions/DetachIsoVolume.jsx | 143 + .../instance/actions/DetachVolume.jsx | 138 + .../instance/actions/DisassociateFip.jsx | 85 + .../containers/instance/actions/Edit.jsx | 59 + .../instance/actions/ExtendRootVolume.jsx | 120 + .../instance/actions/LiveMigrate.jsx | 155 + .../containers/instance/actions/Lock.jsx | 64 + .../instance/actions/ManageSecurityGroup.jsx | 212 + .../containers/instance/actions/Migrate.jsx | 145 + .../containers/instance/actions/Pause.jsx | 83 + .../containers/instance/actions/Reboot.jsx | 82 + .../containers/instance/actions/Rebuild.jsx | 61 + .../instance/actions/RebuildSelect.jsx | 171 + .../containers/instance/actions/Resize.jsx | 144 + .../instance/actions/ResizeOnline.jsx | 140 + .../containers/instance/actions/Resume.jsx | 78 + .../containers/instance/actions/Shelve.jsx | 84 + .../instance/actions/SoftDelete.jsx | 149 + .../instance/actions/SoftReboot.jsx | 86 + .../containers/instance/actions/Start.jsx | 86 + .../actions/StepCreate/BaseStep/index.jsx | 454 + .../actions/StepCreate/ConfirmStep/index.jsx | 262 + .../actions/StepCreate/NetworkStep/index.jsx | 254 + .../actions/StepCreate/SystemStep/index.jsx | 343 + .../instance/actions/StepCreate/index.jsx | 356 + .../instance/actions/StepCreate/index.less | 4 + .../containers/instance/actions/Stop.jsx | 85 + .../containers/instance/actions/Suspend.jsx | 86 + .../containers/instance/actions/Unlock.jsx | 64 + .../containers/instance/actions/Unpause.jsx | 74 + .../containers/instance/actions/Unshelve.jsx | 55 + .../containers/instance/actions/index.jsx | 167 + .../containers/instance/actions/index.less | 19 + .../instance/components/FlavorSelectTable.jsx | 350 + .../containers/instance/components/index.less | 8 + .../compute/containers/instance/index.jsx | 282 + .../compute/containers/instance/index.less | 84 + src/pages/compute/routes/index.js | 154 + src/pages/configuration/App.jsx | 21 + .../containers/Metadata/Detail/BaseDetail.jsx | 88 + .../containers/Metadata/Detail/index.jsx | 73 + .../containers/Metadata/actions/Create.jsx | 74 + .../containers/Metadata/actions/Delete.jsx | 47 + .../containers/Metadata/actions/Edit.jsx | 84 + .../containers/Metadata/actions/Manage.jsx | 176 + .../containers/Metadata/actions/index.jsx | 36 + .../containers/Metadata/index.jsx | 94 + .../containers/Setting/actions/Edit.jsx | 111 + .../containers/Setting/actions/Reset.jsx | 43 + .../containers/Setting/actions/View.jsx | 97 + .../containers/Setting/actions/index.jsx | 35 + .../containers/Setting/index.jsx | 65 + .../containers/SystemInfo/Catalog.jsx | 86 + .../CinderService/actions/Disable.jsx | 88 + .../CinderService/actions/Enable.jsx | 62 + .../CinderService/actions/index.jsx | 34 + .../SystemInfo/CinderService/index.jsx | 111 + .../ComputeService/actions/Disable.jsx | 90 + .../ComputeService/actions/Enable.jsx | 50 + .../ComputeService/actions/index.jsx | 33 + .../SystemInfo/ComputeService/index.jsx | 112 + .../containers/SystemInfo/HeatService.jsx | 84 + .../NeutronAgent/Detail/BaseDetail.jsx | 84 + .../Detail/Network/actions/Add.jsx | 155 + .../Detail/Network/actions/Remove.jsx | 45 + .../Detail/Network/actions/index.jsx | 27 + .../NeutronAgent/Detail/Network/index.jsx | 81 + .../Detail/Router/actions/Add.jsx | 141 + .../Detail/Router/actions/Remove.jsx | 45 + .../Detail/Router/actions/index.jsx | 27 + .../NeutronAgent/Detail/Router/index.jsx | 61 + .../SystemInfo/NeutronAgent/Detail/index.jsx | 108 + .../NeutronAgent/actions/Disable.jsx | 61 + .../NeutronAgent/actions/Enable.jsx | 61 + .../SystemInfo/NeutronAgent/actions/index.jsx | 34 + .../SystemInfo/NeutronAgent/index.jsx | 112 + .../containers/SystemInfo/index.jsx | 56 + .../containers/SystemInfo/index.less | 0 src/pages/configuration/routes/index.js | 45 + src/pages/heat/App.jsx | 21 + .../containers/Stack/Detail/BaseDetail.jsx | 88 + .../heat/containers/Stack/Detail/Event.jsx | 67 + .../heat/containers/Stack/Detail/Resource.jsx | 239 + .../heat/containers/Stack/Detail/Template.jsx | 63 + .../heat/containers/Stack/Detail/index.jsx | 101 + .../heat/containers/Stack/actions/Abandon.jsx | 74 + .../Stack/actions/Create/Parameter.jsx | 121 + .../Stack/actions/Create/Template.jsx | 77 + .../containers/Stack/actions/Create/index.jsx | 109 + .../heat/containers/Stack/actions/Delete.jsx | 74 + .../heat/containers/Stack/actions/Edit.jsx | 46 + .../heat/containers/Stack/actions/index.jsx | 36 + src/pages/heat/containers/Stack/index.jsx | 126 + src/pages/heat/routes/index.js | 58 + src/pages/identity/App.jsx | 21 + .../containers/Domain/Detail/index.jsx | 112 + .../containers/Domain/Detail/index.less | 59 + .../containers/Domain/actions/Create.jsx | 105 + .../containers/Domain/actions/Delete.jsx | 45 + .../containers/Domain/actions/Edit.jsx | 144 + .../containers/Domain/actions/Enable.jsx | 55 + .../containers/Domain/actions/Forbidden.jsx | 66 + .../containers/Domain/actions/index.jsx | 40 + .../identity/containers/Domain/index.jsx | 78 + .../identity/containers/Domain/index.less | 7 + .../containers/Project/Detail/Quota.jsx | 195 + .../containers/Project/Detail/index.jsx | 138 + .../containers/Project/Detail/index.less | 59 + .../containers/Project/Detail/style.less | 164 + .../containers/Project/actions/Create.jsx | 163 + .../containers/Project/actions/Delete.jsx | 60 + .../containers/Project/actions/Edit.jsx | 115 + .../containers/Project/actions/Enable.jsx | 55 + .../containers/Project/actions/Forbidden.jsx | 66 + .../containers/Project/actions/ModifyTags.jsx | 251 + .../Project/actions/QuotaManager.jsx | 376 + .../containers/Project/actions/Start.jsx | 44 + .../containers/Project/actions/Stop.jsx | 40 + .../Project/actions/UserGroupManager.jsx | 206 + .../Project/actions/UserManager.jsx | 315 + .../containers/Project/actions/index.jsx | 56 + .../identity/containers/Project/index.jsx | 221 + .../identity/containers/Project/index.less | 7 + .../containers/Role/Detail/BaseDetail.jsx | 107 + .../identity/containers/Role/Detail/index.jsx | 102 + .../containers/Role/Detail/index.less | 59 + src/pages/identity/containers/Role/index.jsx | 95 + .../identity/containers/User/Detail/index.jsx | 162 + .../containers/User/Detail/index.less | 59 + .../containers/User/actions/Create.jsx | 398 + .../containers/User/actions/Delete.jsx | 45 + .../identity/containers/User/actions/Edit.jsx | 189 + .../containers/User/actions/Enable.jsx | 55 + .../containers/User/actions/Forbidden.jsx | 66 + .../containers/User/actions/Password.jsx | 76 + .../containers/User/actions/SystemRole.jsx | 320 + .../containers/User/actions/index.jsx | 62 + .../User/actionsInDomain/Create.jsx | 235 + .../containers/User/actionsInDomain/index.jsx | 52 + src/pages/identity/containers/User/index.jsx | 202 + .../containers/UserGroup/Detail/index.jsx | 135 + .../containers/UserGroup/Detail/index.less | 59 + .../containers/UserGroup/actions/Create.jsx | 273 + .../containers/UserGroup/actions/Delete.jsx | 45 + .../UserGroup/actions/DomainPermission.jsx | 125 + .../containers/UserGroup/actions/Edit.jsx | 97 + .../UserGroup/actions/SystemPermission.jsx | 121 + .../UserGroup/actions/UserManager.jsx | 182 + .../containers/UserGroup/actions/index.jsx | 44 + .../identity/containers/UserGroup/index.jsx | 147 + src/pages/identity/routes/index.js | 116 + src/pages/network/App.jsx | 21 + .../FloatingIp/Detail/BaseDetail.jsx | 88 + .../Detail/PortForwarding/actions/Delete.jsx | 56 + .../Detail/PortForwarding/actions/Edit.jsx | 304 + .../Detail/PortForwarding/actions/index.jsx | 40 + .../Detail/PortForwarding/index.jsx | 91 + .../containers/FloatingIp/Detail/index.jsx | 94 + .../FloatingIp/actions/Allocate.jsx | 229 + .../FloatingIp/actions/Associate.jsx | 376 + .../FloatingIp/actions/CreateDNAT.jsx | 233 + .../FloatingIp/actions/Disassociate.js | 44 + .../containers/FloatingIp/actions/Edit.jsx | 88 + .../containers/FloatingIp/actions/Release.jsx | 141 + .../containers/FloatingIp/actions/index.jsx | 67 + .../network/containers/FloatingIp/index.jsx | 213 + .../network/containers/FloatingIp/styles.less | 5 + .../LoadBalancerInstance/Detail/index.jsx | 106 + .../actions/AssociateFIP.jsx | 191 + .../LoadBalancerInstance/actions/Delete.jsx | 75 + .../actions/DisassociateFip.jsx | 42 + .../LoadBalancerInstance/actions/Edit.jsx | 69 + .../actions/StepCreate/BaseStep/index.jsx | 117 + .../actions/StepCreate/index.jsx | 168 + .../LoadBalancerInstance/actions/index.js | 48 + .../LoadBalancerInstance/index.jsx | 133 + .../HealthMonitorStep/index.jsx | 120 + .../ListenerStep/index.jsx | 83 + .../StepCreateComponents/MemberStep/index.jsx | 83 + .../StepCreateComponents/PoolStep/index.jsx | 91 + .../containers/LoadBalancers/index.jsx | 37 + .../listener/Actions/CreateListener.jsx | 97 + .../listener/Actions/CreatePool.jsx | 117 + .../listener/Actions/DeleteListener.jsx | 55 + .../listener/Actions/DeletePool.jsx | 60 + .../LoadBalancers/listener/Actions/Edit.jsx | 76 + .../listener/Actions/EditHealthMonitor.jsx | 197 + .../listener/Actions/EditPoolInfo.jsx | 126 + .../listener/Actions/MemberManagement.jsx | 254 + .../LoadBalancers/listener/Actions/index.jsx | 64 + .../listener/Detail/BaseDetail.jsx | 107 + .../Detail/Member/Actions/CreateMember.jsx | 154 + .../Detail/Member/Actions/DeleteMember.jsx | 57 + .../Detail/Member/Actions/EditMember.jsx | 85 + .../listener/Detail/Member/Actions/index.jsx | 44 + .../listener/Detail/Member/index.jsx | 102 + .../LoadBalancers/listener/Detail/index.jsx | 93 + .../LoadBalancers/listener/index.jsx | 97 + .../containers/Network/AdminNetwork.jsx | 99 + .../containers/Network/Detail/Detail.jsx | 71 + .../containers/Network/Detail/Subnets.jsx | 155 + .../containers/Network/Detail/index.jsx | 159 + .../Detail/subnetActions/DeleteSubnet.jsx | 54 + .../Detail/subnetActions/EditSubnet.jsx | 215 + .../Network/Detail/subnetActions/index.jsx | 32 + .../network/containers/Network/ExtNetwork.jsx | 90 + .../containers/Network/ProjectNetwork.jsx | 87 + .../containers/Network/SharedNetwork.jsx | 90 + .../Network/actions/CreateNetwork.jsx | 564 + .../Network/actions/CreateSubnet.jsx | 312 + .../containers/Network/actions/Delete.jsx | 62 + .../containers/Network/actions/Edit.jsx | 109 + .../containers/Network/actions/index.jsx | 36 + .../containers/Network/actions/networkUtil.js | 232 + .../network/containers/Network/index.jsx | 52 + .../containers/QoSPolicy/AdminQoSPolicy.js | 81 + .../QoSPolicy/Detail/BaseDetail.jsx | 78 + .../containers/QoSPolicy/Detail/index.jsx | 97 + .../containers/QoSPolicy/ProjectQoSPolicy.js | 86 + .../containers/QoSPolicy/SharedQoSPolicy.js | 89 + .../containers/QoSPolicy/actions/Create.jsx | 101 + .../actions/CreateBandwidthLimitRule.jsx | 106 + .../actions/CreateDSCPMarkingRules.jsx | 68 + .../QoSPolicy/actions/DSCPMarkingItems.js | 23 + .../containers/QoSPolicy/actions/Delete.jsx | 54 + .../actions/DeleteBandwidthEgressRules.jsx | 64 + .../actions/DeleteBandwidthIngressRules.jsx | 64 + .../actions/DeleteDSCPMarkingRules.jsx | 62 + .../containers/QoSPolicy/actions/Edit.jsx | 76 + .../actions/EditBandwidthEgressRule.jsx | 101 + .../actions/EditBandwidthIngressRule.jsx | 99 + .../QoSPolicy/actions/EditDSCPMarkingRule.jsx | 78 + .../containers/QoSPolicy/actions/index.jsx | 54 + .../network/containers/QoSPolicy/index.jsx | 46 + .../containers/Router/Detail/BaseDetail.jsx | 97 + .../containers/Router/Detail/index.jsx | 120 + .../Router/Port/Detail/BaseDetail.jsx | 205 + .../containers/Router/Port/Detail/index.jsx | 82 + .../network/containers/Router/Port/index.jsx | 115 + .../containers/Router/Snat/actions/Create.jsx | 147 + .../containers/Router/Snat/actions/Delete.jsx | 44 + .../containers/Router/Snat/actions/index.jsx | 26 + .../network/containers/Router/Snat/index.jsx | 75 + .../Router/StaticRouter/actions/Create.jsx | 68 + .../Router/StaticRouter/actions/Delete.jsx | 51 + .../Router/StaticRouter/actions/index.jsx | 34 + .../containers/Router/StaticRouter/index.jsx | 56 + .../Router/actions/AssociateFip.jsx | 142 + .../Router/actions/CloseGateway.jsx | 55 + .../Router/actions/ConnectSubnet.jsx | 167 + .../containers/Router/actions/Create.jsx | 184 + .../containers/Router/actions/Delete.jsx | 122 + .../Router/actions/DisassociateFip.jsx | 50 + .../Router/actions/DisconnectSubnet.jsx | 152 + .../containers/Router/actions/Edit.jsx | 70 + .../containers/Router/actions/SetGateway.jsx | 102 + .../containers/Router/actions/index.jsx | 63 + src/pages/network/containers/Router/index.jsx | 64 + .../Detail/Rule/actions/Create.jsx | 404 + .../Detail/Rule/actions/Delete.jsx | 75 + .../Detail/Rule/actions/index.jsx | 35 + .../SecurityGroup/Detail/Rule/index.jsx | 57 + .../containers/SecurityGroup/Detail/index.jsx | 74 + .../SecurityGroup/actions/Create.jsx | 60 + .../SecurityGroup/actions/Delete.jsx | 50 + .../containers/SecurityGroup/actions/Edit.jsx | 61 + .../SecurityGroup/actions/index.jsx | 41 + .../containers/SecurityGroup/index.jsx | 97 + .../VPN/EndpointGroup/actions/Create.js | 192 + .../VPN/EndpointGroup/actions/Delete.jsx | 98 + .../VPN/EndpointGroup/actions/Edit.js | 67 + .../VPN/EndpointGroup/actions/index.js | 41 + .../containers/VPN/EndpointGroup/index.jsx | 173 + .../VPN/IKEPolicy/actions/Create.js | 116 + .../VPN/IKEPolicy/actions/Delete.jsx | 85 + .../containers/VPN/IKEPolicy/actions/Edit.jsx | 161 + .../containers/VPN/IKEPolicy/actions/index.js | 41 + .../containers/VPN/IKEPolicy/index.jsx | 159 + .../VPN/IPSecPolicy/actions/Create.js | 125 + .../VPN/IPSecPolicy/actions/Delete.jsx | 85 + .../VPN/IPSecPolicy/actions/Edit.jsx | 171 + .../VPN/IPSecPolicy/actions/index.js | 41 + .../containers/VPN/IPSecPolicy/index.jsx | 170 + .../VPN/VPNGateway/actions/Create.js | 87 + .../VPN/VPNGateway/actions/Delete.jsx | 85 + .../containers/VPN/VPNGateway/actions/Edit.js | 72 + .../VPN/VPNGateway/actions/index.js | 41 + .../containers/VPN/VPNGateway/index.jsx | 123 + .../VPN/VPNTunnel/Detail/BaseDetail.jsx | 184 + .../containers/VPN/VPNTunnel/Detail/index.jsx | 105 + .../VPN/VPNTunnel/actions/Create.jsx | 315 + .../VPN/VPNTunnel/actions/Delete.jsx | 62 + .../containers/VPN/VPNTunnel/actions/Edit.js | 70 + .../actions/components/LocalSubnet.jsx | 102 + .../containers/VPN/VPNTunnel/actions/index.js | 41 + .../containers/VPN/VPNTunnel/index.jsx | 122 + src/pages/network/containers/VPN/index.jsx | 68 + .../actions/CreateAllowedAddressPair.jsx | 153 + .../AllowedAddressPair/actions/Delete.jsx | 73 + .../AllowedAddressPair/actions/index.jsx | 39 + .../Detail/AllowedAddressPair/index.jsx | 95 + .../Detail/BaseDetail/index.jsx | 79 + .../Detail/FixedIPs/actions/ReleaseIP.jsx | 74 + .../Detail/FixedIPs/actions/index.jsx | 37 + .../VirtualAdapter/Detail/FixedIPs/index.jsx | 86 + .../Detail/SecurityGroups/actions/Detach.jsx | 50 + .../Detail/SecurityGroups/actions/index.jsx | 30 + .../Detail/SecurityGroups/index.jsx | 159 + .../Detail/SecurityGroups/index.less | 40 + .../VirtualAdapter/Detail/index.jsx | 121 + .../VirtualAdapter/Detail/index.less | 14 + .../VirtualAdapter/actions/AllocateIP.jsx | 113 + .../VirtualAdapter/actions/AssociateFIP.jsx | 177 + .../VirtualAdapter/actions/Attach.jsx | 94 + .../VirtualAdapter/actions/Create.jsx | 364 + .../VirtualAdapter/actions/Delete.jsx | 56 + .../VirtualAdapter/actions/Detach.jsx | 90 + .../actions/DisAssociateFIP.jsx | 100 + .../VirtualAdapter/actions/Edit.jsx | 114 + .../actions/ManageSecurityGroup.jsx | 124 + .../VirtualAdapter/actions/ModifyQoS.jsx | 145 + .../VirtualAdapter/actions/index.jsx | 98 + .../containers/VirtualAdapter/index.jsx | 252 + .../containers/topology/InstanceCard.jsx | 176 + .../network/containers/topology/NodeCard.jsx | 222 + .../network/containers/topology/index.jsx | 811 + .../network/containers/topology/index.less | 46 + src/pages/network/routes/index.js | 195 + src/pages/storage/App.jsx | 21 + .../containers/Backup/Detail/BaseDetail.jsx | 52 + .../containers/Backup/Detail/index.jsx | 95 + .../containers/Backup/actions/Create.jsx | 104 + .../Backup/actions/CreateVolume.jsx | 129 + .../containers/Backup/actions/Delete.jsx | 51 + .../containers/Backup/actions/Edit.jsx | 54 + .../containers/Backup/actions/Restore.jsx | 165 + .../containers/Backup/actions/index.jsx | 49 + src/pages/storage/containers/Backup/index.jsx | 165 + .../containers/Snapshot/Detail/BaseDetail.jsx | 54 + .../containers/Snapshot/Detail/index.jsx | 86 + .../Snapshot/actions/CreateVolume.jsx | 124 + .../containers/Snapshot/actions/Delete.jsx | 64 + .../containers/Snapshot/actions/Edit.jsx | 60 + .../containers/Snapshot/actions/Restore.jsx | 41 + .../containers/Snapshot/actions/index.jsx | 42 + .../storage/containers/Snapshot/index.jsx | 156 + .../storage/containers/Storage/index.jsx | 49 + .../containers/Volume/Detail/BaseDetail.jsx | 110 + .../containers/Volume/Detail/index.jsx | 115 + .../Volume/actions/AcceptVolumeTransfer.jsx | 64 + .../containers/Volume/actions/Attach.jsx | 121 + .../Volume/actions/CancelTransfer.jsx | 51 + .../containers/Volume/actions/ChangeType.jsx | 101 + .../containers/Volume/actions/CloneVolume.jsx | 78 + .../Volume/actions/Create/index.jsx | 528 + .../Volume/actions/Create/index.less | 4 + .../Volume/actions/CreateBackup.jsx | 88 + .../containers/Volume/actions/CreateImage.jsx | 86 + .../Volume/actions/CreateInstance.jsx | 35 + .../Volume/actions/CreateSnapshot.jsx | 77 + .../Volume/actions/CreateTransfer.jsx | 87 + .../containers/Volume/actions/Delete.jsx | 53 + .../containers/Volume/actions/Detach.jsx | 153 + .../containers/Volume/actions/Edit.jsx | 65 + .../Volume/actions/ExtendVolume.jsx | 79 + .../containers/Volume/actions/Migrate.jsx | 106 + .../Volume/actions/UpdateStatus.jsx | 79 + .../containers/Volume/actions/index.jsx | 159 + src/pages/storage/containers/Volume/index.jsx | 221 + .../Detail/ExtraSpec/actions/Create.jsx | 118 + .../Detail/ExtraSpec/actions/Delete.jsx | 50 + .../QosSpec/Detail/ExtraSpec/actions/Edit.jsx | 73 + .../Detail/ExtraSpec/actions/index.jsx | 32 + .../QosSpec/Detail/ExtraSpec/index.jsx | 58 + .../VolumeType/QosSpec/Detail/index.jsx | 73 + .../VolumeType/QosSpec/actions/Create.jsx | 64 + .../VolumeType/QosSpec/actions/Delete.jsx | 44 + .../QosSpec/actions/EditConsumer.jsx | 67 + .../VolumeType/QosSpec/actions/index.jsx | 32 + .../containers/VolumeType/QosSpec/index.jsx | 98 + .../VolumeType/Detail/BaseDetail.jsx | 61 + .../Detail/ExtraSpec/actions/Create.jsx | 71 + .../Detail/ExtraSpec/actions/Delete.jsx | 50 + .../Detail/ExtraSpec/actions/Edit.jsx | 77 + .../Detail/ExtraSpec/actions/index.jsx | 32 + .../VolumeType/Detail/ExtraSpec/index.jsx | 58 + .../VolumeType/VolumeType/Detail/index.jsx | 88 + .../VolumeType/VolumeType/actions/Create.jsx | 179 + .../VolumeType/actions/CreateEncryption.jsx | 100 + .../VolumeType/VolumeType/actions/Delete.jsx | 42 + .../VolumeType/actions/DeleteEncryption.jsx | 48 + .../VolumeType/VolumeType/actions/Edit.jsx | 64 + .../VolumeType/actions/ManageAccess.jsx | 139 + .../VolumeType/actions/ManageQos.jsx | 128 + .../VolumeType/VolumeType/actions/index.jsx | 48 + .../VolumeType/VolumeType/index.jsx | 122 + .../storage/containers/VolumeType/index.jsx | 38 + src/pages/storage/routes/index.js | 87 + src/pages/user/App.jsx | 21 + .../user/containers/ChangePassword/index.jsx | 217 + .../user/containers/ChangePassword/index.less | 65 + src/pages/user/containers/Login/index.jsx | 288 + src/pages/user/containers/Login/index.less | 27 + src/pages/user/routes/index.js | 33 + src/resources/backup.jsx | 143 + src/resources/cinder-pool.jsx | 49 + src/resources/flavor.js | 282 + src/resources/floatingip.js | 284 + src/resources/hypervisor.jsx | 78 + src/resources/image.jsx | 216 + src/resources/instance.jsx | 442 + src/resources/ironic.js | 90 + src/resources/network.js | 97 + src/resources/neutron.js | 23 + src/resources/openstack-rc.js | 72 + src/resources/policy.js | 109 + src/resources/pool.js | 47 + src/resources/port.jsx | 178 + src/resources/project.js | 53 + src/resources/qos-policy.jsx | 176 + src/resources/role.js | 23 + src/resources/router.jsx | 187 + src/resources/security-group-rule.js | 158 + src/resources/security-group.jsx | 44 + src/resources/server-group.js | 22 + src/resources/service.js | 37 + src/resources/stack.js | 204 + src/resources/topology-color.js | 29 + src/resources/volume-type.js | 68 + src/resources/volume.jsx | 213 + src/resources/vpn.js | 76 + src/stores/base-list.js | 73 + src/stores/base.js | 636 + src/stores/cinder/backup.js | 74 + src/stores/cinder/extra-spec.js | 96 + src/stores/cinder/pool.js | 55 + src/stores/cinder/qos-spec-key.js | 97 + src/stores/cinder/qos-spec.js | 85 + src/stores/cinder/service.js | 53 + src/stores/cinder/snapshot.js | 95 + src/stores/cinder/volume-type.js | 181 + src/stores/cinder/volume.js | 227 + src/stores/glance/image.js | 161 + src/stores/glance/instance-snapshot.js | 162 + src/stores/glance/metadata.js | 160 + src/stores/heat/event.js | 43 + src/stores/heat/resource.js | 43 + src/stores/heat/service.js | 36 + src/stores/heat/stack.js | 106 + src/stores/ironic/ironic.js | 165 + src/stores/ironic/port-group.js | 51 + src/stores/ironic/port.js | 51 + src/stores/keystone/catalog.js | 40 + src/stores/keystone/domain.js | 164 + src/stores/keystone/project.js | 543 + src/stores/keystone/role.js | 69 + src/stores/keystone/tag.js | 54 + src/stores/keystone/user-group.js | 473 + src/stores/keystone/user.js | 574 + src/stores/neutron/agent-network.js | 59 + src/stores/neutron/agent-router.js | 75 + src/stores/neutron/agent.js | 37 + src/stores/neutron/fixed-ip.js | 64 + src/stores/neutron/floatingIp.js | 172 + src/stores/neutron/network.js | 393 + src/stores/neutron/neutron.js | 37 + src/stores/neutron/port-forwarding.js | 169 + src/stores/neutron/port.js | 110 + src/stores/neutron/qos-policy.js | 131 + src/stores/neutron/router.js | 278 + src/stores/neutron/security-group.js | 66 + src/stores/neutron/security-rule.js | 38 + src/stores/neutron/static-route.js | 87 + src/stores/neutron/subnet.js | 63 + src/stores/neutron/virtual-adapter.js | 235 + src/stores/neutron/vpn-endpoint-group.js | 51 + src/stores/neutron/vpn-ike-policy.js | 55 + src/stores/neutron/vpn-ipsec-connection.js | 92 + src/stores/neutron/vpn-ipsec-policy.js | 55 + src/stores/neutron/vpn-service.js | 51 + src/stores/nova/aggregate.js | 70 + src/stores/nova/compute-host.js | 62 + src/stores/nova/flavor.js | 227 + src/stores/nova/hypervisor.js | 157 + src/stores/nova/instance-volume.js | 101 + src/stores/nova/instance.js | 469 + src/stores/nova/keypair.js | 50 + src/stores/nova/server-group.js | 69 + src/stores/nova/zone.js | 73 + src/stores/octavia/health-monitor.js | 42 + src/stores/octavia/listener.js | 78 + src/stores/octavia/loadbalancer.js | 177 + src/stores/octavia/pool-member.js | 91 + src/stores/octavia/pool.js | 42 + src/stores/overview-admin.js | 189 + src/stores/project.js | 63 + src/stores/root.js | 322 + src/stores/skyline/recycle-server.js | 47 + src/stores/skyline/server-group-instance.js | 71 + src/stores/skyline/setting.js | 45 + src/stores/skyline/skyline.js | 50 + src/styles/base.less | 189 + src/styles/main.less | 3 + src/styles/reset.less | 351 + src/styles/variables.less | 124 + src/utils/RouterConfig.jsx | 55 + src/utils/constants.js | 260 + src/utils/cookie.js | 25 + src/utils/file.js | 31 + src/utils/file.spec.js | 34 + src/utils/index.js | 273 + src/utils/index.test.js | 289 + src/utils/local-storage.js | 46 + src/utils/local-storage.spec.js | 44 + src/utils/request.js | 366 + src/utils/table.jsx | 108 + src/utils/time.js | 96 + src/utils/time.spec.js | 77 + src/utils/translate.js | 260 + src/utils/translate.spec.js | 253 + src/utils/validate.js | 595 + src/utils/yaml.js | 27 + src/utils/yaml.spec.js | 35 + test/e2e/config/config.yaml | 46 + test/e2e/fixtures/example.json | 5 + test/e2e/fixtures/keypair | 1 + test/e2e/fixtures/metadata.json | 5 + test/e2e/fixtures/profile.json | 5 + test/e2e/fixtures/stack-content.yaml | 24 + test/e2e/fixtures/stack-params.yaml | 5 + .../pages/compute/aggregate.spec.js | 82 + .../pages/compute/baremetal.spec.js | 200 + .../integration/pages/compute/flavor.spec.js | 85 + .../pages/compute/hypervisor.spec.js | 49 + .../integration/pages/compute/image.spec.js | 138 + .../pages/compute/instance.spec.js | 303 + .../integration/pages/compute/ironic.spec.js | 183 + .../integration/pages/compute/keypair.spec.js | 56 + .../pages/compute/server-group.spec.js | 90 + .../pages/configuration/metadata.spec.js | 56 + .../pages/configuration/system.spec.js | 162 + test/e2e/integration/pages/error.spec.js | 35 + test/e2e/integration/pages/heat/stack.spec.js | 122 + .../integration/pages/identity/domain.spec.js | 29 + .../pages/identity/project.spec.js | 99 + .../integration/pages/identity/role.spec.js | 32 + .../pages/identity/user-group.spec.js | 73 + .../integration/pages/identity/user.spec.js | 131 + test/e2e/integration/pages/login.spec.js | 53 + .../pages/management/recycle-bin.spec.js | 65 + .../pages/network/floatingip.spec.js | 108 + test/e2e/integration/pages/network/lb.spec.js | 231 + .../integration/pages/network/network.spec.js | 90 + .../pages/network/qos-policy.spec.js | 119 + .../integration/pages/network/router.spec.js | 106 + .../pages/network/security-group.spec.js | 63 + .../pages/network/topology.spec.js | 42 + .../pages/network/virtual-adapter.spec.js | 184 + .../e2e/integration/pages/network/vpn.spec.js | 188 + .../integration/pages/storage/backup.spec.js | 125 + .../e2e/integration/pages/storage/qos.spec.js | 76 + .../pages/storage/snapshot.spec.js | 80 + .../integration/pages/storage/storage.spec.js | 27 + .../pages/storage/volume-type.spec.js | 136 + .../integration/pages/storage/volume.spec.js | 193 + test/e2e/plugins/index.js | 45 + test/e2e/support/commands.js | 177 + test/e2e/support/common.js | 24 + test/e2e/support/constants.js | 87 + test/e2e/support/detail-commands.js | 36 + test/e2e/support/form-commands.js | 369 + test/e2e/support/index.js | 52 + test/e2e/support/resource-commands.js | 259 + test/e2e/support/table-commands.js | 425 + test/e2e/utils/index.js | 60 + test/unit/local-storage-mock.js | 46 + test/unit/locales/en-US.js | 25 + test/unit/locales/zh-CN.js | 12 + test/unit/setup-tests.js | 23 + test/unit/svg-mock.js | 15 + tools/git_config/commit_message.txt | 20 + yarn.lock | 14734 ++++++++++++++++ 1022 files changed, 125638 insertions(+) create mode 100644 .babelrc create mode 100644 .dockerignore create mode 100644 .eslintignore create mode 100644 .eslintrc create mode 100644 .gitignore create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 Gruntfile.js create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 README.md create mode 100644 config/theme.js create mode 100644 config/webpack.common.js create mode 100644 config/webpack.dev.js create mode 100644 config/webpack.e2e.js create mode 100644 config/webpack.prod.js create mode 100644 cypress.json create mode 100644 jest.config.js create mode 100644 jsconfig.json create mode 100644 package.json create mode 100644 poetry.lock create mode 100644 pyproject.toml create mode 100644 skyline_console/__init__.py create mode 100644 skyline_console/__main__.py create mode 100644 src/api/cinder/backup.js create mode 100644 src/api/cinder/base.js create mode 100644 src/api/cinder/os-availability-zone.js create mode 100644 src/api/cinder/os-quota-sets.js create mode 100644 src/api/cinder/os-services.js create mode 100644 src/api/cinder/qos-specs.js create mode 100644 src/api/cinder/snapshots.js create mode 100644 src/api/cinder/types.js create mode 100644 src/api/cinder/volume-transfers.js create mode 100644 src/api/cinder/volume.js create mode 100644 src/api/glance/base.js create mode 100644 src/api/glance/images.js create mode 100644 src/api/glance/metadefs.js create mode 100644 src/api/gocron/base.js create mode 100644 src/api/heat/base.js create mode 100644 src/api/heat/stacks.js create mode 100644 src/api/ironic-inspector/base.js create mode 100644 src/api/ironic/base.js create mode 100644 src/api/ironic/nodes.js create mode 100644 src/api/ironic/port-groups.js create mode 100644 src/api/ironic/ports.js create mode 100644 src/api/keystone/base.js create mode 100644 src/api/keystone/domain.js create mode 100644 src/api/keystone/group.js create mode 100644 src/api/keystone/project.js create mode 100644 src/api/keystone/role-assignment.js create mode 100644 src/api/keystone/role.js create mode 100644 src/api/keystone/system.js create mode 100644 src/api/keystone/user.js create mode 100644 src/api/neutron/agent.js create mode 100644 src/api/neutron/availability-zones.js create mode 100644 src/api/neutron/base.js create mode 100644 src/api/neutron/extensions.js create mode 100644 src/api/neutron/floating-ips.js create mode 100644 src/api/neutron/networks.js create mode 100644 src/api/neutron/ports.js create mode 100644 src/api/neutron/qos-policies.js create mode 100644 src/api/neutron/quotas.js create mode 100644 src/api/neutron/routers.js create mode 100644 src/api/neutron/security-groups.js create mode 100644 src/api/neutron/subnets.js create mode 100644 src/api/neutron/vpn.js create mode 100644 src/api/nova/base.js create mode 100644 src/api/nova/flavor.js create mode 100644 src/api/nova/os-aggregates.js create mode 100644 src/api/nova/os-hypervisors.js create mode 100644 src/api/nova/os-quota-sets.js create mode 100644 src/api/nova/os-service.js create mode 100644 src/api/nova/server.js create mode 100644 src/api/octavia/base.js create mode 100644 src/api/octavia/lbaas.js create mode 100644 src/api/octavia/pools.js create mode 100644 src/api/panko/base.js create mode 100644 src/api/panko/event.js create mode 100644 src/api/placement/base.js create mode 100644 src/api/placement/resource-providers.js create mode 100644 src/api/placement/traits.js create mode 100644 src/api/skyline/base.js create mode 100644 src/api/skyline/contrib.js create mode 100644 src/api/skyline/extension.js create mode 100644 src/api/skyline/login.js create mode 100644 src/api/skyline/policy.js create mode 100644 src/api/skyline/setting.js create mode 100644 src/api/storage/storage-classes.js create mode 100644 src/api/swift/base.js create mode 100644 src/asset/image/ArchLinux.svg create mode 100644 src/asset/image/TmpFileImage.png create mode 100644 src/asset/image/adminImage.svg create mode 100644 src/asset/image/adminInstance.svg create mode 100644 src/asset/image/adminNetwork.svg create mode 100644 src/asset/image/adminRouter.svg create mode 100644 src/asset/image/adminSecurityGroup.svg create mode 100644 src/asset/image/adminVolume.svg create mode 100644 src/asset/image/animnbus.png create mode 100644 src/asset/image/arch.svg create mode 100644 src/asset/image/centos.svg create mode 100644 src/asset/image/cloud.png create mode 100644 src/asset/image/coreos.svg create mode 100644 src/asset/image/critical-alert.svg create mode 100644 src/asset/image/debian.svg create mode 100644 src/asset/image/empty-card.svg create mode 100644 src/asset/image/favicon.ico create mode 100644 src/asset/image/fedora.svg create mode 100644 src/asset/image/freebsd.svg create mode 100644 src/asset/image/image.svg create mode 100644 src/asset/image/instance.png create mode 100644 src/asset/image/instance.svg create mode 100644 src/asset/image/interface.png create mode 100644 src/asset/image/interface.svg create mode 100644 src/asset/image/loadBalancer.png create mode 100644 src/asset/image/lock.svg create mode 100644 src/asset/image/login.png create mode 100644 src/asset/image/loginFull.png create mode 100644 src/asset/image/loginRightLogo.png create mode 100644 src/asset/image/logo-extend.svg create mode 100644 src/asset/image/logo-small.svg create mode 100644 src/asset/image/logo.png create mode 100644 src/asset/image/major-alert.svg create mode 100644 src/asset/image/minor-alert.svg create mode 100644 src/asset/image/others.svg create mode 100755 src/asset/image/overview-instance.svg create mode 100755 src/asset/image/overview-network.svg create mode 100755 src/asset/image/overview-router.svg create mode 100755 src/asset/image/overview-volume.svg create mode 100644 src/asset/image/router.png create mode 100644 src/asset/image/security-group.svg create mode 100644 src/asset/image/ubuntu.svg create mode 100644 src/asset/image/unlock.svg create mode 100755 src/asset/image/volume-container.svg create mode 100644 src/asset/image/volume.svg create mode 100644 src/asset/image/windows.svg create mode 100644 src/asset/template/index.html create mode 100644 src/components/Cards/EmptyTable/index.jsx create mode 100644 src/components/Cards/EmptyTable/index.less create mode 100644 src/components/Cards/NotFound/index.jsx create mode 100644 src/components/Cards/NotFound/index.less create mode 100644 src/components/CodeEditor/AceEditor.jsx create mode 100644 src/components/CodeEditor/custom.less create mode 100644 src/components/CodeEditor/index.jsx create mode 100644 src/components/CodeEditor/index.less create mode 100644 src/components/Confirm/index.jsx create mode 100644 src/components/Confirm/index.less create mode 100644 src/components/DetailCard/index.jsx create mode 100644 src/components/DetailCard/index.less create mode 100644 src/components/Empty/index.jsx create mode 100644 src/components/Empty/index.less create mode 100644 src/components/Form/index.jsx create mode 100644 src/components/Form/index.less create mode 100644 src/components/FormItem/AddSelect/index.jsx create mode 100644 src/components/FormItem/AddSelect/index.less create mode 100644 src/components/FormItem/Checkbox/index.jsx create mode 100644 src/components/FormItem/CheckboxGroup/index.jsx create mode 100644 src/components/FormItem/Descriptions/index.jsx create mode 100644 src/components/FormItem/Descriptions/index.less create mode 100644 src/components/FormItem/IPDistributer/IPAddress.jsx create mode 100644 src/components/FormItem/IPDistributer/Item.jsx create mode 100644 src/components/FormItem/IPDistributer/index.jsx create mode 100644 src/components/FormItem/InputInt/index.jsx create mode 100644 src/components/FormItem/InstanceVolume/index.jsx create mode 100644 src/components/FormItem/InstanceVolume/index.less create mode 100644 src/components/FormItem/IpInput/index.jsx create mode 100644 src/components/FormItem/IpInput/index.less create mode 100644 src/components/FormItem/IpInputSimple/index.jsx create mode 100644 src/components/FormItem/IpInputSimple/index.less create mode 100644 src/components/FormItem/JsonInput/index.jsx create mode 100644 src/components/FormItem/KeyValueInput/index.jsx create mode 100644 src/components/FormItem/Label/index.jsx create mode 100644 src/components/FormItem/Label/index.less create mode 100644 src/components/FormItem/MacAddressInput/index.jsx create mode 100644 src/components/FormItem/MemberAllocator/IPAddress.jsx create mode 100644 src/components/FormItem/MemberAllocator/Item.jsx create mode 100644 src/components/FormItem/MemberAllocator/index.jsx create mode 100644 src/components/FormItem/MetadataTransfer/EnumSelect.jsx create mode 100644 src/components/FormItem/MetadataTransfer/index.jsx create mode 100644 src/components/FormItem/More/index.jsx create mode 100644 src/components/FormItem/More/index.less create mode 100644 src/components/FormItem/NUMAInput/index.jsx create mode 100644 src/components/FormItem/NUMAInput/index.less create mode 100644 src/components/FormItem/NameInput/index.jsx create mode 100644 src/components/FormItem/NetworkSelect/index.jsx create mode 100644 src/components/FormItem/NetworkSelect/index.less create mode 100644 src/components/FormItem/NetworkSelectTable/index.jsx create mode 100644 src/components/FormItem/PortRange/index.jsx create mode 100644 src/components/FormItem/Radio/index.jsx create mode 100644 src/components/FormItem/Radio/index.less create mode 100644 src/components/FormItem/Select/index.jsx create mode 100644 src/components/FormItem/Select/index.less create mode 100644 src/components/FormItem/SelectTable/index.jsx create mode 100644 src/components/FormItem/SelectTable/index.less create mode 100644 src/components/FormItem/SliderInput/index.jsx create mode 100644 src/components/FormItem/Switch/index.jsx create mode 100644 src/components/FormItem/TabSelectTable/index.jsx create mode 100644 src/components/FormItem/TextareaFromFile/index.jsx create mode 100644 src/components/FormItem/Title/index.jsx create mode 100644 src/components/FormItem/Title/index.less create mode 100644 src/components/FormItem/Transfer/index.jsx create mode 100644 src/components/FormItem/Upload/index.jsx create mode 100644 src/components/FormItem/VolumeSelectTable/index.jsx create mode 100644 src/components/FormItem/index.jsx create mode 100644 src/components/FormItem/index.less create mode 100644 src/components/ImageType/index.jsx create mode 100644 src/components/ImageType/index.less create mode 100644 src/components/Infos/index.jsx create mode 100644 src/components/Infos/index.less create mode 100644 src/components/Layout/GlobalHeader/AvatarDropdown.jsx create mode 100644 src/components/Layout/GlobalHeader/OpenRc.jsx create mode 100644 src/components/Layout/GlobalHeader/Password.jsx create mode 100644 src/components/Layout/GlobalHeader/ProjectDropdown.jsx create mode 100644 src/components/Layout/GlobalHeader/ProjectTable.jsx create mode 100644 src/components/Layout/GlobalHeader/RightContent.jsx create mode 100644 src/components/Layout/GlobalHeader/Token.jsx create mode 100644 src/components/Layout/GlobalHeader/index.jsx create mode 100644 src/components/Layout/GlobalHeader/index.less create mode 100644 src/components/Layout/GlobalNav/index.jsx create mode 100644 src/components/Layout/GlobalNav/index.less create mode 100644 src/components/Layout/GlobalNav/item.jsx create mode 100644 src/components/Layout/HeaderDropdown/index.jsx create mode 100644 src/components/Layout/HeaderDropdown/index.less create mode 100644 src/components/Layout/Nav/index.jsx create mode 100644 src/components/Layout/Nav/index.less create mode 100644 src/components/Layout/Nav/item.jsx create mode 100644 src/components/Layout/Selector/index.jsx create mode 100644 src/components/Layout/Selector/index.less create mode 100644 src/components/Layout/index.js create mode 100644 src/components/Loading/index.jsx create mode 100644 src/components/MagicInput/index.jsx create mode 100644 src/components/MagicInput/index.less create mode 100644 src/components/ModalButton/index.jsx create mode 100644 src/components/NotFound/index.jsx create mode 100644 src/components/NotFound/index.less create mode 100644 src/components/Notify/index.jsx create mode 100644 src/components/Notify/index.less create mode 100644 src/components/PageLoading/index.jsx create mode 100644 src/components/Pagination/index.jsx create mode 100644 src/components/Pagination/index.less create mode 100644 src/components/Progress/index.jsx create mode 100644 src/components/ProjectProgress/index.jsx create mode 100644 src/components/SelectLang/index.jsx create mode 100644 src/components/SelectLang/index.less create mode 100644 src/components/SimpleForm/index.jsx create mode 100644 src/components/Status/index.jsx create mode 100644 src/components/StepForm/index.jsx create mode 100644 src/components/StepForm/index.less create mode 100644 src/components/TableButton/RuleButton.jsx create mode 100644 src/components/TableButton/index.jsx create mode 100644 src/components/Tables/Base/Action/index.jsx create mode 100644 src/components/Tables/Base/ActionButton/index.jsx create mode 100644 src/components/Tables/Base/ActionButton/index.less create mode 100644 src/components/Tables/Base/BatchActionButtons/index.jsx create mode 100644 src/components/Tables/Base/BatchActionButtons/index.less create mode 100644 src/components/Tables/Base/CustomColumns/index.jsx create mode 100644 src/components/Tables/Base/CustomColumns/index.less create mode 100644 src/components/Tables/Base/Download/index.jsx create mode 100644 src/components/Tables/Base/Download/index.less create mode 100644 src/components/Tables/Base/ItemActionButtons/index.jsx create mode 100644 src/components/Tables/Base/ItemActionButtons/index.less create mode 100644 src/components/Tables/Base/PrimaryActionButtons/index.jsx create mode 100644 src/components/Tables/Base/index.jsx create mode 100644 src/components/Tables/Base/index.less create mode 100644 src/components/Tables/SimpleTable/index.jsx create mode 100644 src/components/Tables/SimpleTable/index.less create mode 100644 src/components/TimeFilter/index.jsx create mode 100644 src/components/TimeFilter/index.less create mode 100644 src/components/VisibleObserver/index.jsx create mode 100644 src/containers/Action/ConfirmAction/index.jsx create mode 100644 src/containers/Action/FormAction/index.jsx create mode 100644 src/containers/Action/ModalAction/index.jsx create mode 100644 src/containers/Action/StepAction/index.jsx create mode 100644 src/containers/Action/index.jsx create mode 100644 src/containers/BaseDetail/index.jsx create mode 100644 src/containers/BaseDetail/index.less create mode 100644 src/containers/List/index.jsx create mode 100644 src/containers/List/index.less create mode 100644 src/containers/TabDetail/index.jsx create mode 100644 src/containers/TabDetail/index.less create mode 100644 src/containers/TabList/index.jsx create mode 100644 src/containers/TabList/index.less create mode 100644 src/core/App.jsx create mode 100644 src/core/i18n.js create mode 100644 src/core/index.jsx create mode 100644 src/core/routes.js create mode 100644 src/layouts/Base/Menu.jsx create mode 100644 src/layouts/Base/Right.jsx create mode 100644 src/layouts/Base/index.jsx create mode 100644 src/layouts/Base/index.less create mode 100644 src/layouts/Blank/index.jsx create mode 100644 src/layouts/Blank/index.less create mode 100644 src/layouts/User/index.jsx create mode 100644 src/layouts/User/index.less create mode 100644 src/layouts/admin-menu.jsx create mode 100644 src/layouts/menu.jsx create mode 100644 src/libs/axios.js create mode 100644 src/libs/base-url.js create mode 100644 src/locales/en.json create mode 100644 src/locales/index.js create mode 100644 src/locales/zh.json create mode 100644 src/pages/Management/App.jsx create mode 100644 src/pages/Management/containers/RecycleBin/actions/Delete.jsx create mode 100644 src/pages/Management/containers/RecycleBin/actions/Recover.js create mode 100644 src/pages/Management/containers/RecycleBin/actions/index.jsx create mode 100644 src/pages/Management/containers/RecycleBin/index.jsx create mode 100644 src/pages/Management/routes/index.js create mode 100644 src/pages/base/App.jsx create mode 100644 src/pages/base/containers/404/index.jsx create mode 100644 src/pages/base/containers/AdminOverview/components/ComputeService.jsx create mode 100644 src/pages/base/containers/AdminOverview/components/NetworkService.jsx create mode 100644 src/pages/base/containers/AdminOverview/components/PlatformInfo.jsx create mode 100644 src/pages/base/containers/AdminOverview/components/ResourceOverview.jsx create mode 100644 src/pages/base/containers/AdminOverview/components/VirtualResource.jsx create mode 100644 src/pages/base/containers/AdminOverview/index.jsx create mode 100644 src/pages/base/containers/AdminOverview/style.less create mode 100644 src/pages/base/containers/Overview/components/ProjectInfo.jsx create mode 100644 src/pages/base/containers/Overview/components/QuotaOverview.jsx create mode 100644 src/pages/base/containers/Overview/components/ResourceStatistic.jsx create mode 100644 src/pages/base/containers/Overview/index.jsx create mode 100644 src/pages/base/containers/Overview/style.less create mode 100644 src/pages/base/routes/index.js create mode 100644 src/pages/compute/App.jsx create mode 100644 src/pages/compute/containers/BareMetalNode/Detail/BaseDetail.jsx create mode 100644 src/pages/compute/containers/BareMetalNode/Detail/Port/actions/Create.jsx create mode 100644 src/pages/compute/containers/BareMetalNode/Detail/Port/actions/Delete.jsx create mode 100644 src/pages/compute/containers/BareMetalNode/Detail/Port/actions/Edit.jsx create mode 100644 src/pages/compute/containers/BareMetalNode/Detail/Port/actions/index.jsx create mode 100644 src/pages/compute/containers/BareMetalNode/Detail/Port/index.jsx create mode 100644 src/pages/compute/containers/BareMetalNode/Detail/PortGroup/actions/Create.jsx create mode 100644 src/pages/compute/containers/BareMetalNode/Detail/PortGroup/actions/Delete.jsx create mode 100644 src/pages/compute/containers/BareMetalNode/Detail/PortGroup/actions/Edit.jsx create mode 100644 src/pages/compute/containers/BareMetalNode/Detail/PortGroup/actions/index.jsx create mode 100644 src/pages/compute/containers/BareMetalNode/Detail/PortGroup/index.jsx create mode 100644 src/pages/compute/containers/BareMetalNode/Detail/index.jsx create mode 100644 src/pages/compute/containers/BareMetalNode/actions/ClearMaintenance.jsx create mode 100644 src/pages/compute/containers/BareMetalNode/actions/Create/DriveInfo.jsx create mode 100644 src/pages/compute/containers/BareMetalNode/actions/Create/DriveInterface.jsx create mode 100644 src/pages/compute/containers/BareMetalNode/actions/Create/NodeInfo.jsx create mode 100644 src/pages/compute/containers/BareMetalNode/actions/Create/index.jsx create mode 100644 src/pages/compute/containers/BareMetalNode/actions/Delete.jsx create mode 100644 src/pages/compute/containers/BareMetalNode/actions/Edit.jsx create mode 100644 src/pages/compute/containers/BareMetalNode/actions/Inspect.jsx create mode 100644 src/pages/compute/containers/BareMetalNode/actions/ManageState.jsx create mode 100644 src/pages/compute/containers/BareMetalNode/actions/PowerOff.jsx create mode 100644 src/pages/compute/containers/BareMetalNode/actions/PowerOn.jsx create mode 100644 src/pages/compute/containers/BareMetalNode/actions/SetBootDevice.jsx create mode 100644 src/pages/compute/containers/BareMetalNode/actions/SetMaintenance.jsx create mode 100644 src/pages/compute/containers/BareMetalNode/actions/index.jsx create mode 100644 src/pages/compute/containers/BareMetalNode/index.jsx create mode 100644 src/pages/compute/containers/Flavor/Arm/actions/Create.jsx create mode 100644 src/pages/compute/containers/Flavor/Arm/actions/index.jsx create mode 100644 src/pages/compute/containers/Flavor/Arm/index.jsx create mode 100644 src/pages/compute/containers/Flavor/BareMetal/actions/Create.jsx create mode 100644 src/pages/compute/containers/Flavor/BareMetal/actions/index.jsx create mode 100644 src/pages/compute/containers/Flavor/BareMetal/index.jsx create mode 100644 src/pages/compute/containers/Flavor/Detail/BaseDetail.jsx create mode 100644 src/pages/compute/containers/Flavor/Detail/index.jsx create mode 100644 src/pages/compute/containers/Flavor/Heterogeneous/actions/Create.jsx create mode 100644 src/pages/compute/containers/Flavor/Heterogeneous/actions/index.jsx create mode 100644 src/pages/compute/containers/Flavor/Heterogeneous/index.jsx create mode 100644 src/pages/compute/containers/Flavor/Other/actions/index.jsx create mode 100644 src/pages/compute/containers/Flavor/Other/index.jsx create mode 100644 src/pages/compute/containers/Flavor/X86/actions/Create.jsx create mode 100644 src/pages/compute/containers/Flavor/X86/actions/index.jsx create mode 100644 src/pages/compute/containers/Flavor/X86/index.jsx create mode 100644 src/pages/compute/containers/Flavor/actions/Delete.jsx create mode 100644 src/pages/compute/containers/Flavor/actions/Edit.jsx create mode 100644 src/pages/compute/containers/Flavor/actions/ManageAccess.jsx create mode 100644 src/pages/compute/containers/Flavor/actions/ManageMetadata.jsx create mode 100644 src/pages/compute/containers/Flavor/actions/StepCreate/AccessTypeSetting.jsx create mode 100644 src/pages/compute/containers/Flavor/actions/StepCreate/ParamSetting.jsx create mode 100644 src/pages/compute/containers/Flavor/actions/StepCreate/index.jsx create mode 100644 src/pages/compute/containers/Flavor/actions/index.jsx create mode 100644 src/pages/compute/containers/Flavor/index.jsx create mode 100644 src/pages/compute/containers/HostAggregate/Aggregate/actions/Create.jsx create mode 100644 src/pages/compute/containers/HostAggregate/Aggregate/actions/Delete.jsx create mode 100644 src/pages/compute/containers/HostAggregate/Aggregate/actions/Edit.jsx create mode 100644 src/pages/compute/containers/HostAggregate/Aggregate/actions/ManageHost.jsx create mode 100644 src/pages/compute/containers/HostAggregate/Aggregate/actions/ManageMetadata.jsx create mode 100644 src/pages/compute/containers/HostAggregate/Aggregate/actions/index.jsx create mode 100644 src/pages/compute/containers/HostAggregate/Aggregate/index.jsx create mode 100644 src/pages/compute/containers/HostAggregate/AvailabilityZone/index.jsx create mode 100644 src/pages/compute/containers/HostAggregate/index.jsx create mode 100644 src/pages/compute/containers/Hypervisors/ComputeHost/actions/Disable.jsx create mode 100644 src/pages/compute/containers/Hypervisors/ComputeHost/actions/Enable.jsx create mode 100644 src/pages/compute/containers/Hypervisors/ComputeHost/actions/index.jsx create mode 100644 src/pages/compute/containers/Hypervisors/ComputeHost/index.jsx create mode 100644 src/pages/compute/containers/Hypervisors/Hypervisor/Detail/index.jsx create mode 100644 src/pages/compute/containers/Hypervisors/Hypervisor/index.jsx create mode 100644 src/pages/compute/containers/Hypervisors/index.jsx create mode 100644 src/pages/compute/containers/Keypair/Detail/BaseDetail.jsx create mode 100644 src/pages/compute/containers/Keypair/Detail/index.jsx create mode 100644 src/pages/compute/containers/Keypair/Detail/index.less create mode 100644 src/pages/compute/containers/Keypair/actions/Create.jsx create mode 100644 src/pages/compute/containers/Keypair/actions/Delete.jsx create mode 100644 src/pages/compute/containers/Keypair/actions/index.jsx create mode 100644 src/pages/compute/containers/Keypair/index.jsx create mode 100644 src/pages/compute/containers/ServerGroup/Detail/index.jsx create mode 100644 src/pages/compute/containers/ServerGroup/Detail/index.less create mode 100644 src/pages/compute/containers/ServerGroup/actions/Create.jsx create mode 100644 src/pages/compute/containers/ServerGroup/actions/Delete.jsx create mode 100644 src/pages/compute/containers/ServerGroup/actions/index.jsx create mode 100644 src/pages/compute/containers/ServerGroup/index.jsx create mode 100644 src/pages/compute/containers/image/Detail/BaseDetail.jsx create mode 100644 src/pages/compute/containers/image/Detail/index.jsx create mode 100644 src/pages/compute/containers/image/Image.jsx create mode 100644 src/pages/compute/containers/image/actions/Create.jsx create mode 100644 src/pages/compute/containers/image/actions/CreateInstance.jsx create mode 100644 src/pages/compute/containers/image/actions/CreateIronic.jsx create mode 100644 src/pages/compute/containers/image/actions/CreateVolume.jsx create mode 100644 src/pages/compute/containers/image/actions/Delete.jsx create mode 100644 src/pages/compute/containers/image/actions/Edit.jsx create mode 100644 src/pages/compute/containers/image/actions/ManageAccess.jsx create mode 100644 src/pages/compute/containers/image/actions/ManageMetadata.jsx create mode 100644 src/pages/compute/containers/image/actions/index.jsx create mode 100644 src/pages/compute/containers/image/index.jsx create mode 100644 src/pages/compute/containers/instance/Detail/BaseDetail/index.jsx create mode 100644 src/pages/compute/containers/instance/Detail/BaseDetail/index.less create mode 100644 src/pages/compute/containers/instance/Detail/SecurityGroup/action/Detach.jsx create mode 100644 src/pages/compute/containers/instance/Detail/SecurityGroup/action/ManageSecurityGroup.jsx create mode 100644 src/pages/compute/containers/instance/Detail/SecurityGroup/index.jsx create mode 100644 src/pages/compute/containers/instance/Detail/SecurityGroup/index.less create mode 100644 src/pages/compute/containers/instance/Detail/index.jsx create mode 100644 src/pages/compute/containers/instance/actions/AssociateFip.jsx create mode 100644 src/pages/compute/containers/instance/actions/AttachInterface.jsx create mode 100644 src/pages/compute/containers/instance/actions/AttachIsoVolume.jsx create mode 100644 src/pages/compute/containers/instance/actions/AttachVolume.jsx create mode 100644 src/pages/compute/containers/instance/actions/ChangePassword.jsx create mode 100644 src/pages/compute/containers/instance/actions/Console.jsx create mode 100644 src/pages/compute/containers/instance/actions/CreateImage.jsx create mode 100644 src/pages/compute/containers/instance/actions/CreateIronic/BaseStep/index.jsx create mode 100644 src/pages/compute/containers/instance/actions/CreateIronic/ConfirmStep/index.jsx create mode 100644 src/pages/compute/containers/instance/actions/CreateIronic/NetworkStep/index.jsx create mode 100644 src/pages/compute/containers/instance/actions/CreateIronic/SystemStep/index.jsx create mode 100644 src/pages/compute/containers/instance/actions/CreateIronic/index.jsx create mode 100644 src/pages/compute/containers/instance/actions/CreateIronic/index.less create mode 100644 src/pages/compute/containers/instance/actions/CreateSnapshot.jsx create mode 100644 src/pages/compute/containers/instance/actions/Delete.jsx create mode 100644 src/pages/compute/containers/instance/actions/DeleteIronic.jsx create mode 100644 src/pages/compute/containers/instance/actions/DetachInterface.jsx create mode 100644 src/pages/compute/containers/instance/actions/DetachIsoVolume.jsx create mode 100644 src/pages/compute/containers/instance/actions/DetachVolume.jsx create mode 100644 src/pages/compute/containers/instance/actions/DisassociateFip.jsx create mode 100644 src/pages/compute/containers/instance/actions/Edit.jsx create mode 100644 src/pages/compute/containers/instance/actions/ExtendRootVolume.jsx create mode 100644 src/pages/compute/containers/instance/actions/LiveMigrate.jsx create mode 100644 src/pages/compute/containers/instance/actions/Lock.jsx create mode 100644 src/pages/compute/containers/instance/actions/ManageSecurityGroup.jsx create mode 100644 src/pages/compute/containers/instance/actions/Migrate.jsx create mode 100644 src/pages/compute/containers/instance/actions/Pause.jsx create mode 100644 src/pages/compute/containers/instance/actions/Reboot.jsx create mode 100644 src/pages/compute/containers/instance/actions/Rebuild.jsx create mode 100644 src/pages/compute/containers/instance/actions/RebuildSelect.jsx create mode 100644 src/pages/compute/containers/instance/actions/Resize.jsx create mode 100644 src/pages/compute/containers/instance/actions/ResizeOnline.jsx create mode 100644 src/pages/compute/containers/instance/actions/Resume.jsx create mode 100644 src/pages/compute/containers/instance/actions/Shelve.jsx create mode 100644 src/pages/compute/containers/instance/actions/SoftDelete.jsx create mode 100644 src/pages/compute/containers/instance/actions/SoftReboot.jsx create mode 100644 src/pages/compute/containers/instance/actions/Start.jsx create mode 100644 src/pages/compute/containers/instance/actions/StepCreate/BaseStep/index.jsx create mode 100644 src/pages/compute/containers/instance/actions/StepCreate/ConfirmStep/index.jsx create mode 100644 src/pages/compute/containers/instance/actions/StepCreate/NetworkStep/index.jsx create mode 100644 src/pages/compute/containers/instance/actions/StepCreate/SystemStep/index.jsx create mode 100644 src/pages/compute/containers/instance/actions/StepCreate/index.jsx create mode 100644 src/pages/compute/containers/instance/actions/StepCreate/index.less create mode 100644 src/pages/compute/containers/instance/actions/Stop.jsx create mode 100644 src/pages/compute/containers/instance/actions/Suspend.jsx create mode 100644 src/pages/compute/containers/instance/actions/Unlock.jsx create mode 100644 src/pages/compute/containers/instance/actions/Unpause.jsx create mode 100644 src/pages/compute/containers/instance/actions/Unshelve.jsx create mode 100644 src/pages/compute/containers/instance/actions/index.jsx create mode 100644 src/pages/compute/containers/instance/actions/index.less create mode 100644 src/pages/compute/containers/instance/components/FlavorSelectTable.jsx create mode 100644 src/pages/compute/containers/instance/components/index.less create mode 100644 src/pages/compute/containers/instance/index.jsx create mode 100644 src/pages/compute/containers/instance/index.less create mode 100644 src/pages/compute/routes/index.js create mode 100644 src/pages/configuration/App.jsx create mode 100644 src/pages/configuration/containers/Metadata/Detail/BaseDetail.jsx create mode 100644 src/pages/configuration/containers/Metadata/Detail/index.jsx create mode 100644 src/pages/configuration/containers/Metadata/actions/Create.jsx create mode 100644 src/pages/configuration/containers/Metadata/actions/Delete.jsx create mode 100644 src/pages/configuration/containers/Metadata/actions/Edit.jsx create mode 100644 src/pages/configuration/containers/Metadata/actions/Manage.jsx create mode 100644 src/pages/configuration/containers/Metadata/actions/index.jsx create mode 100644 src/pages/configuration/containers/Metadata/index.jsx create mode 100644 src/pages/configuration/containers/Setting/actions/Edit.jsx create mode 100644 src/pages/configuration/containers/Setting/actions/Reset.jsx create mode 100644 src/pages/configuration/containers/Setting/actions/View.jsx create mode 100644 src/pages/configuration/containers/Setting/actions/index.jsx create mode 100644 src/pages/configuration/containers/Setting/index.jsx create mode 100644 src/pages/configuration/containers/SystemInfo/Catalog.jsx create mode 100644 src/pages/configuration/containers/SystemInfo/CinderService/actions/Disable.jsx create mode 100644 src/pages/configuration/containers/SystemInfo/CinderService/actions/Enable.jsx create mode 100644 src/pages/configuration/containers/SystemInfo/CinderService/actions/index.jsx create mode 100644 src/pages/configuration/containers/SystemInfo/CinderService/index.jsx create mode 100644 src/pages/configuration/containers/SystemInfo/ComputeService/actions/Disable.jsx create mode 100644 src/pages/configuration/containers/SystemInfo/ComputeService/actions/Enable.jsx create mode 100644 src/pages/configuration/containers/SystemInfo/ComputeService/actions/index.jsx create mode 100644 src/pages/configuration/containers/SystemInfo/ComputeService/index.jsx create mode 100644 src/pages/configuration/containers/SystemInfo/HeatService.jsx create mode 100644 src/pages/configuration/containers/SystemInfo/NeutronAgent/Detail/BaseDetail.jsx create mode 100644 src/pages/configuration/containers/SystemInfo/NeutronAgent/Detail/Network/actions/Add.jsx create mode 100644 src/pages/configuration/containers/SystemInfo/NeutronAgent/Detail/Network/actions/Remove.jsx create mode 100644 src/pages/configuration/containers/SystemInfo/NeutronAgent/Detail/Network/actions/index.jsx create mode 100644 src/pages/configuration/containers/SystemInfo/NeutronAgent/Detail/Network/index.jsx create mode 100644 src/pages/configuration/containers/SystemInfo/NeutronAgent/Detail/Router/actions/Add.jsx create mode 100644 src/pages/configuration/containers/SystemInfo/NeutronAgent/Detail/Router/actions/Remove.jsx create mode 100644 src/pages/configuration/containers/SystemInfo/NeutronAgent/Detail/Router/actions/index.jsx create mode 100644 src/pages/configuration/containers/SystemInfo/NeutronAgent/Detail/Router/index.jsx create mode 100644 src/pages/configuration/containers/SystemInfo/NeutronAgent/Detail/index.jsx create mode 100644 src/pages/configuration/containers/SystemInfo/NeutronAgent/actions/Disable.jsx create mode 100644 src/pages/configuration/containers/SystemInfo/NeutronAgent/actions/Enable.jsx create mode 100644 src/pages/configuration/containers/SystemInfo/NeutronAgent/actions/index.jsx create mode 100644 src/pages/configuration/containers/SystemInfo/NeutronAgent/index.jsx create mode 100644 src/pages/configuration/containers/SystemInfo/index.jsx create mode 100644 src/pages/configuration/containers/SystemInfo/index.less create mode 100644 src/pages/configuration/routes/index.js create mode 100644 src/pages/heat/App.jsx create mode 100644 src/pages/heat/containers/Stack/Detail/BaseDetail.jsx create mode 100644 src/pages/heat/containers/Stack/Detail/Event.jsx create mode 100644 src/pages/heat/containers/Stack/Detail/Resource.jsx create mode 100644 src/pages/heat/containers/Stack/Detail/Template.jsx create mode 100644 src/pages/heat/containers/Stack/Detail/index.jsx create mode 100644 src/pages/heat/containers/Stack/actions/Abandon.jsx create mode 100644 src/pages/heat/containers/Stack/actions/Create/Parameter.jsx create mode 100644 src/pages/heat/containers/Stack/actions/Create/Template.jsx create mode 100644 src/pages/heat/containers/Stack/actions/Create/index.jsx create mode 100644 src/pages/heat/containers/Stack/actions/Delete.jsx create mode 100644 src/pages/heat/containers/Stack/actions/Edit.jsx create mode 100644 src/pages/heat/containers/Stack/actions/index.jsx create mode 100644 src/pages/heat/containers/Stack/index.jsx create mode 100644 src/pages/heat/routes/index.js create mode 100644 src/pages/identity/App.jsx create mode 100644 src/pages/identity/containers/Domain/Detail/index.jsx create mode 100644 src/pages/identity/containers/Domain/Detail/index.less create mode 100644 src/pages/identity/containers/Domain/actions/Create.jsx create mode 100644 src/pages/identity/containers/Domain/actions/Delete.jsx create mode 100644 src/pages/identity/containers/Domain/actions/Edit.jsx create mode 100644 src/pages/identity/containers/Domain/actions/Enable.jsx create mode 100644 src/pages/identity/containers/Domain/actions/Forbidden.jsx create mode 100644 src/pages/identity/containers/Domain/actions/index.jsx create mode 100644 src/pages/identity/containers/Domain/index.jsx create mode 100644 src/pages/identity/containers/Domain/index.less create mode 100644 src/pages/identity/containers/Project/Detail/Quota.jsx create mode 100644 src/pages/identity/containers/Project/Detail/index.jsx create mode 100644 src/pages/identity/containers/Project/Detail/index.less create mode 100644 src/pages/identity/containers/Project/Detail/style.less create mode 100644 src/pages/identity/containers/Project/actions/Create.jsx create mode 100644 src/pages/identity/containers/Project/actions/Delete.jsx create mode 100644 src/pages/identity/containers/Project/actions/Edit.jsx create mode 100644 src/pages/identity/containers/Project/actions/Enable.jsx create mode 100644 src/pages/identity/containers/Project/actions/Forbidden.jsx create mode 100644 src/pages/identity/containers/Project/actions/ModifyTags.jsx create mode 100644 src/pages/identity/containers/Project/actions/QuotaManager.jsx create mode 100644 src/pages/identity/containers/Project/actions/Start.jsx create mode 100644 src/pages/identity/containers/Project/actions/Stop.jsx create mode 100644 src/pages/identity/containers/Project/actions/UserGroupManager.jsx create mode 100644 src/pages/identity/containers/Project/actions/UserManager.jsx create mode 100644 src/pages/identity/containers/Project/actions/index.jsx create mode 100644 src/pages/identity/containers/Project/index.jsx create mode 100644 src/pages/identity/containers/Project/index.less create mode 100644 src/pages/identity/containers/Role/Detail/BaseDetail.jsx create mode 100644 src/pages/identity/containers/Role/Detail/index.jsx create mode 100644 src/pages/identity/containers/Role/Detail/index.less create mode 100644 src/pages/identity/containers/Role/index.jsx create mode 100644 src/pages/identity/containers/User/Detail/index.jsx create mode 100644 src/pages/identity/containers/User/Detail/index.less create mode 100644 src/pages/identity/containers/User/actions/Create.jsx create mode 100644 src/pages/identity/containers/User/actions/Delete.jsx create mode 100644 src/pages/identity/containers/User/actions/Edit.jsx create mode 100644 src/pages/identity/containers/User/actions/Enable.jsx create mode 100644 src/pages/identity/containers/User/actions/Forbidden.jsx create mode 100644 src/pages/identity/containers/User/actions/Password.jsx create mode 100644 src/pages/identity/containers/User/actions/SystemRole.jsx create mode 100644 src/pages/identity/containers/User/actions/index.jsx create mode 100644 src/pages/identity/containers/User/actionsInDomain/Create.jsx create mode 100644 src/pages/identity/containers/User/actionsInDomain/index.jsx create mode 100644 src/pages/identity/containers/User/index.jsx create mode 100644 src/pages/identity/containers/UserGroup/Detail/index.jsx create mode 100644 src/pages/identity/containers/UserGroup/Detail/index.less create mode 100644 src/pages/identity/containers/UserGroup/actions/Create.jsx create mode 100644 src/pages/identity/containers/UserGroup/actions/Delete.jsx create mode 100644 src/pages/identity/containers/UserGroup/actions/DomainPermission.jsx create mode 100644 src/pages/identity/containers/UserGroup/actions/Edit.jsx create mode 100644 src/pages/identity/containers/UserGroup/actions/SystemPermission.jsx create mode 100644 src/pages/identity/containers/UserGroup/actions/UserManager.jsx create mode 100644 src/pages/identity/containers/UserGroup/actions/index.jsx create mode 100644 src/pages/identity/containers/UserGroup/index.jsx create mode 100644 src/pages/identity/routes/index.js create mode 100644 src/pages/network/App.jsx create mode 100644 src/pages/network/containers/FloatingIp/Detail/BaseDetail.jsx create mode 100644 src/pages/network/containers/FloatingIp/Detail/PortForwarding/actions/Delete.jsx create mode 100644 src/pages/network/containers/FloatingIp/Detail/PortForwarding/actions/Edit.jsx create mode 100644 src/pages/network/containers/FloatingIp/Detail/PortForwarding/actions/index.jsx create mode 100644 src/pages/network/containers/FloatingIp/Detail/PortForwarding/index.jsx create mode 100644 src/pages/network/containers/FloatingIp/Detail/index.jsx create mode 100644 src/pages/network/containers/FloatingIp/actions/Allocate.jsx create mode 100644 src/pages/network/containers/FloatingIp/actions/Associate.jsx create mode 100644 src/pages/network/containers/FloatingIp/actions/CreateDNAT.jsx create mode 100644 src/pages/network/containers/FloatingIp/actions/Disassociate.js create mode 100644 src/pages/network/containers/FloatingIp/actions/Edit.jsx create mode 100644 src/pages/network/containers/FloatingIp/actions/Release.jsx create mode 100644 src/pages/network/containers/FloatingIp/actions/index.jsx create mode 100644 src/pages/network/containers/FloatingIp/index.jsx create mode 100644 src/pages/network/containers/FloatingIp/styles.less create mode 100644 src/pages/network/containers/LoadBalancers/LoadBalancerInstance/Detail/index.jsx create mode 100644 src/pages/network/containers/LoadBalancers/LoadBalancerInstance/actions/AssociateFIP.jsx create mode 100644 src/pages/network/containers/LoadBalancers/LoadBalancerInstance/actions/Delete.jsx create mode 100644 src/pages/network/containers/LoadBalancers/LoadBalancerInstance/actions/DisassociateFip.jsx create mode 100644 src/pages/network/containers/LoadBalancers/LoadBalancerInstance/actions/Edit.jsx create mode 100644 src/pages/network/containers/LoadBalancers/LoadBalancerInstance/actions/StepCreate/BaseStep/index.jsx create mode 100644 src/pages/network/containers/LoadBalancers/LoadBalancerInstance/actions/StepCreate/index.jsx create mode 100644 src/pages/network/containers/LoadBalancers/LoadBalancerInstance/actions/index.js create mode 100644 src/pages/network/containers/LoadBalancers/LoadBalancerInstance/index.jsx create mode 100644 src/pages/network/containers/LoadBalancers/StepCreateComponents/HealthMonitorStep/index.jsx create mode 100644 src/pages/network/containers/LoadBalancers/StepCreateComponents/ListenerStep/index.jsx create mode 100644 src/pages/network/containers/LoadBalancers/StepCreateComponents/MemberStep/index.jsx create mode 100644 src/pages/network/containers/LoadBalancers/StepCreateComponents/PoolStep/index.jsx create mode 100644 src/pages/network/containers/LoadBalancers/index.jsx create mode 100644 src/pages/network/containers/LoadBalancers/listener/Actions/CreateListener.jsx create mode 100644 src/pages/network/containers/LoadBalancers/listener/Actions/CreatePool.jsx create mode 100644 src/pages/network/containers/LoadBalancers/listener/Actions/DeleteListener.jsx create mode 100644 src/pages/network/containers/LoadBalancers/listener/Actions/DeletePool.jsx create mode 100644 src/pages/network/containers/LoadBalancers/listener/Actions/Edit.jsx create mode 100644 src/pages/network/containers/LoadBalancers/listener/Actions/EditHealthMonitor.jsx create mode 100644 src/pages/network/containers/LoadBalancers/listener/Actions/EditPoolInfo.jsx create mode 100644 src/pages/network/containers/LoadBalancers/listener/Actions/MemberManagement.jsx create mode 100644 src/pages/network/containers/LoadBalancers/listener/Actions/index.jsx create mode 100644 src/pages/network/containers/LoadBalancers/listener/Detail/BaseDetail.jsx create mode 100644 src/pages/network/containers/LoadBalancers/listener/Detail/Member/Actions/CreateMember.jsx create mode 100644 src/pages/network/containers/LoadBalancers/listener/Detail/Member/Actions/DeleteMember.jsx create mode 100644 src/pages/network/containers/LoadBalancers/listener/Detail/Member/Actions/EditMember.jsx create mode 100644 src/pages/network/containers/LoadBalancers/listener/Detail/Member/Actions/index.jsx create mode 100644 src/pages/network/containers/LoadBalancers/listener/Detail/Member/index.jsx create mode 100644 src/pages/network/containers/LoadBalancers/listener/Detail/index.jsx create mode 100644 src/pages/network/containers/LoadBalancers/listener/index.jsx create mode 100644 src/pages/network/containers/Network/AdminNetwork.jsx create mode 100644 src/pages/network/containers/Network/Detail/Detail.jsx create mode 100644 src/pages/network/containers/Network/Detail/Subnets.jsx create mode 100644 src/pages/network/containers/Network/Detail/index.jsx create mode 100644 src/pages/network/containers/Network/Detail/subnetActions/DeleteSubnet.jsx create mode 100644 src/pages/network/containers/Network/Detail/subnetActions/EditSubnet.jsx create mode 100644 src/pages/network/containers/Network/Detail/subnetActions/index.jsx create mode 100644 src/pages/network/containers/Network/ExtNetwork.jsx create mode 100644 src/pages/network/containers/Network/ProjectNetwork.jsx create mode 100644 src/pages/network/containers/Network/SharedNetwork.jsx create mode 100644 src/pages/network/containers/Network/actions/CreateNetwork.jsx create mode 100644 src/pages/network/containers/Network/actions/CreateSubnet.jsx create mode 100644 src/pages/network/containers/Network/actions/Delete.jsx create mode 100644 src/pages/network/containers/Network/actions/Edit.jsx create mode 100644 src/pages/network/containers/Network/actions/index.jsx create mode 100644 src/pages/network/containers/Network/actions/networkUtil.js create mode 100644 src/pages/network/containers/Network/index.jsx create mode 100644 src/pages/network/containers/QoSPolicy/AdminQoSPolicy.js create mode 100644 src/pages/network/containers/QoSPolicy/Detail/BaseDetail.jsx create mode 100644 src/pages/network/containers/QoSPolicy/Detail/index.jsx create mode 100644 src/pages/network/containers/QoSPolicy/ProjectQoSPolicy.js create mode 100644 src/pages/network/containers/QoSPolicy/SharedQoSPolicy.js create mode 100644 src/pages/network/containers/QoSPolicy/actions/Create.jsx create mode 100644 src/pages/network/containers/QoSPolicy/actions/CreateBandwidthLimitRule.jsx create mode 100644 src/pages/network/containers/QoSPolicy/actions/CreateDSCPMarkingRules.jsx create mode 100644 src/pages/network/containers/QoSPolicy/actions/DSCPMarkingItems.js create mode 100644 src/pages/network/containers/QoSPolicy/actions/Delete.jsx create mode 100644 src/pages/network/containers/QoSPolicy/actions/DeleteBandwidthEgressRules.jsx create mode 100644 src/pages/network/containers/QoSPolicy/actions/DeleteBandwidthIngressRules.jsx create mode 100644 src/pages/network/containers/QoSPolicy/actions/DeleteDSCPMarkingRules.jsx create mode 100644 src/pages/network/containers/QoSPolicy/actions/Edit.jsx create mode 100644 src/pages/network/containers/QoSPolicy/actions/EditBandwidthEgressRule.jsx create mode 100644 src/pages/network/containers/QoSPolicy/actions/EditBandwidthIngressRule.jsx create mode 100644 src/pages/network/containers/QoSPolicy/actions/EditDSCPMarkingRule.jsx create mode 100644 src/pages/network/containers/QoSPolicy/actions/index.jsx create mode 100644 src/pages/network/containers/QoSPolicy/index.jsx create mode 100644 src/pages/network/containers/Router/Detail/BaseDetail.jsx create mode 100644 src/pages/network/containers/Router/Detail/index.jsx create mode 100644 src/pages/network/containers/Router/Port/Detail/BaseDetail.jsx create mode 100644 src/pages/network/containers/Router/Port/Detail/index.jsx create mode 100644 src/pages/network/containers/Router/Port/index.jsx create mode 100644 src/pages/network/containers/Router/Snat/actions/Create.jsx create mode 100644 src/pages/network/containers/Router/Snat/actions/Delete.jsx create mode 100644 src/pages/network/containers/Router/Snat/actions/index.jsx create mode 100644 src/pages/network/containers/Router/Snat/index.jsx create mode 100644 src/pages/network/containers/Router/StaticRouter/actions/Create.jsx create mode 100644 src/pages/network/containers/Router/StaticRouter/actions/Delete.jsx create mode 100644 src/pages/network/containers/Router/StaticRouter/actions/index.jsx create mode 100644 src/pages/network/containers/Router/StaticRouter/index.jsx create mode 100644 src/pages/network/containers/Router/actions/AssociateFip.jsx create mode 100644 src/pages/network/containers/Router/actions/CloseGateway.jsx create mode 100644 src/pages/network/containers/Router/actions/ConnectSubnet.jsx create mode 100644 src/pages/network/containers/Router/actions/Create.jsx create mode 100644 src/pages/network/containers/Router/actions/Delete.jsx create mode 100644 src/pages/network/containers/Router/actions/DisassociateFip.jsx create mode 100644 src/pages/network/containers/Router/actions/DisconnectSubnet.jsx create mode 100644 src/pages/network/containers/Router/actions/Edit.jsx create mode 100644 src/pages/network/containers/Router/actions/SetGateway.jsx create mode 100644 src/pages/network/containers/Router/actions/index.jsx create mode 100644 src/pages/network/containers/Router/index.jsx create mode 100644 src/pages/network/containers/SecurityGroup/Detail/Rule/actions/Create.jsx create mode 100644 src/pages/network/containers/SecurityGroup/Detail/Rule/actions/Delete.jsx create mode 100644 src/pages/network/containers/SecurityGroup/Detail/Rule/actions/index.jsx create mode 100644 src/pages/network/containers/SecurityGroup/Detail/Rule/index.jsx create mode 100644 src/pages/network/containers/SecurityGroup/Detail/index.jsx create mode 100644 src/pages/network/containers/SecurityGroup/actions/Create.jsx create mode 100644 src/pages/network/containers/SecurityGroup/actions/Delete.jsx create mode 100644 src/pages/network/containers/SecurityGroup/actions/Edit.jsx create mode 100644 src/pages/network/containers/SecurityGroup/actions/index.jsx create mode 100644 src/pages/network/containers/SecurityGroup/index.jsx create mode 100644 src/pages/network/containers/VPN/EndpointGroup/actions/Create.js create mode 100644 src/pages/network/containers/VPN/EndpointGroup/actions/Delete.jsx create mode 100644 src/pages/network/containers/VPN/EndpointGroup/actions/Edit.js create mode 100644 src/pages/network/containers/VPN/EndpointGroup/actions/index.js create mode 100644 src/pages/network/containers/VPN/EndpointGroup/index.jsx create mode 100644 src/pages/network/containers/VPN/IKEPolicy/actions/Create.js create mode 100644 src/pages/network/containers/VPN/IKEPolicy/actions/Delete.jsx create mode 100644 src/pages/network/containers/VPN/IKEPolicy/actions/Edit.jsx create mode 100644 src/pages/network/containers/VPN/IKEPolicy/actions/index.js create mode 100644 src/pages/network/containers/VPN/IKEPolicy/index.jsx create mode 100644 src/pages/network/containers/VPN/IPSecPolicy/actions/Create.js create mode 100644 src/pages/network/containers/VPN/IPSecPolicy/actions/Delete.jsx create mode 100644 src/pages/network/containers/VPN/IPSecPolicy/actions/Edit.jsx create mode 100644 src/pages/network/containers/VPN/IPSecPolicy/actions/index.js create mode 100644 src/pages/network/containers/VPN/IPSecPolicy/index.jsx create mode 100644 src/pages/network/containers/VPN/VPNGateway/actions/Create.js create mode 100644 src/pages/network/containers/VPN/VPNGateway/actions/Delete.jsx create mode 100644 src/pages/network/containers/VPN/VPNGateway/actions/Edit.js create mode 100644 src/pages/network/containers/VPN/VPNGateway/actions/index.js create mode 100644 src/pages/network/containers/VPN/VPNGateway/index.jsx create mode 100644 src/pages/network/containers/VPN/VPNTunnel/Detail/BaseDetail.jsx create mode 100644 src/pages/network/containers/VPN/VPNTunnel/Detail/index.jsx create mode 100644 src/pages/network/containers/VPN/VPNTunnel/actions/Create.jsx create mode 100644 src/pages/network/containers/VPN/VPNTunnel/actions/Delete.jsx create mode 100644 src/pages/network/containers/VPN/VPNTunnel/actions/Edit.js create mode 100644 src/pages/network/containers/VPN/VPNTunnel/actions/components/LocalSubnet.jsx create mode 100644 src/pages/network/containers/VPN/VPNTunnel/actions/index.js create mode 100644 src/pages/network/containers/VPN/VPNTunnel/index.jsx create mode 100644 src/pages/network/containers/VPN/index.jsx create mode 100644 src/pages/network/containers/VirtualAdapter/Detail/AllowedAddressPair/actions/CreateAllowedAddressPair.jsx create mode 100644 src/pages/network/containers/VirtualAdapter/Detail/AllowedAddressPair/actions/Delete.jsx create mode 100644 src/pages/network/containers/VirtualAdapter/Detail/AllowedAddressPair/actions/index.jsx create mode 100644 src/pages/network/containers/VirtualAdapter/Detail/AllowedAddressPair/index.jsx create mode 100644 src/pages/network/containers/VirtualAdapter/Detail/BaseDetail/index.jsx create mode 100644 src/pages/network/containers/VirtualAdapter/Detail/FixedIPs/actions/ReleaseIP.jsx create mode 100644 src/pages/network/containers/VirtualAdapter/Detail/FixedIPs/actions/index.jsx create mode 100644 src/pages/network/containers/VirtualAdapter/Detail/FixedIPs/index.jsx create mode 100644 src/pages/network/containers/VirtualAdapter/Detail/SecurityGroups/actions/Detach.jsx create mode 100644 src/pages/network/containers/VirtualAdapter/Detail/SecurityGroups/actions/index.jsx create mode 100644 src/pages/network/containers/VirtualAdapter/Detail/SecurityGroups/index.jsx create mode 100644 src/pages/network/containers/VirtualAdapter/Detail/SecurityGroups/index.less create mode 100644 src/pages/network/containers/VirtualAdapter/Detail/index.jsx create mode 100644 src/pages/network/containers/VirtualAdapter/Detail/index.less create mode 100644 src/pages/network/containers/VirtualAdapter/actions/AllocateIP.jsx create mode 100644 src/pages/network/containers/VirtualAdapter/actions/AssociateFIP.jsx create mode 100644 src/pages/network/containers/VirtualAdapter/actions/Attach.jsx create mode 100644 src/pages/network/containers/VirtualAdapter/actions/Create.jsx create mode 100644 src/pages/network/containers/VirtualAdapter/actions/Delete.jsx create mode 100644 src/pages/network/containers/VirtualAdapter/actions/Detach.jsx create mode 100644 src/pages/network/containers/VirtualAdapter/actions/DisAssociateFIP.jsx create mode 100644 src/pages/network/containers/VirtualAdapter/actions/Edit.jsx create mode 100644 src/pages/network/containers/VirtualAdapter/actions/ManageSecurityGroup.jsx create mode 100644 src/pages/network/containers/VirtualAdapter/actions/ModifyQoS.jsx create mode 100644 src/pages/network/containers/VirtualAdapter/actions/index.jsx create mode 100644 src/pages/network/containers/VirtualAdapter/index.jsx create mode 100644 src/pages/network/containers/topology/InstanceCard.jsx create mode 100644 src/pages/network/containers/topology/NodeCard.jsx create mode 100644 src/pages/network/containers/topology/index.jsx create mode 100644 src/pages/network/containers/topology/index.less create mode 100644 src/pages/network/routes/index.js create mode 100644 src/pages/storage/App.jsx create mode 100644 src/pages/storage/containers/Backup/Detail/BaseDetail.jsx create mode 100644 src/pages/storage/containers/Backup/Detail/index.jsx create mode 100644 src/pages/storage/containers/Backup/actions/Create.jsx create mode 100644 src/pages/storage/containers/Backup/actions/CreateVolume.jsx create mode 100644 src/pages/storage/containers/Backup/actions/Delete.jsx create mode 100644 src/pages/storage/containers/Backup/actions/Edit.jsx create mode 100644 src/pages/storage/containers/Backup/actions/Restore.jsx create mode 100644 src/pages/storage/containers/Backup/actions/index.jsx create mode 100644 src/pages/storage/containers/Backup/index.jsx create mode 100644 src/pages/storage/containers/Snapshot/Detail/BaseDetail.jsx create mode 100644 src/pages/storage/containers/Snapshot/Detail/index.jsx create mode 100644 src/pages/storage/containers/Snapshot/actions/CreateVolume.jsx create mode 100644 src/pages/storage/containers/Snapshot/actions/Delete.jsx create mode 100644 src/pages/storage/containers/Snapshot/actions/Edit.jsx create mode 100644 src/pages/storage/containers/Snapshot/actions/Restore.jsx create mode 100644 src/pages/storage/containers/Snapshot/actions/index.jsx create mode 100644 src/pages/storage/containers/Snapshot/index.jsx create mode 100644 src/pages/storage/containers/Storage/index.jsx create mode 100644 src/pages/storage/containers/Volume/Detail/BaseDetail.jsx create mode 100644 src/pages/storage/containers/Volume/Detail/index.jsx create mode 100644 src/pages/storage/containers/Volume/actions/AcceptVolumeTransfer.jsx create mode 100644 src/pages/storage/containers/Volume/actions/Attach.jsx create mode 100644 src/pages/storage/containers/Volume/actions/CancelTransfer.jsx create mode 100644 src/pages/storage/containers/Volume/actions/ChangeType.jsx create mode 100644 src/pages/storage/containers/Volume/actions/CloneVolume.jsx create mode 100644 src/pages/storage/containers/Volume/actions/Create/index.jsx create mode 100644 src/pages/storage/containers/Volume/actions/Create/index.less create mode 100644 src/pages/storage/containers/Volume/actions/CreateBackup.jsx create mode 100644 src/pages/storage/containers/Volume/actions/CreateImage.jsx create mode 100644 src/pages/storage/containers/Volume/actions/CreateInstance.jsx create mode 100644 src/pages/storage/containers/Volume/actions/CreateSnapshot.jsx create mode 100644 src/pages/storage/containers/Volume/actions/CreateTransfer.jsx create mode 100644 src/pages/storage/containers/Volume/actions/Delete.jsx create mode 100644 src/pages/storage/containers/Volume/actions/Detach.jsx create mode 100644 src/pages/storage/containers/Volume/actions/Edit.jsx create mode 100644 src/pages/storage/containers/Volume/actions/ExtendVolume.jsx create mode 100644 src/pages/storage/containers/Volume/actions/Migrate.jsx create mode 100644 src/pages/storage/containers/Volume/actions/UpdateStatus.jsx create mode 100644 src/pages/storage/containers/Volume/actions/index.jsx create mode 100644 src/pages/storage/containers/Volume/index.jsx create mode 100644 src/pages/storage/containers/VolumeType/QosSpec/Detail/ExtraSpec/actions/Create.jsx create mode 100644 src/pages/storage/containers/VolumeType/QosSpec/Detail/ExtraSpec/actions/Delete.jsx create mode 100644 src/pages/storage/containers/VolumeType/QosSpec/Detail/ExtraSpec/actions/Edit.jsx create mode 100644 src/pages/storage/containers/VolumeType/QosSpec/Detail/ExtraSpec/actions/index.jsx create mode 100644 src/pages/storage/containers/VolumeType/QosSpec/Detail/ExtraSpec/index.jsx create mode 100644 src/pages/storage/containers/VolumeType/QosSpec/Detail/index.jsx create mode 100644 src/pages/storage/containers/VolumeType/QosSpec/actions/Create.jsx create mode 100644 src/pages/storage/containers/VolumeType/QosSpec/actions/Delete.jsx create mode 100644 src/pages/storage/containers/VolumeType/QosSpec/actions/EditConsumer.jsx create mode 100644 src/pages/storage/containers/VolumeType/QosSpec/actions/index.jsx create mode 100644 src/pages/storage/containers/VolumeType/QosSpec/index.jsx create mode 100644 src/pages/storage/containers/VolumeType/VolumeType/Detail/BaseDetail.jsx create mode 100644 src/pages/storage/containers/VolumeType/VolumeType/Detail/ExtraSpec/actions/Create.jsx create mode 100644 src/pages/storage/containers/VolumeType/VolumeType/Detail/ExtraSpec/actions/Delete.jsx create mode 100644 src/pages/storage/containers/VolumeType/VolumeType/Detail/ExtraSpec/actions/Edit.jsx create mode 100644 src/pages/storage/containers/VolumeType/VolumeType/Detail/ExtraSpec/actions/index.jsx create mode 100644 src/pages/storage/containers/VolumeType/VolumeType/Detail/ExtraSpec/index.jsx create mode 100644 src/pages/storage/containers/VolumeType/VolumeType/Detail/index.jsx create mode 100644 src/pages/storage/containers/VolumeType/VolumeType/actions/Create.jsx create mode 100644 src/pages/storage/containers/VolumeType/VolumeType/actions/CreateEncryption.jsx create mode 100644 src/pages/storage/containers/VolumeType/VolumeType/actions/Delete.jsx create mode 100644 src/pages/storage/containers/VolumeType/VolumeType/actions/DeleteEncryption.jsx create mode 100644 src/pages/storage/containers/VolumeType/VolumeType/actions/Edit.jsx create mode 100644 src/pages/storage/containers/VolumeType/VolumeType/actions/ManageAccess.jsx create mode 100644 src/pages/storage/containers/VolumeType/VolumeType/actions/ManageQos.jsx create mode 100644 src/pages/storage/containers/VolumeType/VolumeType/actions/index.jsx create mode 100644 src/pages/storage/containers/VolumeType/VolumeType/index.jsx create mode 100644 src/pages/storage/containers/VolumeType/index.jsx create mode 100644 src/pages/storage/routes/index.js create mode 100644 src/pages/user/App.jsx create mode 100644 src/pages/user/containers/ChangePassword/index.jsx create mode 100644 src/pages/user/containers/ChangePassword/index.less create mode 100644 src/pages/user/containers/Login/index.jsx create mode 100644 src/pages/user/containers/Login/index.less create mode 100644 src/pages/user/routes/index.js create mode 100644 src/resources/backup.jsx create mode 100644 src/resources/cinder-pool.jsx create mode 100644 src/resources/flavor.js create mode 100644 src/resources/floatingip.js create mode 100644 src/resources/hypervisor.jsx create mode 100644 src/resources/image.jsx create mode 100644 src/resources/instance.jsx create mode 100644 src/resources/ironic.js create mode 100644 src/resources/network.js create mode 100644 src/resources/neutron.js create mode 100644 src/resources/openstack-rc.js create mode 100644 src/resources/policy.js create mode 100644 src/resources/pool.js create mode 100644 src/resources/port.jsx create mode 100644 src/resources/project.js create mode 100644 src/resources/qos-policy.jsx create mode 100644 src/resources/role.js create mode 100644 src/resources/router.jsx create mode 100644 src/resources/security-group-rule.js create mode 100644 src/resources/security-group.jsx create mode 100644 src/resources/server-group.js create mode 100644 src/resources/service.js create mode 100644 src/resources/stack.js create mode 100644 src/resources/topology-color.js create mode 100644 src/resources/volume-type.js create mode 100644 src/resources/volume.jsx create mode 100644 src/resources/vpn.js create mode 100644 src/stores/base-list.js create mode 100644 src/stores/base.js create mode 100644 src/stores/cinder/backup.js create mode 100644 src/stores/cinder/extra-spec.js create mode 100644 src/stores/cinder/pool.js create mode 100644 src/stores/cinder/qos-spec-key.js create mode 100644 src/stores/cinder/qos-spec.js create mode 100644 src/stores/cinder/service.js create mode 100644 src/stores/cinder/snapshot.js create mode 100644 src/stores/cinder/volume-type.js create mode 100644 src/stores/cinder/volume.js create mode 100644 src/stores/glance/image.js create mode 100644 src/stores/glance/instance-snapshot.js create mode 100644 src/stores/glance/metadata.js create mode 100644 src/stores/heat/event.js create mode 100644 src/stores/heat/resource.js create mode 100644 src/stores/heat/service.js create mode 100644 src/stores/heat/stack.js create mode 100644 src/stores/ironic/ironic.js create mode 100644 src/stores/ironic/port-group.js create mode 100644 src/stores/ironic/port.js create mode 100644 src/stores/keystone/catalog.js create mode 100644 src/stores/keystone/domain.js create mode 100644 src/stores/keystone/project.js create mode 100644 src/stores/keystone/role.js create mode 100644 src/stores/keystone/tag.js create mode 100644 src/stores/keystone/user-group.js create mode 100644 src/stores/keystone/user.js create mode 100644 src/stores/neutron/agent-network.js create mode 100644 src/stores/neutron/agent-router.js create mode 100644 src/stores/neutron/agent.js create mode 100644 src/stores/neutron/fixed-ip.js create mode 100644 src/stores/neutron/floatingIp.js create mode 100644 src/stores/neutron/network.js create mode 100644 src/stores/neutron/neutron.js create mode 100644 src/stores/neutron/port-forwarding.js create mode 100644 src/stores/neutron/port.js create mode 100644 src/stores/neutron/qos-policy.js create mode 100644 src/stores/neutron/router.js create mode 100644 src/stores/neutron/security-group.js create mode 100644 src/stores/neutron/security-rule.js create mode 100644 src/stores/neutron/static-route.js create mode 100644 src/stores/neutron/subnet.js create mode 100644 src/stores/neutron/virtual-adapter.js create mode 100644 src/stores/neutron/vpn-endpoint-group.js create mode 100644 src/stores/neutron/vpn-ike-policy.js create mode 100644 src/stores/neutron/vpn-ipsec-connection.js create mode 100644 src/stores/neutron/vpn-ipsec-policy.js create mode 100644 src/stores/neutron/vpn-service.js create mode 100644 src/stores/nova/aggregate.js create mode 100644 src/stores/nova/compute-host.js create mode 100644 src/stores/nova/flavor.js create mode 100644 src/stores/nova/hypervisor.js create mode 100644 src/stores/nova/instance-volume.js create mode 100644 src/stores/nova/instance.js create mode 100644 src/stores/nova/keypair.js create mode 100644 src/stores/nova/server-group.js create mode 100644 src/stores/nova/zone.js create mode 100644 src/stores/octavia/health-monitor.js create mode 100644 src/stores/octavia/listener.js create mode 100644 src/stores/octavia/loadbalancer.js create mode 100644 src/stores/octavia/pool-member.js create mode 100644 src/stores/octavia/pool.js create mode 100644 src/stores/overview-admin.js create mode 100644 src/stores/project.js create mode 100644 src/stores/root.js create mode 100644 src/stores/skyline/recycle-server.js create mode 100644 src/stores/skyline/server-group-instance.js create mode 100644 src/stores/skyline/setting.js create mode 100644 src/stores/skyline/skyline.js create mode 100644 src/styles/base.less create mode 100644 src/styles/main.less create mode 100644 src/styles/reset.less create mode 100644 src/styles/variables.less create mode 100644 src/utils/RouterConfig.jsx create mode 100644 src/utils/constants.js create mode 100644 src/utils/cookie.js create mode 100644 src/utils/file.js create mode 100644 src/utils/file.spec.js create mode 100644 src/utils/index.js create mode 100644 src/utils/index.test.js create mode 100644 src/utils/local-storage.js create mode 100644 src/utils/local-storage.spec.js create mode 100644 src/utils/request.js create mode 100644 src/utils/table.jsx create mode 100644 src/utils/time.js create mode 100644 src/utils/time.spec.js create mode 100644 src/utils/translate.js create mode 100644 src/utils/translate.spec.js create mode 100644 src/utils/validate.js create mode 100644 src/utils/yaml.js create mode 100644 src/utils/yaml.spec.js create mode 100644 test/e2e/config/config.yaml create mode 100644 test/e2e/fixtures/example.json create mode 100644 test/e2e/fixtures/keypair create mode 100644 test/e2e/fixtures/metadata.json create mode 100644 test/e2e/fixtures/profile.json create mode 100644 test/e2e/fixtures/stack-content.yaml create mode 100644 test/e2e/fixtures/stack-params.yaml create mode 100644 test/e2e/integration/pages/compute/aggregate.spec.js create mode 100644 test/e2e/integration/pages/compute/baremetal.spec.js create mode 100644 test/e2e/integration/pages/compute/flavor.spec.js create mode 100644 test/e2e/integration/pages/compute/hypervisor.spec.js create mode 100644 test/e2e/integration/pages/compute/image.spec.js create mode 100644 test/e2e/integration/pages/compute/instance.spec.js create mode 100644 test/e2e/integration/pages/compute/ironic.spec.js create mode 100644 test/e2e/integration/pages/compute/keypair.spec.js create mode 100644 test/e2e/integration/pages/compute/server-group.spec.js create mode 100644 test/e2e/integration/pages/configuration/metadata.spec.js create mode 100644 test/e2e/integration/pages/configuration/system.spec.js create mode 100644 test/e2e/integration/pages/error.spec.js create mode 100644 test/e2e/integration/pages/heat/stack.spec.js create mode 100644 test/e2e/integration/pages/identity/domain.spec.js create mode 100644 test/e2e/integration/pages/identity/project.spec.js create mode 100644 test/e2e/integration/pages/identity/role.spec.js create mode 100644 test/e2e/integration/pages/identity/user-group.spec.js create mode 100644 test/e2e/integration/pages/identity/user.spec.js create mode 100644 test/e2e/integration/pages/login.spec.js create mode 100644 test/e2e/integration/pages/management/recycle-bin.spec.js create mode 100644 test/e2e/integration/pages/network/floatingip.spec.js create mode 100644 test/e2e/integration/pages/network/lb.spec.js create mode 100644 test/e2e/integration/pages/network/network.spec.js create mode 100644 test/e2e/integration/pages/network/qos-policy.spec.js create mode 100644 test/e2e/integration/pages/network/router.spec.js create mode 100644 test/e2e/integration/pages/network/security-group.spec.js create mode 100644 test/e2e/integration/pages/network/topology.spec.js create mode 100644 test/e2e/integration/pages/network/virtual-adapter.spec.js create mode 100644 test/e2e/integration/pages/network/vpn.spec.js create mode 100644 test/e2e/integration/pages/storage/backup.spec.js create mode 100644 test/e2e/integration/pages/storage/qos.spec.js create mode 100644 test/e2e/integration/pages/storage/snapshot.spec.js create mode 100644 test/e2e/integration/pages/storage/storage.spec.js create mode 100644 test/e2e/integration/pages/storage/volume-type.spec.js create mode 100644 test/e2e/integration/pages/storage/volume.spec.js create mode 100644 test/e2e/plugins/index.js create mode 100644 test/e2e/support/commands.js create mode 100644 test/e2e/support/common.js create mode 100644 test/e2e/support/constants.js create mode 100644 test/e2e/support/detail-commands.js create mode 100644 test/e2e/support/form-commands.js create mode 100644 test/e2e/support/index.js create mode 100644 test/e2e/support/resource-commands.js create mode 100644 test/e2e/support/table-commands.js create mode 100644 test/e2e/utils/index.js create mode 100644 test/unit/local-storage-mock.js create mode 100644 test/unit/locales/en-US.js create mode 100644 test/unit/locales/zh-CN.js create mode 100644 test/unit/setup-tests.js create mode 100644 test/unit/svg-mock.js create mode 100644 tools/git_config/commit_message.txt create mode 100644 yarn.lock diff --git a/.babelrc b/.babelrc new file mode 100644 index 00000000..aa746c01 --- /dev/null +++ b/.babelrc @@ -0,0 +1,66 @@ +{ + "presets": [ + [ + "@babel/preset-env", + { + "targets": { + "esmodules": true + } + } + ], + "@babel/preset-react" + ], + "plugins": [ + [ + "@babel/plugin-transform-runtime", + { + "corejs": { + "version": 3, + "proposals": true + } + } + ], + "@babel/plugin-transform-modules-commonjs", + [ + "@babel/plugin-proposal-decorators", + { + "legacy": true + } + ], + "@babel/plugin-proposal-class-properties", + "@babel/plugin-proposal-throw-expressions", + "@babel/plugin-syntax-dynamic-import", + "@babel/plugin-syntax-import-meta", + "react-hot-loader/babel", + [ + "import", + { + "libraryName": "antd", + "libraryDirectory": "lib", + "style": true + }, + "antd" + ], + [ + "import", + { + "libraryName": "@ant-design/icons", + "libraryDirectory": "lib/icons", + "camel2DashComponentName": false + }, + "@ant-design/icons" + ] + ], + "env": { + "test": { + "plugins": [ + [ + "istanbul", + { + "useInlineSourceMaps": false + } + ] + ] + } + } +} diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..79187b2d --- /dev/null +++ b/.dockerignore @@ -0,0 +1,13 @@ +npm-debug.log +yarn-error.log +node_modules +package-lock.json + +.git/ +.idea/ +.vscode/ +run/ + +.DS_Store +*.sw* +*.un~ \ No newline at end of file diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 00000000..8e5bb916 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,4 @@ +dist +node_modules +coverage +test/e2e/report \ No newline at end of file diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 00000000..77090a30 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,77 @@ +{ + "extends": ["airbnb", "plugin:prettier/recommended"], + "parser": "babel-eslint", + "plugins": ["cypress"], + "parserOptions": { + "sourceType": "module", + "ecmaFeatures": { + "jsx": true, + "modules": true, + "legacyDecorators": true + } + }, + "env": { + "es6": true, + "commonjs": true, + "browser": true, + "jest": true, + "cypress/globals": true + }, + "settings": { + "import/resolver": { + "alias": { + "map": [ + ["@", "./src"], + ["src", "./src"], + ["image", "./src/asset/image"], + ["components", "./src/components"], + ["utils", "./src/utils"], + ["stores", "./src/stores"], + ["pages", "./src/pages"], + ["containers", "./src/containers"], + ["layouts", "./src/layouts"], + ["client", "./src/client"], + ["resources", "./src/resources"], + ["core", "./src/core"] + ], + "extensions": [".js", ".jsx"] + } + } + }, + "rules": { + "camelcase": "warn", + "react/prop-types": "warn", + "class-methods-use-this": "off", + "react/prefer-stateless-function": "warn", + "no-plusplus": "warn", + "no-param-reassign": "warn", + "react/jsx-props-no-spreading": "warn", + "react/static-property-placement": "warn", + "prefer-destructuring": "warn", + "no-use-before-define": "warn", + "react/forbid-prop-types": "warn", + "react/no-array-index-key": "warn", + "react/require-default-props": "warn", + "consistent-return": "warn", + "no-underscore-dangle": "warn", + "no-unused-expressions": "warn", + "import/no-cycle": "warn", + "no-empty": [ + 2, + { + "allowEmptyCatch": true + } + ], + "react/destructuring-assignment": "warn", + "jsx-a11y/click-events-have-key-events": "warn", + "jsx-a11y/no-static-element-interactions": "warn", + "import/no-extraneous-dependencies": "warn", + "import/prefer-default-export": "warn", + "no-nested-ternary": "warn", + }, + "globals": { + "t": true, + "globals": true, + "request": true + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..b56c835d --- /dev/null +++ b/.gitignore @@ -0,0 +1,29 @@ +/node_modules/ +/dist +.DS_Store +yarn-error.log +package-lock.json +docs/ +.vscode +test/e2e/videos +test/e2e/screenshots +test/e2e/downloads +.nyc_output +coverage +test/e2e/results +test/e2e/report +*.qcow2 + +# config +test/e2e/config/local_config.yaml + +# Python +__pycache__/ +*.py[cod] +*$py.class +.env +.venv +env/ +venv/ +ENV/ +/skyline_console/static diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..007ea8a7 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,3 @@ +dist +node_modules +coverage diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..c3e03287 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,5 @@ +{ + "semi": true, + "singleQuote": true, + "trailingComma": "es5" +} diff --git a/Gruntfile.js b/Gruntfile.js new file mode 100644 index 00000000..2aed5cbd --- /dev/null +++ b/Gruntfile.js @@ -0,0 +1,57 @@ +// Copyright 2021 99cloud +// +// 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. + +module.exports = function (grunt) { + grunt.initConfig({ + i18next: { + dev: { + src: ['src/**/*.{jsx,js}'], + dest: 'src', + options: { + lngs: ['en', 'zh'], + removeUnusedKeys: true, + sort: true, + keySeparator: false, + nsSeparator: false, + interpolation: { + prefix: '{{', + suffix: '}}', + }, + resource: { + // loadPath: 'src/locales/{{lng}}/{{ns}}.json', + loadPath: 'src/locales/{{lng}}.json', + // savePath: 'locales/{{lng}}/{{ns}}.json' + savePath: 'locales/{{lng}}.json', + }, + func: { + list: ['t', 't.html'], + extensions: ['.js', '.jsx'], + }, + defaultValue: (lng, ns, key) => { + if (lng === 'zh') { + return ''; + } + return key; + }, + }, + }, + }, + }); + + // Load the plugin that provides the "i18next" task. + grunt.loadNpmTasks('i18next-scanner'); + + // Default task(s). + grunt.registerTask('default', ['i18next']); +}; diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..f433b1a5 --- /dev/null +++ b/LICENSE @@ -0,0 +1,177 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..754c9e71 --- /dev/null +++ b/Makefile @@ -0,0 +1,83 @@ +SOURCES := src +ROOT_DIR ?= $(shell git rev-parse --show-toplevel) + +# Color +no_color = \033[0m +black = \033[0;30m +red = \033[0;31m +green = \033[0;32m +yellow = \033[0;33m +blue = \033[0;34m +purple = \033[0;35m +cyan = \033[0;36m +white = \033[0;37m + +# Params +MODE ?= prod +BUILD_ENGINE ?= docker + +# Version +RELEASE_VERSION ?= $(shell git rev-parse --short HEAD)_$(shell date -u +%Y-%m-%dT%H:%M:%S%z) +GIT_BRANCH ?= $(shell git rev-parse --abbrev-ref HEAD) +GIT_COMMIT ?= $(shell git rev-parse --verify HEAD) + + +.PHONY: help +help: + @echo "Skyline console development makefile" + @echo + @echo "Usage: make " + @echo + @echo "Target:" + @echo " git_config Initialize git configuration." + @echo " install Installs the project dependencies." + @echo " build Build source and wheel packages." + @echo " lint Check JavaScript code." + @echo " test Run unit tests." + @echo + + +.PHONY: git_config +user_name = $(shell git config --get user.name) +user_email = $(shell git config --get user.email) +commit_template = $(shell git config --get commit.template) +git_config: +ifeq ($(user_name),) + @printf "$(cyan)\n" + @read -p "Set your git user name: " user_name; \ + git config --local user.name $$user_name; \ + printf "$(green)User name was set.\n$(cyan)" +endif +ifeq ($(user_email),) + @printf "$(cyan)\n" + @read -p "Set your git email address: " user_email; \ + git config --local user.email $$user_email; \ + printf "$(green)User email address was set.\n$(no_color)" +endif +ifeq ($(commit_template),) + @git config --local commit.template $(ROOT_DIR)/tools/git_config/commit_message.txt +endif + @printf "$(green)Project git config was successfully set.\n$(no_color)" + @printf "${yellow}You may need to run 'pip install git-review' install git review tools.\n\n${no_color}" + + +.PHONY: install +install: + yarn install + + +.PHONY: build +build: + rm -rf $(ROOT_DIR)/skyline_console/static + yarn run build + poetry build + + +.PHONY: lint +lint: + yarn run lint + + +.PHONY: test +test: + yarn run test:unit diff --git a/README.md b/README.md new file mode 100644 index 00000000..b2fc48e3 --- /dev/null +++ b/README.md @@ -0,0 +1,63 @@ +# 使用说明 + +简体中文 | [English](./en.md) + +## 环境依赖 + +- `node`: lts/erbium (v12.\*) +- `yarn`: 1.22.4 + + +## 本地环境搭建 + +以 CentOS 为例 + +- 安装 nvm (nodejs 版本管理工具) + + ```shell + wget -P /root/ --tries=10 --retry-connrefused --waitretry=60 --no-dns-cache --no-cache https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh + bash /root/install.sh + . /root/.nvm/nvm.sh + ``` + +- 安装 nodejs + + ```shell + NODE_VERSION=erbium + nvm install --lts=$NODE_VERSION + nvm alias default lts/$NODE_VERSION + nvm use default + ``` + +- 验证 nodejs 和 npm 版本 + + ```shell + node -v + # v12.*.* + npm -v + # 6.*.* + ``` + +- 安装 yarn + + ```shell + npm install -g yarn + ``` + +- 安装项目依赖 + + 在项目根目录下,`package.json`同级。 + + ```shell + yarn install + ``` + + 等待安装完成即可。 + +## 开发使用方法 + +在项目根目录下,`package.json`同级。 + +- `yarn run mock`: 使用[rap2](http://rap2.taobao.org/)工具 mock 接口 +- `yarn run dev`: 使用实际接口,需要将`webpack.dev.js`文件第 27 行的 "http://pre.xxx.com" + 修改为实际地址 +- `yarn run build`: 构建打包,可将生成的 dist 目录的内容交给后端 diff --git a/config/theme.js b/config/theme.js new file mode 100644 index 00000000..3360e387 --- /dev/null +++ b/config/theme.js @@ -0,0 +1,27 @@ +// Copyright 2021 99cloud +// +// 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. + +module.exports = { + 'primary-color': '#0068FF', + 'link-color': '#0068FF', + // 'link-hover-color': '#005ADE', + // 'link-active-color': '005ADE', + 'success-color': '#57E39B', + 'warning-color': '#979797', + 'error-color': '#EB354D', + 'btn-default-color': '#0068FF', + 'btn-default-border': '#0068FF', + 'border-radius-base': '4px', + 'font-size-base': '12px', +}; diff --git a/config/webpack.common.js b/config/webpack.common.js new file mode 100644 index 00000000..ce1e68ab --- /dev/null +++ b/config/webpack.common.js @@ -0,0 +1,142 @@ +// Copyright 2021 99cloud +// +// 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. + +const webpack = require('webpack'); +const { normalize, resolve } = require('path'); +// const path = require("path"); +// const CleanWebpackPlugin = require('clean-webpack-plugin'); +const HappyPack = require('happypack'); +const os = require('os'); +const moment = require('moment'); + +const root = (path) => resolve(__dirname, `../${path}`); +const version = moment().unix(); + +module.exports = { + module: { + rules: [ + { + test: /\.jsx?$/, + include: [root('src'), root('common')], + use: 'happypack/loader?id=jsx', + }, + { + test: /\.jsx?$/, + include: root('node_modules'), + use: 'cache-loader', + }, + { + test: /\.js$/, + exclude: /node_modules/, + use: { + loader: 'babel-loader', + }, + }, + { + test: /\.(png|gif|jpg)$/, + use: [ + { + loader: 'url-loader', + options: { + limit: 10240, + name: normalize(`asset/image/[name].${version}.[ext]`), + }, + }, + ], + exclude: [ + root('src/asset/image/logo.png'), + root('src/asset/image/loginRightLogo.png'), + ], + }, + { + test: /\.(png|gif|jpg)$/, + use: [ + { + loader: 'url-loader', + options: { + limit: false, + name: normalize('asset/image/[name].[ext]'), + }, + }, + ], + include: [ + root('src/asset/image/logo.png'), + root('src/asset/image/loginRightLogo.png'), + ], + }, + { + test: /\.svg$/, + use: [ + { + loader: 'url-loader', + options: { + limit: false, + name: normalize('asset/image/[name].[ext]'), + }, + }, + ], + include: [ + root('src/asset/image/logo-small.svg'), + root('src/asset/image/logo-extend.svg'), + ], + }, + { + test: /\.(woff|woff2|ttf|eot|svg)$/, + use: [ + { + loader: 'url-loader', + options: { + limit: 10240, + name: normalize(`asset/image/[name].${version}.[ext]`), + }, + }, + ], + exclude: [ + root('src/asset/image/logo-small.svg'), + root('src/asset/image/logo-extend.svg'), + ], + }, + ], + }, + resolve: { + extensions: ['.js', '.jsx'], + modules: [root('src'), root('src/pages'), 'node_modules'], + alias: { + '@': root('src'), + src: root('src'), + asset: root('src/asset'), + image: root('src/asset/image'), + core: root('src/core'), + containers: root('src/containers'), + layouts: root('src/layouts'), + components: root('src/components'), + pages: root('src/pages'), + utils: root('src/utils'), + stores: root('src/stores'), + locales: root('src/locales'), + styles: root('src/styles'), + resources: root('src/resources'), + }, + }, + plugins: [ + new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/), + new HappyPack({ + threads: os.cpus().length - 1, + id: 'jsx', + loaders: ['babel-loader?cacheDirectory'], + }), + ], +}; + +module.exports.version = version; diff --git a/config/webpack.dev.js b/config/webpack.dev.js new file mode 100644 index 00000000..01e0e2b3 --- /dev/null +++ b/config/webpack.dev.js @@ -0,0 +1,150 @@ +// Copyright 2021 99cloud +// +// 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. + +const { resolve } = require('path'); +const webpack = require('webpack'); +const merge = require('webpack-merge'); +const HtmlWebPackPlugin = require('html-webpack-plugin'); +const autoprefixer = require('autoprefixer'); +const common = require('./webpack.common'); +const theme = require('./theme'); +// const OpenBrowserPlugin = require('open-browser-webpack-plugin'); + +const root = (path) => resolve(__dirname, `../${path}`); + +module.exports = (env) => { + const API = (env || {}).API || 'mock'; + + console.log('API %s', API); + + const devServer = { + host: '0.0.0.0', + // host: 'localhost', + port: 8088, + contentBase: root('dist'), + historyApiFallback: true, + compress: true, + hot: true, + inline: true, + disableHostCheck: true, + // progress: true + }; + + if (API === 'mock' || API === 'dev') { + devServer.proxy = { + '/api': { + target: 'http://localhost', + changeOrigin: true, + secure: false, + }, + }; + } + + const { version, ...restConfig } = common; + + return merge(restConfig, { + entry: { + main: root('src/core/index.jsx'), + }, + output: { + filename: '[name].js', + path: root('dist'), + publicPath: '/', + }, + mode: 'development', + devtool: 'inline-source-map', + devServer, + module: { + rules: [ + { + test: /\.css$/, + use: [ + { + loader: 'style-loader', + }, + { + loader: 'css-loader', + }, + ], + }, + { + test: /\.(css|less)$/, + exclude: /node_modules/, + use: [ + { + loader: 'style-loader', // creates style nodes from JS strings + }, + { + loader: 'css-loader', // translates CSS into CommonJS + options: { + modules: { + mode: 'global', + }, + localIdentName: '[name]__[local]--[hash:base64:5]', + }, + }, + { + loader: 'postcss-loader', + options: { + plugins: [autoprefixer('last 2 version')], + sourceMap: true, + }, + }, + { + loader: 'less-loader', // compiles Less to CSS + options: { + importLoaders: true, + javascriptEnabled: true, + }, + }, + ], + }, + { + test: /\.(less)$/, + include: /node_modules/, + use: [ + { + loader: 'style-loader', // creates style nodes from JS strings + }, + { + loader: 'css-loader', // translates CSS into CommonJS + }, + { + loader: 'less-loader', // compiles Less to CSS + options: { + javascriptEnabled: true, + modifyVars: theme, + }, + }, + ], + }, + ], + }, + plugins: [ + new webpack.HotModuleReplacementPlugin(), + // new OpenBrowserPlugin({ + // url: 'http://localhost:8080', + // browser: "Google Chrome", + // }), + new webpack.DefinePlugin({ + // 为项目注入环境变量 + 'process.env.API': JSON.stringify(API), + }), + new HtmlWebPackPlugin({ + template: root('src/asset/template/index.html'), + favicon: root('src/asset/image/favicon.ico'), + }), + ], + }); +}; diff --git a/config/webpack.e2e.js b/config/webpack.e2e.js new file mode 100644 index 00000000..0dfeed4e --- /dev/null +++ b/config/webpack.e2e.js @@ -0,0 +1,175 @@ +// Copyright 2021 99cloud +// +// 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. + +const { resolve } = require('path'); +const webpack = require('webpack'); +const merge = require('webpack-merge'); +const HtmlWebPackPlugin = require('html-webpack-plugin'); +// const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; +const autoprefixer = require('autoprefixer'); +const CleanWebpackPlugin = require('clean-webpack-plugin'); +const TerserPlugin = require('terser-webpack-plugin'); +const common = require('./webpack.common'); +const theme = require('./theme'); + +const root = (path) => resolve(__dirname, `../${path}`); + +const { version, ...restConfig } = common; + +module.exports = (env) => { + const API = (env || {}).API || 'mock'; + + // const devServer = { + // // host: '0.0.0.0', + // host: 'localhost', + // port: 8088, + // contentBase: root('dist'), + // historyApiFallback: true, + // compress: true, + // hot: false, + // inline: false, + // disableHostCheck: true, + // // progress: true + // }; + + return merge(restConfig, { + entry: { + main: root('src/core/index.jsx'), + }, + output: { + filename: '[name].js', + path: root('dist'), + publicPath: '/', + chunkFilename: `[name].bundle.${version}.js`, + }, + mode: 'production', + // devtool: 'inline-source-map', + // devServer: devServer, + module: { + rules: [ + { + test: /\.css$/, + use: [ + { + loader: 'style-loader', + }, + { + loader: 'css-loader', + }, + ], + }, + { + test: /\.(css|less)$/, + exclude: /node_modules/, + use: [ + { + loader: 'style-loader', // creates style nodes from JS strings + }, + { + loader: 'css-loader', // translates CSS into CommonJS + options: { + modules: { + mode: 'global', + }, + localIdentName: '[name]__[local]--[hash:base64:5]', + }, + }, + { + loader: 'postcss-loader', + options: { + plugins: [autoprefixer('last 2 version')], + sourceMap: false, + }, + }, + { + loader: 'less-loader', // compiles Less to CSS + options: { + importLoaders: true, + javascriptEnabled: true, + }, + }, + ], + }, + { + test: /\.(less)$/, + include: /node_modules/, + use: [ + { + loader: 'style-loader', // creates style nodes from JS strings + }, + { + loader: 'css-loader', // translates CSS into CommonJS + }, + { + loader: 'less-loader', // compiles Less to CSS + options: { + javascriptEnabled: true, + modifyVars: theme, + }, + }, + ], + }, + ], + }, + plugins: [ + new webpack.DefinePlugin({ + // 为项目注入环境变量 + 'process.env.API': JSON.stringify(API), + }), + new HtmlWebPackPlugin({ + template: root('src/asset/template/index.html'), + favicon: root('src/asset/image/favicon.ico'), + }), + new CleanWebpackPlugin(['dist'], { + root: resolve(__dirname, `../`), + }), + // new BundleAnalyzerPlugin(), + ], + optimization: { + splitChunks: { + maxInitialRequests: 10, + cacheGroups: { + commons: { + chunks: 'all', + name: 'common', + minChunks: 1, + minSize: 0, + }, + vendor: { + test: /node_modules/, + chunks: 'all', + name: 'vendor', + minChunks: 1, + priority: 10, + enforce: true, + }, + }, + }, + runtimeChunk: { + name: () => `runtime.${version}`, + }, + minimize: true, // default true for production + minimizer: [ + new TerserPlugin({ + sourceMap: false, + terserOptions: { + compress: { + drop_console: true, + }, + }, + }), + ], + }, + }); +}; diff --git a/config/webpack.prod.js b/config/webpack.prod.js new file mode 100644 index 00000000..669df036 --- /dev/null +++ b/config/webpack.prod.js @@ -0,0 +1,174 @@ +// Copyright 2021 99cloud +// +// 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. + +const { resolve } = require('path'); +const webpack = require('webpack'); +const merge = require('webpack-merge'); +const HtmlWebPackPlugin = require('html-webpack-plugin'); +// const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; +const autoprefixer = require('autoprefixer'); +const CleanWebpackPlugin = require('clean-webpack-plugin'); +const TerserPlugin = require('terser-webpack-plugin'); +const CompressionWebpackPlugin = require('compression-webpack-plugin'); +const common = require('./webpack.common'); +const theme = require('./theme'); + +const root = (path) => resolve(__dirname, `../${path}`); + +const { version, ...restConfig } = common; + +module.exports = (env) => { + const API = (env || {}).API || 'mock'; + + return merge(restConfig, { + entry: { + main: root('src/core/index.jsx'), + }, + output: { + filename: '[name].js', + path: root('skyline_console/static'), + publicPath: '/', + chunkFilename: `[name].bundle.${version}.js`, + }, + mode: 'production', + // devtool: 'inline-source-map', + module: { + rules: [ + { + test: /\.css$/, + use: [ + { + loader: 'style-loader', + }, + { + loader: 'css-loader', + }, + ], + }, + { + test: /\.(css|less)$/, + exclude: /node_modules/, + use: [ + { + loader: 'style-loader', // creates style nodes from JS strings + }, + { + loader: 'css-loader', // translates CSS into CommonJS + options: { + modules: { + mode: 'global', + }, + localIdentName: '[name]__[local]--[hash:base64:5]', + }, + }, + { + loader: 'postcss-loader', + options: { + plugins: [autoprefixer('last 2 version')], + sourceMap: false, + }, + }, + { + loader: 'less-loader', // compiles Less to CSS + options: { + importLoaders: true, + javascriptEnabled: true, + }, + }, + ], + }, + { + test: /\.(less)$/, + include: /node_modules/, + use: [ + { + loader: 'style-loader', // creates style nodes from JS strings + }, + { + loader: 'css-loader', // translates CSS into CommonJS + }, + { + loader: 'less-loader', // compiles Less to CSS + options: { + javascriptEnabled: true, + modifyVars: theme, + }, + }, + ], + }, + ], + }, + plugins: [ + // 热更新没必要。 + // new webpack.HotModuleReplacementPlugin(), + // new OpenBrowserPlugin({ + // url: 'http://localhost:8080', + // browser: "Google Chrome", + // }), + new webpack.DefinePlugin({ + // 为项目注入环境变量 + 'process.env.API': JSON.stringify(API), + }), + new HtmlWebPackPlugin({ + template: root('src/asset/template/index.html'), + favicon: root('src/asset/image/favicon.ico'), + }), + new CleanWebpackPlugin(['dist'], { + root: resolve(__dirname, `../`), + }), + new CompressionWebpackPlugin({ + algorithm: 'gzip', + test: /\.js$/, + threshold: 10240, + minRatio: 0.8, + }), + // new BundleAnalyzerPlugin(), + ], + optimization: { + splitChunks: { + maxInitialRequests: 10, + cacheGroups: { + commons: { + chunks: 'async', + name: 'common', + minChunks: 2, + minSize: 0, + }, + vendor: { + test: /node_modules/, + chunks: 'async', + name: 'vendor', + priority: 10, + enforce: true, + }, + }, + }, + runtimeChunk: { + name: () => `runtime.${version}`, + }, + minimize: true, // default true for production + minimizer: [ + new TerserPlugin({ + extractComments: false, + sourceMap: false, + terserOptions: { + compress: { + drop_console: true, + }, + }, + }), + ], + }, + }); +}; diff --git a/cypress.json b/cypress.json new file mode 100644 index 00000000..65de70e5 --- /dev/null +++ b/cypress.json @@ -0,0 +1,28 @@ +{ + "baseUrl": "http://localhost:8081", + "viewportWidth": 1600, + "viewportHeight": 900, + "video": false, + "env": { + "username": "administrator", + "password": "passw0rd", + "region": "RegionOne", + "domain": "Default", + "sessionKey": "X-Auth-Token", + "language": "en" + }, + "reporter": "mochawesome", + "reporterOptions": { + "reportDir": "test/e2e/results", + "overwrite": false, + "html": false, + "json": true + }, + "fixturesFolder": "test/e2e/fixtures", + "integrationFolder": "test/e2e/integration", + "pluginsFile": "test/e2e/plugins/index.js", + "screenshotsFolder": "test/e2e/screenshots", + "videosFolder": "test/e2e/videos", + "supportFile": "test/e2e/support/index.js", + "downloadsFolder": "test/e2e/downloads" +} diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 00000000..1ad15170 --- /dev/null +++ b/jest.config.js @@ -0,0 +1,36 @@ +// Copyright 2021 99cloud +// +// 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. + +module.exports = { + bail: true, + transformIgnorePatterns: ['/node_modules/'], + transform: { + '^.+\\.(js|jsx)$': 'babel-jest', + }, + moduleNameMapper: { + '.+\\.(css|styl|less|sass|scss)$': 'identity-obj-proxy', + '\\.svg': '/test/unit/svg-mock.js', + '^@/(.*)$': '/src/$1', + '^src(.*)$': '/src$1', + '^components(.*)$': '/src/components$1', + '^layouts(.*)$': '/src/layouts$1', + '^stores(.*)$': '/src/stores$1', + '^utils(.*)$': '/src/utils$1', + '^pages(.*)$': '/src/pages$1', + }, + moduleFileExtensions: ['js', 'jsx', 'ts', 'tsx'], + moduleDirectories: ['node_modules', 'src'], + testPathIgnorePatterns: ['node_modules', '.cache', 'test/e2e', 'config'], + setupFiles: ['/test/unit/setup-tests.js'], +}; diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 00000000..827a2714 --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "jsx": "react", + "baseUrl": ".", + "experimentalDecorators": true, + "paths": { + "@/*": ["./src/*"], + "src/*": ["./src/*"], + "asset/*": ["./src/asset/*"], + "image/*": ["./src/asset/image/*"], + "core/*": ["./src/core/*"], + "containers/*": ["./src/containers/*"], + "layouts/*": ["./src/layouts/*"], + "components/*": ["./src/components/*"], + "pages/*": ["./src/pages/*"], + "utils/*": ["./src/utils/*"], + "stores/*": ["./src/stores/*"], + "locales/*": ["./src/locales/*"], + "styles/*": ["./src/styles/*"], + "resources/*": ["./src/resources/*"] + } + }, + "include": ["src/**/*"] +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..919f5901 --- /dev/null +++ b/package.json @@ -0,0 +1,156 @@ +{ + "name": "skyline-console", + "version": "0.1.0", + "description": "", + "author": "OpenStack ", + "license": "Apache 2.0", + "scripts": { + "mock": "webpack-dev-server --open --config config/webpack.dev.js", + "dev": "cross-env NODE_ENV=development webpack-dev-server --open --config config/webpack.dev.js --env.API=dev", + "build": "cross-env NODE_ENV=production NODE_OPTIONS=--max-old-space-size=2048 webpack --progress --config config/webpack.prod.js", + "build:win": "set NODE_OPTIONS=--max-old-space-size=2048 && webpack --progress --config config/webpack.prod.js", + "build:test": "cross-env NODE_ENV=test NODE_OPTIONS=--max-old-space-size=2048 webpack --progress --config config/webpack.e2e.js", + "i18n": "grunt", + "lint": "eslint src --fix --quiet --ext .js,.jsx", + "lint:test": "eslint test --fix --quiet --ext .js", + "report:delete-json": "rm -rf test/e2e/results/* || true", + "report:delete-html": "rm -rf test/e2e/report || true", + "report:pre": "npm run report:delete-json && npm run report:delete-html && mkdir test/e2e/report", + "report:merge": "npx mochawesome-merge test/e2e/results/*.json > test/e2e/report/merge-report.json", + "report:generate": "npm run report:merge && npx mochawesome-report-generator test/e2e/report/merge-report.json -o test/e2e/report", + "test:e2e:run": "npm run report:pre && cypress run || true", + "test:e2e": "npm run test:e2e:run && npm run report:generate", + "test:e2e:open": "cypress open", + "test:e2e:server": "cross-env NODE_ENV=test webpack-dev-server --open --progress --config config/webpack.e2e.js", + "test:unit": "cross-env NODE_ENV=development jest", + "test:unit:coverage": "cross-env NODE_ENV=development jest --coverage" + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + }, + "lint-staged": { + "*.{js,jsx}": [ + "eslint --fix", + "git add" + ], + "*.{html,css,scss,md,json}": [ + "prettier --write", + "git add" + ] + }, + "dependencies": { + "@ant-design/icons": "^4.0.6", + "@antv/data-set": "^0.11.4", + "@antv/g6": "^3.5.10", + "@babel/runtime-corejs3": "^7.14.0", + "ace-builds": "^1.4.12", + "antd": "^4.1.3", + "array-move": "3.0.1", + "axios": "^0.21.1", + "bizcharts": "^4.0.6", + "cache-loader": "^4.1.0", + "cidr-regex": "^3.1.1", + "classnames": "^2.2.6", + "cookie": "^0.4.1", + "escape-html": "^1.0.3", + "eslint-plugin-babel": "^5.3.1", + "file-saver": "^2.0.2", + "history": "4.7.2", + "intersection-observer": "^0.11.0", + "intl-messageformat": "7.8.4", + "invariant": "^2.2.4", + "ip-address": "^7.1.0", + "js-yaml": "^4.0.0", + "json2csv": "^5.0.1", + "lodash": "^4.17.19", + "mobx": "^5.1.0", + "mobx-react": "^5.2.8", + "mobx-react-router": "^4.1.0", + "moment": "^2.24.0", + "nanoid": "^3.0.2", + "promise-polyfill": "^8.1.3", + "prop-types": "^15.7.2", + "qs": "^6.9.4", + "react": "^16.2.0", + "react-ace": "^9.2.0", + "react-document-title": "^2.0.3", + "react-dom": "^16.2.0", + "react-fast-compare": "^3.0.1", + "react-highcharts": "^16.0.2", + "react-router": "^4.3.1", + "react-router-dom": "^4.3.1", + "react-sortable-hoc": "1.11.0" + }, + "devDependencies": { + "@babel/core": "^7.14.3", + "@babel/plugin-proposal-class-properties": "^7.13.0", + "@babel/plugin-proposal-decorators": "^7.14.2", + "@babel/plugin-proposal-throw-expressions": "^7.12.13", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-transform-modules-commonjs": "^7.14.0", + "@babel/plugin-transform-runtime": "^7.14.3", + "@babel/preset-env": "^7.14.2", + "@babel/preset-react": "^7.13.13", + "@cypress/code-coverage": "^3.9.5", + "autoprefixer": "^9.3.1", + "babel-eslint": "^9.0.0", + "babel-jest": "^26.6.3", + "babel-loader": "^8.1.0", + "babel-plugin-import": "^1.8.0", + "babel-plugin-istanbul": "^6.0.0", + "babel-plugin-react-css-modules": "^3.4.2", + "clean-webpack-plugin": "^1.0.0", + "compression-webpack-plugin": "5.0.1", + "cross-env": "^7.0.3", + "css-loader": "^0.28.11", + "cypress": "6.8.0", + "cypress-file-upload": "^5.0.6", + "enzyme": "^3.11.0", + "enzyme-adapter-react-16": "^1.15.6", + "eslint": "^7.2.0", + "eslint-config-airbnb": "18.2.1", + "eslint-config-prettier": "^8.3.0", + "eslint-import-resolver-alias": "^1.1.2", + "eslint-plugin-cypress": "^2.11.2", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-jsx-a11y": "^6.4.1", + "eslint-plugin-prettier": "^3.4.0", + "eslint-plugin-react": "^7.23.2", + "eslint-plugin-react-hooks": "^1.7.0", + "file-loader": "^6.0.0", + "grunt": "^1.2.1", + "happypack": "^5.0.1", + "html-webpack-plugin": "^3.1.0", + "husky": "^1.0.0-rc.14", + "i18next-scanner": "2.9.2", + "identity-obj-proxy": "^3.0.0", + "istanbul-lib-coverage": "^3.0.0", + "jest": "^26.6.3", + "jest-enzyme": "^7.1.2", + "less": "^3.8.1", + "less-loader": "^4.1.0", + "lint-staged": "^11.0.0", + "mochawesome": "^6.2.2", + "mochawesome-merge": "^4.2.0", + "mochawesome-report-generator": "^5.2.0", + "postcss-less": "^2.0.0", + "postcss-loader": "^3.0.0", + "prettier": "^2.3.0", + "react-css-modules": "^4.7.7", + "react-hot-loader": "^4.12.20", + "style-loader": "^0.20.3", + "terser-webpack-plugin": "4.2.3", + "url-loader": "^4.1.1", + "webpack": "^4.42.1", + "webpack-cli": "3.3.0", + "webpack-dev-server": "^3.1.10", + "webpack-merge": "^4.1.4" + }, + "engines": { + "node": ">=10.22.0", + "yarn": ">=1.22.4" + } +} diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 00000000..d9af7385 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,8 @@ +package = [] + +[metadata] +lock-version = "1.1" +python-versions = "*" +content-hash = "115cf985d932e9bf5f540555bbdd75decbb62cac81e399375fc19f6277f8c1d8" + +[metadata.files] diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..abf912c2 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,10 @@ +[tool.poetry] +name = "skyline-console" +version = "0.1.0" +description = "" +authors = ["OpenStack "] +include = ["skyline_console/static/**/*"] + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" diff --git a/skyline_console/__init__.py b/skyline_console/__init__.py new file mode 100644 index 00000000..3dc1f76b --- /dev/null +++ b/skyline_console/__init__.py @@ -0,0 +1 @@ +__version__ = "0.1.0" diff --git a/skyline_console/__main__.py b/skyline_console/__main__.py new file mode 100644 index 00000000..9bbb058c --- /dev/null +++ b/skyline_console/__main__.py @@ -0,0 +1,12 @@ +import sys +from pathlib import Path + +import skyline_console + +static_path = Path(skyline_console.__file__).parent.joinpath("static") + +if static_path.joinpath("index.html").exists(): + print(f'Static resource directory of "skyline-console" is:\n{str(static_path)}') +else: + print('Error, "skyline-console" doesn\'t contain any static resources') + sys.exit(1) diff --git a/src/api/cinder/backup.js b/src/api/cinder/backup.js new file mode 100644 index 00000000..48acbce0 --- /dev/null +++ b/src/api/cinder/backup.js @@ -0,0 +1,47 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import cinderBase from './base'; + +/** + * Create a restore on backup + * @param {String} projectId The UUID of the project in a multi-tenancy cloud. + * @param {String} backupId The UUID of the backupchains. + * @param {Object} data request body + * @param {Object} data.restore The restore object. + * @returns {Promise} + */ +export const createBackupRestoreOnCinder = (projectId, backupId, data) => + axios.request({ + method: 'post', + url: cinderBase(`${projectId}/backups/${backupId}/restore`), + data, + }); + +/** + * Create a restore on backup chain + * @param {String} projectId The UUID of the project in a multi-tenancy cloud. + * @param {String} backupId The UUID of the backupchains. + * @param {Object} data request body + * @param {Object} data.restore The restore object. + * @returns {Promise} + */ +export const createBackupChainRestoreOnCinder = (projectId, backupId, data) => + axios.request({ + method: 'post', + url: cinderBase(`${projectId}/backup_chains/${backupId}/restore`), + data, + }); diff --git a/src/api/cinder/base.js b/src/api/cinder/base.js new file mode 100644 index 00000000..a232d23b --- /dev/null +++ b/src/api/cinder/base.js @@ -0,0 +1,23 @@ +// Copyright 2021 99cloud +// +// 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. + +/** + * @param {String} key api url + * @returns {String} + */ +import { cinderBase } from 'utils/constants'; + +const getCinderBaseUrl = (key) => `${cinderBase()}/${key}`; + +export default getCinderBaseUrl; diff --git a/src/api/cinder/os-availability-zone.js b/src/api/cinder/os-availability-zone.js new file mode 100644 index 00000000..58bc4e89 --- /dev/null +++ b/src/api/cinder/os-availability-zone.js @@ -0,0 +1,31 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import cinderBase from './base'; + +/** + * Show quota usage for a project + * @param {String} adminProjectId The UUID of the administrative project. + * @param {Object} params request query + * @param {Boolean} params.usage Default : false + * @returns {Promise} + */ +export const fetchAvailabilityZoneOnProject = (adminProjectId, params) => + axios.request({ + method: 'get', + url: cinderBase(`${adminProjectId}/os-availability-zone`), + params, + }); diff --git a/src/api/cinder/os-quota-sets.js b/src/api/cinder/os-quota-sets.js new file mode 100644 index 00000000..4aabd324 --- /dev/null +++ b/src/api/cinder/os-quota-sets.js @@ -0,0 +1,52 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import cinderBase from './base'; + +/** + * Show quota usage for a project + * @param {String} adminProjectId The UUID of the administrative project. + * @param {String} projectId The UUID of the project in a multi-tenancy cloud. + * @param {Object} params request query + * @param {Boolean} params.usage Default : false + * @returns {Promise} + */ +export const fetchQuotaUsageOnProject = (adminProjectId, projectId, params) => + axios.request({ + method: 'get', + url: cinderBase(`${adminProjectId}/os-quota-sets/${projectId}`), + params, + }); + +/** + * Update quotas for a project + * @param {String} adminProjectId The UUID of the tenant in a multi-tenancy cloud. + * @param {String} projectId The UUID of the project in a multi-tenancy cloud. + * @param {Object} data request body + * @param {Object} data.quota_set A quota object. + * @param {String} data.quota_set.volumes The number of volumes that are allowed for each project. + * @param {Number} data.quota_set.gigabytes The size (GB) of volumes and snapshots that are allowed for each project. + * @param {Number} data.quota_set.backup_gigabytes The size (GB) of backups that are allowed for each project. + * @param {Number} data.quota_set.snapshots The number of snapshots that are allowed for each project. + * @param {Number} data.quota_set.backups The number of backups that are allowed for each project. + * @returns {Promise} + */ +export const updateCinderQuotaSets = (adminProjectId, projectId, data) => + axios.request({ + method: 'put', + url: cinderBase(`${adminProjectId}/os-quota-sets/${projectId}`), + data, + }); diff --git a/src/api/cinder/os-services.js b/src/api/cinder/os-services.js new file mode 100644 index 00000000..bf1f3a16 --- /dev/null +++ b/src/api/cinder/os-services.js @@ -0,0 +1,54 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import cinderBase from './base'; + +/** + * Cinder Service change + * @param {String} projectId The UUID of the project in a multi-tenancy cloud. + * @param {String} actionName Actions name Avaliable Values : disable,disable-log-reason,enable,get-log,set-log,freeze,thaw,failover_host + * @param {Object} data request body + * @param {String} data.host The name of the host, when actionName is disable + * @param {String} data.binary The binary name of the service, when actionName is disable + * @param {String} data.disabled_reason The reason for disabling a service. + * @param {String} data.server The name of the host. + * @param {String} data.prefix The prefix for the log path we are querying, for example cinder. or sqlalchemy.engine + * @param {String} data.levels The log level to set, case insensitive, accepted values are INFO, WARNING, ERROR and DEBUG. + * @param {String} data.backend_id ID of backend to failover to. Default is None. + * @param {String} data.cluster The cluster name. Only in cinder-volume service.New in version 3.7 + * @returns {Promise} + */ +export const toggleChangeCinderOsService = (projectId, actionName, data) => + axios.request({ + method: 'put', + url: cinderBase(`${projectId}/os-services/${actionName}`), + data, + }); + +/** + * List All Cinder Services + * @param {String} projectId The UUID of the project in a multi-tenancy cloud. + * @param {Object} params request query + * @param {String} params.binary Filter the service list result by binary name of the service. + * @param {String} params.host Filter the service list result by host name of the service. + * @returns {Promise} + */ +export const fetchListCinderServices = (projectId, params) => + axios.request({ + method: 'get', + url: cinderBase(`${projectId}/os-services`), + params, + }); diff --git a/src/api/cinder/qos-specs.js b/src/api/cinder/qos-specs.js new file mode 100644 index 00000000..78aff00c --- /dev/null +++ b/src/api/cinder/qos-specs.js @@ -0,0 +1,106 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import cinderBase from './base'; + +/** + * Create a QoS specification + * @param {String} projectId The UUID of the project in a multi-tenancy cloud. + * @param {Object} data request body + * @param {Object} data.qos_specs A qos_specs object. + * @param {String} data.qos_specs.name The name of the QoS specification. + * @returns {Promise} + */ +export const createQosSpecOnCinder = (projectId, data) => + axios.request({ + method: 'post', + url: cinderBase(`${projectId}/qos-specs`), + data, + }); + +/** + * Set keys in a QoS specification + * @param {String} projectId The UUID of the project in a multi-tenancy cloud. + * @param {String} qosId The ID of the QoS specification. + * @param {Object} data request body + * @param {Object} data.qos_specs A qos_specs object. + * @returns {Promise} + */ +export const updateQosSpecOnCinder = (projectId, qosId, data) => + axios.request({ + method: 'put', + url: cinderBase(`${projectId}/qos-specs/${qosId}`), + data, + }); + +/** + * Unset keys in a QoS specification + * @param {String} projectId The UUID of the project in a multi-tenancy cloud. + * @param {String} qosId The ID of the QoS specification. + * @param {Object} data request body + * @param {Array} data.keys List of Keys. + * @returns {Promise} + */ +export const deleteKeysInQosSpecOnCinder = (projectId, qosId, data) => + axios.request({ + method: 'put', + url: cinderBase(`${projectId}/qos-specs/${qosId}`), + data, + }); + +/** + * Associate QoS specification with a volume type + * @param {String} projectId The UUID of the project in a multi-tenancy cloud. + * @param {String} qosId The ID of the QoS specification. + * @param {Object} params request query + * @param {Object} params.vol_type_id A volume type ID. + * @returns {Promise} + */ +export const fetchAssociateQosSpecOnCinder = (projectId, qosId, params) => + axios.request({ + method: 'get', + url: cinderBase(`${projectId}/qos-specs/${qosId}/associate`), + params, + }); + +/** + * Disassociate QoS specification from a volume type + * @param {String} projectId The UUID of the project in a multi-tenancy cloud. + * @param {String} qosId The ID of the QoS specification. + * @param {Object} params request query + * @param {Object} params.vol_type_id A volume type ID. + * @returns {Promise} + */ +export const fetchDisassociateQosSpecOnCinder = (projectId, qosId, params) => + axios.request({ + method: 'get', + url: cinderBase(`${projectId}/qos-specs/${qosId}/associate`), + params, + }); + +/** + * Show a QoS specification details + * @param {String} projectId The UUID of the project in a multi-tenancy cloud. + * @param {String} qosId The ID of the QoS specification. + * @param {Object} params request query + * @returns {Promise} + */ +export const fetchQosSpecDetailsOnCinder = (projectId, qosId, params) => + axios.request({ + method: 'get', + url: cinderBase(`${projectId}/qos-specs/${qosId}`), + params, + }); diff --git a/src/api/cinder/snapshots.js b/src/api/cinder/snapshots.js new file mode 100644 index 00000000..b0e14128 --- /dev/null +++ b/src/api/cinder/snapshots.js @@ -0,0 +1,62 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import cinderBase from './base'; + +/** + * List accessible snapshots + * @param {String} projectId The UUID of the project in a multi-tenancy cloud. + * @param {Object} params request body + * @param {String} params.all_tenants Shows details for all project. Admin only. + * @param {String} params.sort A valid direction is asc (ascending) or desc (descending). + * @param {String} params.limit Default value : 10 + * @param {String} params.offset Used in conjunction with limit to return a slice of items. + * @param {String} params.marker The ID of the last-seen item. + * @param {String} params.with_count Whether to show count in API response or not, default is False. + * @returns {Promise} + */ +export const fetchListAccessibleSnapshots = (projectId, params) => + axios.request({ + method: 'get', + url: cinderBase(`${projectId}/snapshots`), + params, + }); + +/** + * Show a snapshot’s details + * @param {String} projectId The UUID of the project in a multi-tenancy cloud. + * @param {String} snapshotId The UUID of the snapshot. + * @returns {Promise} + */ +export const fetchListAccessibleSnapshotDetails = (projectId, snapshotId) => + axios.request({ + method: 'get', + url: cinderBase(`${projectId}/snapshots/${snapshotId}`), + }); + +/** + * Update a snapshot + * @param {String} projectId The UUID of the project in a multi-tenancy cloud. + * @param {String} snapshotId The UUID of the snapshot. + * @param {Object} data request body + * @returns {Promise} + */ +export const updateSnapshotOnCinder = (projectId, snapshotId, data) => + axios.request({ + method: 'put', + url: cinderBase(`${projectId}/snapshots/${snapshotId}`), + data, + }); diff --git a/src/api/cinder/types.js b/src/api/cinder/types.js new file mode 100644 index 00000000..13ae0c08 --- /dev/null +++ b/src/api/cinder/types.js @@ -0,0 +1,180 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import cinderBase from './base'; + +/** + * Show all extra specifications for volume type + * @param {String} projectId The UUID of the project in a multi-tenancy cloud. + * @param {String} volumeTypeId The UUID for an existing volume type. + * @param {Object} params request query + * @returns {Promise} + */ +export const fetchExtraSpecsForTypes = (projectId, volumeTypeId, params) => + axios.request({ + method: 'get', + url: cinderBase(`${projectId}/types/${volumeTypeId}/extra_specs`), + params, + }); + +/** + * Create or update extra specs for volume type + * @param {String} projectId The UUID of the project in a multi-tenancy cloud. + * @param {String} volumeTypeId The UUID for an existing volume type. + * @param {Object} body request body + * @param {Object} body.extra_specs A set of key and value pairs that contains the specifications for a volume type. + * @returns {Promise} + */ +export const createExtraSpecsForTypes = (projectId, volumeTypeId, data) => + axios.request({ + method: 'post', + url: cinderBase(`${projectId}/types/${volumeTypeId}/extra_specs`), + data, + }); + +/** + * Delete extra specification for volume type + * @param {String} projectId The UUID of the project in a multi-tenancy cloud. + * @param {String} volumeTypeId The UUID for an existing volume type. + * @param {String} keyName The key name of the extra spec for a volume type. + * @returns {Promise} + */ +export const deleteExtraSpecsForTypes = (projectId, volumeTypeId, keyName) => + axios.request({ + method: 'delete', + url: cinderBase( + `${projectId}/types/${volumeTypeId}/extra_specs/${keyName}` + ), + }); + +/** + * Create volume type for v2 + * @param {String} projectId The UUID of the project in a multi-tenancy cloud. + * @param {Object} data request body + * @param {Object} data.volume_type A volume_type object. + * @param {String} data.volume_type.name The name of the Volume Transfer. + * @param {String} data.volume_type.description The backup description or null. + * @param {Boolean} data.volume_type.is_public Volume type which is accessible to the public. + * @param {Object} data.volume_type.extra_specs A set of key and value pairs that contains the specifications for a volume type. + * @param {String} data.volume_type.extra_specs.capabilities example : "gpu" + * @returns {Promise} + */ +export const createVolumeType = (projectId, data) => + axios.request({ + method: 'post', + url: cinderBase(`${projectId}/types`), + data, + }); + +/** + * Update volume type + * @param {String} projectId The UUID of the project in a multi-tenancy cloud. + * @param {String} volumeTypeId The UUID for an existing volume type. + * @param {Object} data request body + * @param {Object} data.volume_type A volume_type object. + * @param {String} data.volume_type.name The name of the Volume Transfer. + * @param {String} data.volume_type.description The backup description or null. + * @param {Boolean} data.volume_type.is_public Volume type which is accessible to the public. + * @param {Object} data.volume_type.extra_specs A set of key and value pairs that contains the specifications for a volume type. + * @param {String} data.volume_type.extra_specs.capabilities example : "gpu" + * @returns {Promise} + */ +export const updateVolumeType = (projectId, volumeTypeId, data) => + axios.request({ + method: 'put', + url: cinderBase(`${projectId}/types/${volumeTypeId}`), + data, + }); + +/** + * Show an encryption type for v2 + * @param {String} projectId The UUID of the project in a multi-tenancy cloud. + * @param {String} volumeTypeId The UUID for an existing volume type. + * @returns {Promise} + */ +export const fetchVolumeTypesEncryption = (projectId, volumeTypeId) => + axios.request({ + method: 'get', + url: cinderBase(`${projectId}/types/${volumeTypeId}/encryption`), + }); + +/** + * Create an encryption type for v2 + * @param {String} projectId The UUID of the project in a multi-tenancy cloud. + * @param {String} volumeTypeId The UUID for an existing volume type. + * @param {Object} data request body + * @param {Object} data.encryption The encryption information. + * @param {String} data.encryption.key_size Size of encryption key, in bits. For example, 128 or 256. The default value is None. + * @param {String} data.encryption.provider The class that provides encryption support. + * @param {Boolean} data.encryption.control_location The default value is “front-end”. + * @param {Object} data.encryption.cipher The encryption algorithm or mode. For example, aes-xts-plain64. The default value is None. + * @returns {Promise} + */ +export const createVolumeTypesEncryption = (projectId, volumeTypeId, data) => + axios.request({ + method: 'post', + url: cinderBase(`${projectId}/types/${volumeTypeId}/encryption`), + data, + }); + +/** + * Delete an encryption type for v2 + * @param {String} projectId The UUID of the project in a multi-tenancy cloud. + * @param {String} volumeTypeId The UUID for an existing volume type. + * @param {String} encryptionId The ID of the encryption type. + * @returns {Promise} + */ +export const deleteVolumeTypesEncryption = ( + projectId, + volumeTypeId, + encryptionId +) => + axios.request({ + method: 'delete', + url: cinderBase( + `${projectId}/types/${volumeTypeId}/encryption/${encryptionId}` + ), + }); + +/** + * Add private volume type access + * @param {String} projectId The UUID of the project in a multi-tenancy cloud. + * @param {String} volumeTypeId The ID of Volume Type to be accessed by project. + * @param {Object} data request body + * @param {Object} data.addProjectAccess A addProjectAccess object. When add request + * @param {String} data.addProjectAccess.project The ID of the project. When add request + * @param {Object} data.removeProjectAccess A removeProjectAccess project. When delete request + * @param {String} data.removeProjectAccess.project The ID of the project. When delete request + * @returns {Promise} + */ +export const addOrDeleteVolumeTypeAccess = (projectId, volumeTypeId, data) => + axios.request({ + method: 'post', + url: cinderBase(`${projectId}/types/${volumeTypeId}/action`), + data, + }); + +/** + * List private volume type access details + * @param {String} projectId The UUID of the project in a multi-tenancy cloud. + * @param {String} volumeTypeId The ID of Volume Type to be accessed by project. + * @returns {Promise} + */ +export const fetchVolumeTypesAccessDetails = (projectId, volumeTypeId) => + axios.request({ + method: 'get', + url: cinderBase(`${projectId}/types/${volumeTypeId}/os-volume-type-access`), + }); diff --git a/src/api/cinder/volume-transfers.js b/src/api/cinder/volume-transfers.js new file mode 100644 index 00000000..ebf75940 --- /dev/null +++ b/src/api/cinder/volume-transfers.js @@ -0,0 +1,80 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import cinderBase from './base'; + +/** + * Create a volume transfer + * @param {String} projectId The UUID of the project in a multi-tenancy cloud. + * @param {Object} data request body + * @param {Object} data.transfer The volume transfer object. + * @param {String} data.transfer.name The name of the object. + * @param {String} data.transfer.volume_id The UUID of the volume. + * @param {Boolean} data.transfer.no_snapshots Transfer volume without snapshots. Defaults to False if not specified. + * @returns {Promise} + */ +export const createVolumenTransfer = (projectId, data) => + axios.request({ + method: 'post', + url: cinderBase(`${projectId}/volume-transfers`), + data, + }); + +/** + * List volume transfers for a project + * @param {String} projectId The UUID of the project in a multi-tenancy cloud. + * @param {Object} params request query + * @param {Object} params.all_tenants Shows details for all project. Admin only. + * @param {String} params.limit Requests a page size of items. Returns a number of items up to a limit value. + * @param {String} params.offset Used in conjunction with limit to return a slice of items. offset is where to start in the list. + * @param {Boolean} params.marker The ID of the last-seen item. + * @param {Boolean} params.sort_key Sorts by an attribute. Default is created_at. + * @param {Boolean} params.sort_dir Sorts by one or more sets of attribute and sort direction combinations. + * @returns {Promise} + */ +export const fetchVolumenTransfersForProject = (projectId, params) => + axios.request({ + method: 'get', + url: cinderBase(`${projectId}/volume-transfers`), + params, + }); + +/** + * Delete a volume transfer + * @param {String} projectId The UUID of the project in a multi-tenancy cloud. + * @param {Object} transferId The unique identifier for a volume transfer. + * @returns {Promise} + */ +export const deleteVolumenTransfer = (projectId, transferId) => + axios.request({ + method: 'delete', + url: cinderBase(`${projectId}/volume-transfers/${transferId}`), + }); + +/** + * Accept a volume transfer + * @param {String} projectId The UUID of the project in a multi-tenancy cloud. + * @param {Object} data request body + * @param {Object} data.accept The accept object. + * @param {String} data.accept.auth_key The name of the object. + * @returns {Promise} + */ +export const acceptVolumenTransfer = (projectId, transferId, data) => + axios.request({ + method: 'post', + url: cinderBase(`${projectId}/volume-transfers/${transferId}/accept`), + data, + }); diff --git a/src/api/cinder/volume.js b/src/api/cinder/volume.js new file mode 100644 index 00000000..a91e6d3b --- /dev/null +++ b/src/api/cinder/volume.js @@ -0,0 +1,62 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import cinderBase from './base'; + +/** + * Show a volume’s details + * @param {String} projectId The UUID of the project in a multi-tenancy cloud. + * @param {Object} volumeId The UUID of the volume. + * @returns {Promise} + */ +export const fetchAccessibleVolumeDetails = (projectId, volumeId) => + axios.request({ + method: 'get', + url: cinderBase(`${projectId}/volumes/${volumeId}`), + }); + +/** + * Volume actions + * @param {String} projectId The UUID of the project in a multi-tenancy cloud. + * @param {Object} volumeId The UUID of the volume. + * @param {Object} data request body + * @see https://docs.openstack.org/api-ref/block-storage/v3/index.html?expanded=id356-detail#volume-transfers-volume-transfers-3-55-or-later + * @returns {Promise} + */ +export const volumeActionsOnCinder = (projectId, volumeId, data) => + axios.request({ + method: 'post', + url: cinderBase(`${projectId}/volumes/${volumeId}/action`), + data, + }); + +/** + * Update a volume + * @param {String} projectId The UUID of the project in a multi-tenancy cloud. + * @param {String} volumeId The UUID of the volume. + * @param {Object} data request body + * @param {Object} data.volume A volume object. + * @param {String} data.volume.description The volume description. + * @param {String} data.volume.name The volume name. + * @param {Object} data.volume.metadata One or more metadata key and value pairs that are associated with the volume. + * @returns {Promise} + */ +export const updateVolumeOnCinder = (projectId, volumeId, data) => + axios.request({ + method: 'put', + url: cinderBase(`${projectId}/volumes/${volumeId}/action`), + data, + }); diff --git a/src/api/glance/base.js b/src/api/glance/base.js new file mode 100644 index 00000000..485ed93a --- /dev/null +++ b/src/api/glance/base.js @@ -0,0 +1,23 @@ +// Copyright 2021 99cloud +// +// 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. + +/** + * @param {String} key api url + * @returns {String} + */ +import { glanceBase } from 'utils/constants'; + +const getGlanceBaseUrl = (key) => `${glanceBase()}/${key}`; + +export default getGlanceBaseUrl; diff --git a/src/api/glance/images.js b/src/api/glance/images.js new file mode 100644 index 00000000..8d6228e6 --- /dev/null +++ b/src/api/glance/images.js @@ -0,0 +1,174 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import cinderBase from './base'; + +/** + * Create image + * @param {Object} data request body + * @param {String} data.container_format Format of the image container. + * @param {String} data.disk_format The format of the disk. + * @param {String} data.id A unique, user-defined image UUID, in the format: nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn + * @param {Number} data.min_disk Amount of disk space in GB that is required to boot the image. + * @param {Number} data.min_ram Amount of RAM in MB that is required to boot the image. + * @param {String} data.name The name of the image. + * @param {Boolean} data.protected Image protection for deletion. + * @param {Array} data.tags List of tags for this image. + * @param {String} data.visibility Visibility for this image. Valid value is one of: public, private, shared, or community. + * @returns {Promise} + */ +export const createImage = (data) => + axios.request({ + method: 'post', + url: cinderBase('images'), + data, + }); + +/** + * Update image + * @param {String} imageId The UUID of the image. + * @param {Object} data request body + * @param {String} data.container_format Format of the image container. + * @param {String} data.disk_format The format of the disk. + * @param {String} data.id A unique, user-defined image UUID, in the format: nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn + * @param {Number} data.min_disk Amount of disk space in GB that is required to boot the image. + * @param {Number} data.min_ram Amount of RAM in MB that is required to boot the image. + * @param {String} data.name The name of the image. + * @param {Boolean} data.protected Image protection for deletion. + * @param {Array} data.tags List of tags for this image. + * @param {String} data.visibility Visibility for this image. Valid value is one of: public, private, shared, or community. + * @returns {Promise} + */ +export const updateImage = (imageId, data) => + axios.request({ + method: 'patch', + url: cinderBase(`images/${imageId}`), + headers: { + 'content-type': 'application/openstack-images-v2.1-json-patch', + }, + data, + }); + +/** + * Upload binary image data + * Set the Content-Type request header to application/octet-stream. + * @param {String} imageId The UUID of the image. + * @param {File} data Image file + * @returns {Promise} + */ +export const uploadBinaryImageData = (imageId, data) => + axios.request({ + method: 'put', + url: cinderBase(`images/${imageId}/file`), + headers: { + 'content-type': 'application/octet-stream', + }, + data, + }); + +/** + * List images + * @param {Object} params request query + * @param {Number} params.limit Requests a page size of items + * @param {String} params.disk_format Example : "iso" + * @param {String} params.marker The ID of the last-seen item. + * @param {String} params.name Filters the response by a name. + * @param {String} params.owner Filters the response by a project (also called a “tenant”) ID. + * @param {Boolean} params.protected Filters the response by the ‘protected’ image property. + * @param {Number} params.status Filters the response by an image status. + * @param {Number} params.tag Filters the response by the specified tag value. + * @param {String} params.visibility Filters the response by an image visibility value. + * @param {Boolean} params.os_hidden When true, filters the response to display only “hidden” images. + * @param {String} params.member_status Filters the response by a member status. + * @param {String} params.size_max Filters the response by a maximum image size, in bytes. + * @param {String} params.size_min Filters the response by a minimum image size, in bytes. + * @param {String} params.created_at Specify a comparison filter based on the date and time when the resource was created. + * @param {String} params.updated_at Specify a comparison filter based on the date and time when the resource was most recently modified. + * @param {String} params.sort_dir Sorts the response by a set of one or more sort direction and attribute (sort_key) combinations. + * @param {String} params.sort_key Sorts the response by an attribute, such as name, id, or updated_at. + * @param {String} params.sort Sorts the response by one or more attribute and sort direction combinations. You can also set multiple sort keys and directions. Default direction is desc. + * @returns {Promise} + */ +export const fetchImages = (params) => + axios.request({ + method: 'get', + url: cinderBase('images'), + params, + }); + +/** + * List image members + * @param {String} imageId The UUID of the image. + * @returns {Promise} + */ +export const fetchListImageMembers = (imageId) => + axios.request({ + method: 'get', + url: cinderBase(`images/${imageId}/members`), + }); + +/** + * Create image member + * @param {String} imageId The UUID of the image. + * @param {Object} data request body + * @param {String} data.member The ID of the image member. + * @returns {Promise} + */ +export const createImageMember = (imageId, data) => + axios.request({ + method: 'get', + url: cinderBase(`images/${imageId}/members`), + data, + }); + +/** + * Update image member + * @param {String} imageId The UUID of the image. + * @param {String} memberId The ID of the image member. + * @param {Object} data request body + * @param {String} data.status The status of this image member. Value is one of pending, accepted, rejected. + * @returns {Promise} + */ +export const updateImageMember = (imageId, memberId, data) => + axios.request({ + method: 'put', + url: cinderBase(`images/${imageId}/members/${memberId}`), + data, + }); + +/** + * Delete image member + * @param {String} imageId The UUID of the image. + * @param {String} memberId The ID of the image member. + * @returns {Promise} + */ +export const deleteImageMember = (imageId, memberId) => + axios.request({ + method: 'delete', + url: cinderBase(`images/${imageId}/members/${memberId}`), + }); + +/** + * List images count + * @param {Object} params request query + * @returns {Promise} + */ +export const fetchImagesCountOnGlance = (params) => + axios.request({ + method: 'get', + url: cinderBase('images/count'), + params, + }); diff --git a/src/api/glance/metadefs.js b/src/api/glance/metadefs.js new file mode 100644 index 00000000..6f806ce0 --- /dev/null +++ b/src/api/glance/metadefs.js @@ -0,0 +1,106 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import cinderBase from './base'; + +/** + * Get namespace details + * @param {String} namespaceName The name of the namespace whose details you want to see. + * @param {Object} params request query + * @param {String} params.resource_type Apply the prefix for the specified resource type to the names of the properties listed in the response. + * @returns {Promise} + */ +export const fetchNamespaceDetailsOnGlance = (namespaceName, params) => + axios.request({ + method: 'get', + url: cinderBase(`metadefs/namespaces/${namespaceName}`), + params, + }); + +/** + * Update namespace + * @param {String} namespaceName The name of the namespace whose details you want to see. + * @param {Object} data request body + * @param {String} data.description The description of the namespace. + * @param {String} data.display_name User-friendly name to use in a UI to display the namespace name. + * @param {String} data.namespace An identifier (a name) for the namespace. + * @param {Boolean} data.protected Namespace protection for deletion. A valid value is true or false. Default is false. + * @param {String} data.visibility The namespace visibility. A valid value is public or private. Default is private. + * @returns {Promise} + */ +export const updateNamespaceOnGlance = (namespaceName, data) => + axios.request({ + method: 'put', + url: cinderBase(`metadefs/namespaces/${namespaceName}`), + data, + }); + +/** + * Create namespace + * @param {Object} data request body + * @param {String} data.description The description of the namespace. + * @param {String} data.display_name User-friendly name to use in a UI to display the namespace name. + * @param {String} data.namespace An identifier (a name) for the namespace. + * @param {Boolean} data.protected Namespace protection for deletion. A valid value is true or false. Default is false. + * @param {String} data.visibility The namespace visibility. A valid value is public or private. Default is private. + * @returns {Promise} + */ +export const createNamespaceOnGlance = (data) => + axios.request({ + method: 'post', + url: cinderBase('metadefs/namespaces'), + data, + }); + +/** + * List resource types + * @returns {Promise} + */ +export const fetchListResourceTypesOnGlance = () => + axios.request({ + method: 'get', + url: cinderBase('metadefs/resource_types'), + }); + +/** + * Remove resource type association + * @param {String} namespaceName The name of the namespace whose details you want to see. + * @param {String} resourceTypeName The name of the resource type. + * @returns {Promise} + */ +export const deleteResourceTypeOnGlance = (namespaceName, resourceTypeName) => + axios.request({ + method: 'delete', + url: cinderBase( + `metadefs/namespaces/${namespaceName}/resource_types/${resourceTypeName}` + ), + }); + +/** + * Create resource type association + * @param {String} namespaceName The name of the namespace whose details you want to see. + * @param {Object} data request body + * @param {String} data.name Name of the resource type. A Name is limited to 80 chars in length. + * @param {String} data.prefix Prefix for any properties in the namespace that you want to apply to the resource type. + * @param {String} data.properties_target Some resource types allow more than one key and value pair for each instance. + * @returns {Promise} + */ +export const createResourceTypeOnGlance = (namespaceName, data) => + axios.request({ + method: 'post', + url: cinderBase(`metadefs/namespaces/${namespaceName}/resource_types`), + data, + }); diff --git a/src/api/gocron/base.js b/src/api/gocron/base.js new file mode 100644 index 00000000..47e29752 --- /dev/null +++ b/src/api/gocron/base.js @@ -0,0 +1,23 @@ +// Copyright 2021 99cloud +// +// 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. + +/** + * @param {String} key api url + * @returns {String} + */ +import { gocronBase } from 'utils/constants'; + +const getGocronBaseUrl = (key) => `${gocronBase()}/${key}`; + +export default getGocronBaseUrl; diff --git a/src/api/heat/base.js b/src/api/heat/base.js new file mode 100644 index 00000000..aee33519 --- /dev/null +++ b/src/api/heat/base.js @@ -0,0 +1,23 @@ +// Copyright 2021 99cloud +// +// 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. + +/** + * @param {String} key api url + * @returns {String} + */ +import { heatBase } from 'utils/constants'; + +const getHeatBaseUrl = (key) => `${heatBase()}/${key}`; + +export default getHeatBaseUrl; diff --git a/src/api/heat/stacks.js b/src/api/heat/stacks.js new file mode 100644 index 00000000..3684e3b5 --- /dev/null +++ b/src/api/heat/stacks.js @@ -0,0 +1,86 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getHeatBaseUrl from './base'; + +/** + * Create stack + * @param {Object} tenantId The UUID of the tenant. A tenant is also known as a project. + * @param {Object} data request body + * @see https://docs.openstack.org/api-ref/orchestration/v1/index.html?expanded=create-stack-detail#stacks + * @returns {Promise} + */ +export const createStackOnHeat = (tenantId, data) => + axios.request({ + method: 'post', + url: getHeatBaseUrl(`${tenantId}/stacks`), + data, + }); + +/** + * Update stack + * @param {Object} tenantId The UUID of the tenant. A tenant is also known as a project. + * @param {Object} stackName The name of a stack. + * @param {Object} stackId The UUID of the stack. + * @param {Object} data request body + * @see https://docs.openstack.org/api-ref/orchestration/v1/index.html?expanded=update-stack-detail#stacks + * @returns {Promise} + */ +export const updateStackOnHeat = (tenantId, stackName, stackId, data) => + axios.request({ + method: 'post', + url: getHeatBaseUrl(`${tenantId}/stacks/${stackName}/${stackId}`), + data, + }); + +/** + * Delete stack + * @param {Object} tenantId The UUID of the tenant. A tenant is also known as a project. + * @param {Object} stackName The name of a stack. + * @param {Object} stackId The UUID of the stack. + * @returns {Promise} + */ +export const deleteStackOnHeat = (tenantId, stackName, stackId) => + axios.request({ + method: 'delete', + url: getHeatBaseUrl(`${tenantId}/stacks/${stackName}/${stackId}`), + }); + +/** + * Abandon stack + * @param {Object} tenantId The UUID of the tenant. A tenant is also known as a project. + * @param {Object} stackName The name of a stack. + * @param {Object} stackId The UUID of the stack. + * @returns {Promise} + */ +export const abandonStackOnHeat = (tenantId, stackName, stackId) => + axios.request({ + method: 'delete', + url: getHeatBaseUrl(`${tenantId}/stacks/${stackName}/${stackId}/abandon`), + }); + +/** + * Get stack template + * @param {Object} tenantId The UUID of the tenant. A tenant is also known as a project. + * @param {Object} stackName The name of a stack. + * @param {Object} stackId The UUID of the stack. + * @returns {Promise} + */ +export const fetchStackTemplateOnHeat = (tenantId, stackName, stackId) => + axios.request({ + method: 'get', + url: getHeatBaseUrl(`${tenantId}/stacks/${stackName}/${stackId}/template`), + }); diff --git a/src/api/ironic-inspector/base.js b/src/api/ironic-inspector/base.js new file mode 100644 index 00000000..61d557ba --- /dev/null +++ b/src/api/ironic-inspector/base.js @@ -0,0 +1,23 @@ +// Copyright 2021 99cloud +// +// 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. + +/** + * @param {String} key api url + * @returns {String} + */ +import { ironicInspectorBase } from 'utils/constants'; + +const getIronicInspectorBaseUrl = (key) => `${ironicInspectorBase()}/${key}`; + +export default getIronicInspectorBaseUrl; diff --git a/src/api/ironic/base.js b/src/api/ironic/base.js new file mode 100644 index 00000000..bc909b08 --- /dev/null +++ b/src/api/ironic/base.js @@ -0,0 +1,23 @@ +// Copyright 2021 99cloud +// +// 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. + +/** + * @param {String} key api url + * @returns {String} + */ +import { ironicBase } from 'utils/constants'; + +const getIronicBaseUrl = (key) => `${ironicBase()}/${key}`; + +export default getIronicBaseUrl; diff --git a/src/api/ironic/nodes.js b/src/api/ironic/nodes.js new file mode 100644 index 00000000..553a32c8 --- /dev/null +++ b/src/api/ironic/nodes.js @@ -0,0 +1,205 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getIronicBaseUrl from './base'; + +/** + * Create Node + * @param {Object} data request body + * @param {String} data.console_interface The boot interface for a Node, e.g. “pxe”. + * @param {String} data.conductor_group The conductor group for a node. + * @param {String} data.console_interface The console interface for a node, e.g. “no-console”. + * @param {String} data.deploy_interface The deploy interface for a node, e.g. “iscsi”. + * @param {String} data.driver_info All the metadata required by the driver to manage this Node. + * @param {String} data.driver The name of the driver used to manage this Node. + * @param {String} data.extra A set of one or more arbitrary metadata key and value pairs. + * @param {String} data.inspect_interface The interface used for node inspection, e.g. “no-inspect”. + * @param {String} data.management_interface Interface for out-of-band node management, e.g. “ipmitool”. + * @param {String} data.name Human-readable identifier for the Node resource. May be undefined. Certain words are reserved. + * @param {String} data.network_interface Which Network Interface provider to use when plumbing the network connections for this Node. + * @param {String} data.power_interface Interface used for performing power actions on the node, e.g. “ipmitool”. + * @param {String} data.properties Physical characteristics of this Node. + * @param {String} data.raid_interface Interface used for configuring RAID on this node, e.g. “no-raid”. + * @param {String} data.rescue_interface The interface used for node rescue, e.g. “no-rescue”. + * @param {String} data.resource_class A string which can be used by external schedulers to identify this Node as a unit of a specific type of resource. + * @param {String} data.storage_interface Interface used for attaching and detaching volumes on this node, e.g. “cinder”. + * @see https://docs.openstack.org/api-ref/baremetal/?expanded=create-node-detail + * @returns {Promise} + */ +export const createNodeOnIronic = (data) => + axios.request({ + method: 'post', + url: getIronicBaseUrl('nodes'), + data, + }); + +/** + * Update Node + * @param {String} nodeIdent The UUID or Name of the node. + * @see https://docs.openstack.org/api-ref/baremetal/?expanded=update-node-detail + * @returns {Promise} + */ +export const updateNodeOnIronic = (nodeIdent, data) => + axios.request({ + method: 'patch', + url: getIronicBaseUrl(`nodes/${nodeIdent}`), + data, + }); + +/** + * Node State Summary + * @param {String} nodeIdent The UUID or Name of the node. + * @returns {Promise} + */ +export const fetchNodeStateSummaryOnIronic = (nodeIdent) => + axios.request({ + method: 'get', + url: getIronicBaseUrl(`nodes/${nodeIdent}/states`), + }); + +/** + * Validate Node + * @param {String} nodeIdent The UUID or Name of the node. + * @returns {Promise} + */ +export const fetchNodeValidateOnIronic = (nodeIdent) => + axios.request({ + method: 'get', + url: getIronicBaseUrl(`nodes/${nodeIdent}/validate`), + }); + +/** + * List Ports by Node + * @param {String} nodeIdent The UUID or Name of the node. + * @returns {Promise} + */ +export const fetchNodePortsOnIronic = (nodeIdent) => + axios.request({ + method: 'get', + url: getIronicBaseUrl(`nodes/${nodeIdent}/ports`), + }); + +/** + * Change Node Provision State + * @param {String} nodeIdent The UUID or Name of the node. + * @param {Object} data request body + * @param {String} data.target The requested provisioning state of this Node. + * @param {String | Object} data.configdrive A config drive to be written to a partition on the Node’s boot disk. + * @param {Array} data.clean_steps An ordered list of cleaning steps that will be performed on the node. + * @param {Array} data.deploy_steps A list of deploy steps that will be performed on the node. + * @param {String} data.rescue_password Non-empty password used to configure rescue ramdisk during node rescue operation. + * @param {Boolean} data.disable_ramdisk If set to true, the ironic-python-agent ramdisk will not be booted for cleaning. + * @returns {Promise} + */ +export const changeNodeProvisionStateOnIronic = (nodeIdent, data) => + axios.request({ + method: 'put', + url: getIronicBaseUrl(`nodes/${nodeIdent}/states/provision`), + data, + }); + +/** + * Change Node Power State + * @param {String} nodeIdent The UUID or Name of the node. + * @param {Object} data request body + * @param {String} data.target Avaliable value : “power on”, “power off”, “rebooting”, “soft power off” or “soft rebooting”. + * @param {Number} data.timeout Timeout (in seconds) for a power state transition. + * @returns {Promise} + */ +export const changeNodePowerStateOnIronic = (nodeIdent, data) => + axios.request({ + method: 'put', + url: getIronicBaseUrl(`nodes/${nodeIdent}/states/power`), + data, + }); + +/** + * Set Maintenance Flag + * @param {String} nodeIdent The UUID or Name of the node. + * @param {Object} data request body + * @param {String} data.reason Specify the reason for setting the Node into maintenance mode. + * @returns {Promise} + */ +export const setMaintenanceFlagOnIronic = (nodeIdent, data) => + axios.request({ + method: 'put', + url: getIronicBaseUrl(`nodes/${nodeIdent}/maintenance`), + data, + }); + +/** + * Clear Maintenance Flag + * @param {String} nodeIdent The UUID or Name of the node. + * @returns {Promise} + */ +export const deleteMaintenanceFlagOnIronic = (nodeIdent) => + axios.request({ + method: 'delete', + url: getIronicBaseUrl(`nodes/${nodeIdent}/maintenance`), + }); + +/** + * Get Boot Device + * @param {String} nodeIdent The UUID or Name of the node. + * @returns {Promise} + */ +export const fetchBootDeviceOnIronic = (nodeIdent) => + axios.request({ + method: 'get', + url: getIronicBaseUrl(`nodes/${nodeIdent}/management/boot_device`), + }); + +/** + * Set Boot Device + * @param {String} nodeIdent The UUID or Name of the node. + * @param {Object} data request body + * @param {String} data.boot_device The boot device for a Node, eg. “pxe” or “disk”. + * @param {String} data.persistent Whether the boot device should be set only for the next reboot, or persistently. + * @returns {Promise} + */ +export const setBootDeviceOnIronic = (nodeIdent, data) => + axios.request({ + method: 'put', + url: getIronicBaseUrl(`nodes/${nodeIdent}/management/boot_device`), + data, + }); + +/** + * Get Supported Boot Devices + * @param {String} nodeIdent The UUID or Name of the node. + * @returns {Promise} + */ +export const fetchBootDeviceSupportedOnIronic = (nodeIdent) => + axios.request({ + method: 'get', + url: getIronicBaseUrl( + `nodes/${nodeIdent}/management/boot_device/supported` + ), + }); + +/** + * Set all traits of a node + * @param {String} nodeIdent The UUID or Name of the node. + * @param {Object} data request body + * @param {Object} data.traits List of traits for this node. + * @returns {Promise} + */ +export const setAllTraitsOnIronic = (nodeIdent, data) => + axios.request({ + method: 'put', + url: getIronicBaseUrl(`nodes/${nodeIdent}/traits`), + data, + }); diff --git a/src/api/ironic/port-groups.js b/src/api/ironic/port-groups.js new file mode 100644 index 00000000..f50be64e --- /dev/null +++ b/src/api/ironic/port-groups.js @@ -0,0 +1,51 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getIronicBaseUrl from './base'; + +/** + * Create Portgroup + * @param {Object} data request body + * @param {String} data.node_uuid UUID of the Node this resource belongs to. + * @param {String} data.address Physical hardware address of this network Port. + * @param {String} data.name Human-readable identifier for the Portgroup resource. May be undefined. + * @param {Object} data.mode Mode of the port group. + * @param {Boolean} data.standalone_ports_supported Indicates whether ports that are members of this portgroup can be used as stand-alone ports. + * @param {String} data.properties Key/value properties related to the port group’s configuration. + * @param {String} data.extra A set of one or more arbitrary metadata key and value pairs. + * @param {String} data.uuid The UUID for the resource. + * @see https://docs.openstack.org/api-ref/baremetal/?expanded=set-all-traits-of-a-node-detail,create-portgroup-detail + */ +export const createPortGroupOnIronic = (data) => + axios.request({ + method: 'post', + url: getIronicBaseUrl('portgroups'), + data, + }); + +/** + * Update a Port + * @param {String} portId The UUID of the port. + * @param {Object} data request body + * @see https://docs.openstack.org/api-ref/baremetal/?expanded=set-all-traits-of-a-node-detail,update-a-portgroup-detail + * @returns {Promise} + */ +export const updatePortGroupOnIronic = (portgroupIdent, data) => + axios.request({ + method: 'patch', + url: getIronicBaseUrl(`portgroups/${portgroupIdent}`), + data, + }); diff --git a/src/api/ironic/ports.js b/src/api/ironic/ports.js new file mode 100644 index 00000000..7c6ddd74 --- /dev/null +++ b/src/api/ironic/ports.js @@ -0,0 +1,63 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getIronicBaseUrl from './base'; + +/** + * List Detailed Ports + * @param {Object} params request query + * @param {String} params.node Filter the list of returned Ports. + */ +export const fetchDetailedPortsOnIronic = (params) => + axios.request({ + method: 'get', + url: getIronicBaseUrl('ports'), + params, + }); + +/** + * Create Port + * @param {Object} data request body + * @param {String} data.node_uuid UUID of the Node this resource belongs to. + * @param {String} data.address Physical hardware address of this network Port. + * @param {String} data.portgroup_uuid UUID of the Portgroup this resource belongs to. + * @param {Object} data.local_link_connection The Port binding profile. + * @param {Boolean} data.pxe_enabled Indicates whether PXE is enabled or disabled on the Port. + * @param {String} data.physical_network The name of the physical network to which a port is connected. May be empty. + * @param {String} data.extra A set of one or more arbitrary metadata key and value pairs. + * @param {Boolean} data.is_smartnicIndicates whether the Port is a Smart NIC port. + * @param {String} data.uuid The UUID for the resource. + */ +export const createPortsOnIronic = (data) => + axios.request({ + method: 'post', + url: getIronicBaseUrl('ports'), + data, + }); + +/** + * Update a Port + * @param {String} portId The UUID of the port. + * @param {Object} data request body + * @see https://docs.openstack.org/api-ref/baremetal/?expanded=set-all-traits-of-a-node-detail,update-a-port-detail + * @returns {Promise} + */ +export const updatePortsOnIronic = (portId, data) => + axios.request({ + method: 'patch', + url: getIronicBaseUrl(`ports/${portId}`), + data, + }); diff --git a/src/api/keystone/base.js b/src/api/keystone/base.js new file mode 100644 index 00000000..cb7cad0e --- /dev/null +++ b/src/api/keystone/base.js @@ -0,0 +1,23 @@ +// Copyright 2021 99cloud +// +// 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. + +/** + * @param {String} key api url + * @returns {String} + */ +import { keystoneBase } from 'utils/constants'; + +const getKeystoneBaseUrl = (key) => `${keystoneBase()}/${key}`; + +export default getKeystoneBaseUrl; diff --git a/src/api/keystone/domain.js b/src/api/keystone/domain.js new file mode 100644 index 00000000..270790d3 --- /dev/null +++ b/src/api/keystone/domain.js @@ -0,0 +1,134 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getKeystoneBaseUrl from './base'; + +/** + * List domains + * @returns {Promise} + */ +export const fetchDomains = () => + axios.request({ + method: 'get', + url: getKeystoneBaseUrl('domains'), + }); + +/** + * Show domain details + * @param {String} domainId The domain ID. + * @returns {Promise} + */ +export const fetchDomainDetails = (domainId) => + axios.request({ + method: 'get', + url: getKeystoneBaseUrl(`domains/${domainId}`), + }); + +/** + * Update domain + * @param {String} domainId The domain ID. + * @param {Object} data request body + * @param {Object} data request body + * @returns {Promise} + */ +export const updateDomain = (domainId, data) => + axios.request({ + method: 'patch', + url: getKeystoneBaseUrl(`domains/${domainId}`), + data, + }); + +/** + * List role assignments for user on domain + * @param {String} domainId The domain ID. + * @param {String} userId The user ID. + * @returns {Promise} + */ +export const fetchRolesOnDomain = (domainId, userId) => + axios.request({ + method: 'get', + url: getKeystoneBaseUrl(`domains/${domainId}/users/${userId}/roles`), + }); + +/** + * Assign role to user on domain + * @param {String} domainId The domain ID. + * @param {String} userId The user ID. + * @param {String} roleId The role ID. + * @returns {Promise} + */ +export const updateRoleOnDomain = (domainId, userId, roleId) => + axios.request({ + method: 'put', + url: getKeystoneBaseUrl( + `domains/${domainId}/users/${userId}/roles/${roleId}` + ), + }); + +/** + * Unassigns role from user on domain + * @param {String} domainId The domain ID. + * @param {String} userId The user ID. + * @param {String} roleId The role ID. + * @returns {Promise} + */ +export const deleteRoleOnDomain = (domainId, userId, roleId) => + axios.request({ + method: 'delete', + url: getKeystoneBaseUrl( + `domains/${domainId}/users/${userId}/roles/${roleId}` + ), + }); + +/** + * List role assignments for group on domain + * @param {String} domainId The domain ID. + * @param {String} groupId The group ID. + * @returns {Promise} + */ +export const fetchRolesForGroupOnDomain = (domainId, groupId) => + axios.request({ + method: 'get', + url: getKeystoneBaseUrl(`domains/${domainId}/groups/${groupId}/roles`), + }); + +/** + * Assign role to group on domain + * @param {String} domainId The domain ID. + * @param {String} groupId The group ID. + * @returns {Promise} + */ +export const assignRoleForGroupOnDomain = (domainId, groupId, roleId) => + axios.request({ + method: 'put', + url: getKeystoneBaseUrl( + `domains/${domainId}/groups/${groupId}/roles/${roleId}` + ), + }); + +/** + * Assign role to group on domain + * @param {String} domainId The domain ID. + * @param {String} groupId The group ID. + * @returns {Promise} + */ +export const unassignRoleForGroupOnDomain = (domainId, groupId, roleId) => + axios.request({ + method: 'delete', + url: getKeystoneBaseUrl( + `domains/${domainId}/groups/${groupId}/roles/${roleId}` + ), + }); diff --git a/src/api/keystone/group.js b/src/api/keystone/group.js new file mode 100644 index 00000000..c4edbbc4 --- /dev/null +++ b/src/api/keystone/group.js @@ -0,0 +1,113 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getKeystoneBaseUrl from './base'; + +/** + * List groups + * @param {String} groupId path + * @param {Object} parmas request query + * @param {String} parmas.name Filters the response by a group name. + * @param {String} parmas.domain_id Filters the response by a domain ID. + * @returns {Promise} + */ +export const fetchGroups = (parmas) => + axios.request({ + method: 'get', + url: getKeystoneBaseUrl('groups'), + parmas, + }); + +/** + * Show group details + * @param {String} groupId path + * @returns {Promise} + */ +export const fetchGroupDetails = (groupId) => + axios.request({ + method: 'get', + url: getKeystoneBaseUrl(`groups/${groupId}`), + }); + +/** + * List users in group + * @param {String} groupId path + * @param {Object} parmas request query + * @param {String} parmas.password_expires_at Filter results based on which user passwords have expired. + * @returns {Promise} + */ +export const fetchGroupUsers = (groupId, parmas) => + axios.request({ + method: 'get', + url: getKeystoneBaseUrl(`groups/${groupId}/users`), + parmas, + }); + +/** + * Remove user from group + * @param {String} groupId The group ID. + * @param {String} userId The user ID. + * @returns {Promise} + */ +export const deleteGroupUsers = (groupId, userId) => + axios.request({ + method: 'delete', + url: getKeystoneBaseUrl(`groups/${groupId}/users/${userId}`), + }); + +/** + * Add user to group + * @param {String} groupId The group ID. + * @param {String} userId The user ID. + * @returns {Promise} + */ +export const addGroupUsers = (groupId, userId) => + axios.request({ + method: 'put', + url: getKeystoneBaseUrl(`groups/${groupId}/users/${userId}`), + }); + +/** + * Create group + * @param {Object} data request body + * @param {Object} data.group request body + * @param {Object} data.group.description The description of the group. + * @param {Object} data.group.domain_id The ID of the domain of the group. + * @param {Object} data.group.name The name of the group. + * @returns {Promise} + */ +export const createGroup = (groupId, data) => + axios.request({ + method: 'post', + url: getKeystoneBaseUrl('groups'), + data, + }); + +/** + * Update group + * @param {Object} data request body + * @param {Object} data.group request body + * @param {Object} data.group.description The description of the group. + * @param {Object} data.group.domain_id The ID of the domain of the group. + * @param {Object} data.group.name The name of the group. + * @returns {Promise} + */ +export const updateGroup = (groupId, data) => + axios.request({ + method: 'patch', + url: getKeystoneBaseUrl(`groups/${groupId}`), + data, + }); diff --git a/src/api/keystone/project.js b/src/api/keystone/project.js new file mode 100644 index 00000000..d591aa28 --- /dev/null +++ b/src/api/keystone/project.js @@ -0,0 +1,170 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getKeystoneBaseUrl from './base'; + +/** + * List projects + * @returns {Promise} + */ +export const fetchProjects = () => + axios.request({ + method: 'get', + url: getKeystoneBaseUrl('projects'), + }); + +/** + * Show project details + * @param {String} projectId path + * @returns {Promise} + */ +export const fetchProject = (projectId) => + axios.request({ + method: 'get', + url: getKeystoneBaseUrl(`projects/${projectId}`), + }); + +/** + * Create project + * @param {Object} data request body + * @param {Object} data.project A project object + * @param {String} data.project.name The name of the project, which must be unique within the owning domain + * @param {Boolean} data.project.domain_id The ID of the domain for the project. + * @param {String} data.project.description The description of the project. + * @param {Boolean} data.project.enabled If set to true, project is enabled. If set to false, project is disabled. + * @returns {Promise} + */ +export const createProject = (data) => + axios.request({ + method: 'post', + url: getKeystoneBaseUrl('projects}'), + data, + }); + +/** + * Update project + * @param {String} projectId The project ID. + * @param {Object} data request body + * @param {Object} data.project A project object + * @param {String} data.project.name The name of the project + * @param {String} data.project.description The description of the project. + * @param {Boolean} data.project.enabled If set to true, project is enabled. If set to false, project is disabled. + * @returns {Promise} + */ +export const updateProject = (projectId, data) => + axios.request({ + method: 'patch', + url: getKeystoneBaseUrl(`projects/${projectId}`), + data, + }); + +/** + * List role assignments for user on project + * @param {String} projectId projects id + * @param {String} userId users id + * @returns {Promise} + */ +export const fetchRolesOnProject = (projectId, userId) => + axios.request({ + method: 'get', + url: getKeystoneBaseUrl(`projects/${projectId}/users/${userId}/roles`), + }); + +/** + * List role assignments for group on project + * @param {String} projectId projects id + * @param {String} groupId groups id + * @returns {Promise} + */ +export const fetchRolesForGroupOnProject = (projectId, groupId) => + axios.request({ + method: 'get', + url: getKeystoneBaseUrl(`projects/${projectId}/groups/${groupId}/roles`), + }); + +/** + * Modify tag list for a project + * @param {String} projectId The project ID. + * @param {Object} data request body + * @param {Array[String]} data.tags example : ["foo", "bar"] + * @returns {Promise} + */ +export const updateTagsOnProject = (projectId, data) => + axios.request({ + method: 'get', + url: getKeystoneBaseUrl(`projects/${projectId}/tags`), + data, + }); + +/** + * Assign role to group on project + * @param {String} projectId The project ID. + * @param {String} groupId The group ID. + * @param {String} roleId The role ID. + * @returns {Promise} + */ +export const assignRoleToGroupOnProject = (projectId, groupId, roleId) => + axios.request({ + method: 'put', + url: getKeystoneBaseUrl( + `projects/${projectId}/groups/${groupId}/roles/${roleId}` + ), + }); + +/** + * Assign role to group on project + * @param {String} projectId The project ID. + * @param {String} groupId The group ID. + * @param {String} roleId The role ID. + * @returns {Promise} + */ +export const unassignRoleToGroupOnProject = (projectId, groupId, roleId) => + axios.request({ + method: 'delete', + url: getKeystoneBaseUrl( + `projects/${projectId}/groups/${groupId}/roles/${roleId}` + ), + }); + +/** + * Assign role to user on project + * @param {String} projectId The project ID. + * @param {String} userId The user ID. + * @param {String} roleId The role ID. + * @returns {Promise} + */ +export const assignRoleToUserOnProject = (projectId, userId, roleId) => + axios.request({ + method: 'put', + url: getKeystoneBaseUrl( + `projects/${projectId}/users/${userId}/roles/${roleId}` + ), + }); + +/** + * Unassign role from user on project + * @param {String} projectId The project ID. + * @param {String} userId The user ID. + * @param {String} roleId The role ID. + * @returns {Promise} + */ +export const unassignRoleToUserOnProject = (projectId, userId, roleId) => + axios.request({ + method: 'delete', + url: getKeystoneBaseUrl( + `projects/${projectId}/users/${userId}/roles/${roleId}` + ), + }); diff --git a/src/api/keystone/role-assignment.js b/src/api/keystone/role-assignment.js new file mode 100644 index 00000000..5afa4ebf --- /dev/null +++ b/src/api/keystone/role-assignment.js @@ -0,0 +1,27 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getKeystoneBaseUrl from './base'; + +/** + * List role assignments + * @returns {Promise} + */ +export const fetchRoleAssignments = () => + axios.request({ + method: 'get', + url: getKeystoneBaseUrl('role_assignments'), + }); diff --git a/src/api/keystone/role.js b/src/api/keystone/role.js new file mode 100644 index 00000000..a14c08e3 --- /dev/null +++ b/src/api/keystone/role.js @@ -0,0 +1,38 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getKeystoneBaseUrl from './base'; + +/** + * List roles + * @returns {Promise} + */ +export const fetchRoles = () => + axios.request({ + method: 'get', + url: getKeystoneBaseUrl('roles'), + }); + +/** + * List implied (inference) roles for role + * @param {String} priorRoleId Role ID for a prior role. + * @returns {Promise} + */ +export const fetchImpliesForRole = (priorRoleId) => + axios.request({ + method: 'get', + url: getKeystoneBaseUrl(`roles/${priorRoleId}/implies`), + }); diff --git a/src/api/keystone/system.js b/src/api/keystone/system.js new file mode 100644 index 00000000..04562310 --- /dev/null +++ b/src/api/keystone/system.js @@ -0,0 +1,76 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getKeystoneBaseUrl from './base'; + +/** + * Assign a system role to a user + * @param {String} userId The user ID. + * @param {String} roleId The role ID. + * @returns {Promise} + */ +export const updateSystemRole = (userId, roleId) => + axios.request({ + method: 'put', + url: getKeystoneBaseUrl(`system/users/${userId}/roles/${roleId}`), + }); + +/** + * Delete a system role assignment from a user + * @param {String} userId The user ID. + * @param {String} roleId The role ID. + * @returns {Promise} + */ +export const deleteSystemRole = (userId, roleId) => + axios.request({ + method: 'delete', + url: getKeystoneBaseUrl(`system/users/${userId}/roles/${roleId}`), + }); + +/** + * List system role assignments for a group + * @param {String} groupId The group ID. + * @returns {Promise} + */ +export const fetchSystemRolesForGroup = (groupId) => + axios.request({ + method: 'get', + url: getKeystoneBaseUrl(`system/groups/${groupId}/roles`), + }); + +/** + * Assign a system role to a group + * @param {String} groupId The group ID. + * @param {String} roleId The role ID. + * @returns {Promise} + */ +export const assignSystemRoleForGroup = (groupId, roleId) => + axios.request({ + method: 'put', + url: getKeystoneBaseUrl(`system/groups/${groupId}/roles/${roleId}`), + }); + +/** + * Assign a system role to a group + * @param {String} groupId The group ID. + * @param {String} roleId The role ID. + * @returns {Promise} + */ +export const unassignSystemRoleForGroup = (groupId, roleId) => + axios.request({ + method: 'delete', + url: getKeystoneBaseUrl(`system/groups/${groupId}/roles/${roleId}`), + }); diff --git a/src/api/keystone/user.js b/src/api/keystone/user.js new file mode 100644 index 00000000..58fa92c7 --- /dev/null +++ b/src/api/keystone/user.js @@ -0,0 +1,126 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getKeystoneBaseUrl from './base'; + +/** + * List users + * @param {Object} params request query + * @param {String} params.domain_id Filters the response by a domain ID. + * @param {String} params.enabled Filters the response by either enabled (true) or disabled (false) users. + * @param {String} params.idp_id Filters the response by an identity provider ID. + * @param {String} params.name Filters the response by a user name. + * @param {String} params.password_expires_at Filter results based on which user passwords have expired. + * @param {String} params.protocol_id Filters the response by a protocol ID. + * @param {String} params.unique_id Filters the response by a unique ID. + * @returns {Promise} + */ +export const fetchUsers = () => + axios.request({ + method: 'get', + url: getKeystoneBaseUrl('users'), + }); + +/** + * Show user details + * @param {String} userId The user ID. + * @returns {Promise} + */ +export const fetchUserDetails = (userId) => + axios.request({ + method: 'get', + url: getKeystoneBaseUrl(`users/${userId}`), + }); + +/** + * Create user + * @param {Object} data request body + * @param {Object} data.user A user object + * @param {String} data.user.id id + * @param {String} data.user.domain_id The ID of the domain of the user, Default value : "default" + * @param {String} data.user.name The name for the user. + * @param {String} data.user.email The email for the user. + * @param {String} data.user.password The password for the user. + * @param {String} data.user.phone The phone for the user. + * @param {String} data.user.full_name The true name for the user. + * @param {Boolean} data.user.enabled Default value : true + * @param {String} data.user.description The description for the user. + * @returns {Promise} + */ +export const createUser = (data) => + axios.request({ + method: 'post', + url: getKeystoneBaseUrl('users'), + data, + }); + +/** + * Update user + * @param {String} userId The user ID. + * @param {Object} data request body + * @param {Object} data.user A user object + * @param {String} data.user.name The name for the user. + * @param {String} data.user.email The email for the user. + * @param {String} data.user.phone The phone for the user. + * @param {String} data.user.full_name The true name for the user. + * @param {String} data.user.description The description for the user. + * @returns {Promise} + */ +export const updateUser = (userId, data) => + axios.request({ + method: 'patch', + url: getKeystoneBaseUrl(`users/${userId}`), + data, + }); + +/** + * Change password for user + * @param {String} userId The user ID. + * @param {Object} data request body + * @param {Object} data.user A user object + * @param {String} data.user.original_password The original password for the user. + * @param {String} data.user.password The new password for the user. + * @returns {Promise} + */ +export const changeUserPassword = (userId, data) => + axios.request({ + method: 'post', + url: getKeystoneBaseUrl(`users/${userId}/password`), + data, + }); + +/** + * List projects for user + * @param {String} userId The user ID. + * @param {Object} params request query + * @returns {Promise} + */ +export const fetchUserProjects = (userId) => + axios.request({ + method: 'get', + url: getKeystoneBaseUrl(`users/${userId}/projects`), + }); + +/** + * List groups to which a user belongs + * @param {String} userId The user ID. + * @returns {Promise} + */ +export const fetchUserGroups = (userId) => + axios.request({ + method: 'get', + url: getKeystoneBaseUrl(`users/${userId}/groups`), + }); diff --git a/src/api/neutron/agent.js b/src/api/neutron/agent.js new file mode 100644 index 00000000..20a812f3 --- /dev/null +++ b/src/api/neutron/agent.js @@ -0,0 +1,79 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getNeutronBaseUrl from './base'; + +/** + * List agents + * @returns {Promise} + */ +export const fetchAgents = () => + axios.request({ + method: 'get', + url: getNeutronBaseUrl('agents'), + }); + +/** + * Schedule a network to a DHCP agent + * @param {String} agentId The ID of the agent. + * @param {Object} data request body + * @param {String} data.network_id The ID of the network. + * @returns {Promise} + */ +export const addNetworkToDhcpAgent = (agentId, data) => + axios.request({ + method: 'post', + url: getNeutronBaseUrl(`agents/${agentId}/dhcp-networks`), + data, + }); + +/** + * Remove network from a DHCP agent + * @param {String} agentId The ID of the agent. + * @param {String} networkId The ID of the network. + * @returns {Promise} + */ +export const deleteNetworkToDhcpAgent = (agentId, networkId) => + axios.request({ + method: 'delete', + url: getNeutronBaseUrl(`agents/${agentId}/dhcp-networks/${networkId}`), + }); + +/** + * Schedule router to an l3 agent + * @param {String} agentId The ID of the agent. + * @param {Object} data request body + * @param {String} data.router_id The ID of the router. + * @returns {Promise} + */ +export const addRoterToL3Agent = (agentId, data) => + axios.request({ + method: 'post', + url: getNeutronBaseUrl(`agents/${agentId}/l3-routers`), + data, + }); + +/** + * Remove l3 router from an l3 agent + * @param {String} agentId The ID of the agent. + * @param {String} routerId The ID of the router. + * @returns {Promise} + */ +export const deleteL3RouterFromL3Agent = (agentId, routerId) => + axios.request({ + method: 'delete', + url: getNeutronBaseUrl(`agents/${agentId}/l3-routers/${routerId}`), + }); diff --git a/src/api/neutron/availability-zones.js b/src/api/neutron/availability-zones.js new file mode 100644 index 00000000..7fb37f40 --- /dev/null +++ b/src/api/neutron/availability-zones.js @@ -0,0 +1,32 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getNeutronBaseUrl from './base'; + +/** + * List all availability zones + * @param {Object} params request query + * @param {String} params.state Filter the list result by the state of the availability zone, which is either available or unavailable. + * @param {String} params.resource Filter the list result by the resource type of the availability zone. + * @param {String} params.name Filter the list result by the human-readable name of the resource. + * @returns {Promise} + */ +export const fetchListAvailabilityZonesOnNeutron = (params) => + axios.request({ + method: 'get', + url: getNeutronBaseUrl('availability_zones'), + params, + }); diff --git a/src/api/neutron/base.js b/src/api/neutron/base.js new file mode 100644 index 00000000..d30feb56 --- /dev/null +++ b/src/api/neutron/base.js @@ -0,0 +1,23 @@ +// Copyright 2021 99cloud +// +// 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. + +/** + * @param {String} key api url + * @returns {String} + */ +import { neutronBase } from 'utils/constants'; + +const getNeutronBaseUrl = (key) => `${neutronBase()}/${key}`; + +export default getNeutronBaseUrl; diff --git a/src/api/neutron/extensions.js b/src/api/neutron/extensions.js new file mode 100644 index 00000000..5f01de43 --- /dev/null +++ b/src/api/neutron/extensions.js @@ -0,0 +1,27 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getNeutronBaseUrl from './base'; + +/** + * List extensions + * @returns {Promise} + */ +export const fetchListExtensionsOnNeutron = () => + axios.request({ + method: 'get', + url: getNeutronBaseUrl('extensions'), + }); diff --git a/src/api/neutron/floating-ips.js b/src/api/neutron/floating-ips.js new file mode 100644 index 00000000..8ae06f99 --- /dev/null +++ b/src/api/neutron/floating-ips.js @@ -0,0 +1,89 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getNeutronBaseUrl from './base'; + +/** + * Update floating IP + * @param {String} floatingipId The ID of the floating IP address. + * @param {Object} data request body + * @param {Object} data.floatingip A floatingip object. + * @param {String} data.floatingip.port_id The ID of a port associated with the floating IP. + * @param {String} data.floatingip.fixed_ip_address The fixed IP address that is associated with the floating IP. + * @param {String} data.floatingip.description A human-readable description for the resource. Default is an empty string. + * @returns {Promise} + */ +export const updateFloatingIp = (floatingipId, data) => + axios.request({ + method: 'put', + url: getNeutronBaseUrl(`floatingips/${floatingipId}`), + data, + }); + +/** + * List floating IPs + * @param {String} floatingipId The ID of the floating IP address. + * @param {Object} query request query + * @see https://docs.openstack.org/api-ref/network/v2/index.html?expanded=list-floating-ips-detail#floating-ips-floatingips + * @returns {Promise} + */ +export const fetchListFloatingIps = (floatingipId, params) => + axios.request({ + method: 'get', + url: getNeutronBaseUrl(`floatingips/${floatingipId}`), + params, + }); + +/** + * List floating IP port forwardings + * @param {String} floatingipId The ID of the floating IP address. + * @param {Object} query request query + * @see https://docs.openstack.org/api-ref/network/v2/index.html?expanded=list-floating-ips-detail,list-floating-ip-port-forwardings-detail#floating-ips-floatingips + * @returns {Promise} + */ +export const fetchListPortForwardings = (floatingipId, params) => + axios.request({ + method: 'get', + url: getNeutronBaseUrl(`floatingips/${floatingipId}`), + params, + }); + +/** + * Create port forwarding + * @param {String} floatingipId The ID of the floating IP address. + * @param {Object} data request body + * @param {Object} data.port_forwarding A floating IP port forwarding object. + * @returns {Promise} + */ +export const createPortForwarding = (floatingipId, data) => + axios.request({ + method: 'post', + url: getNeutronBaseUrl(`floatingips/${floatingipId}/port_forwardings`), + data, + }); + +/** + * Delete a floating IP port forwarding + * @param {String} floatingipId The ID of the floating IP address. + * @param {String} portForwardingId The ID of the floating IP port forwarding. + */ +export const deletePortForwarding = (floatingipId, portForwardingId) => + axios.request({ + method: 'delete', + url: getNeutronBaseUrl( + `floatingips/${floatingipId}/port_forwardings/${{ portForwardingId }}` + ), + }); diff --git a/src/api/neutron/networks.js b/src/api/neutron/networks.js new file mode 100644 index 00000000..b2513a97 --- /dev/null +++ b/src/api/neutron/networks.js @@ -0,0 +1,72 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getNeutronBaseUrl from './base'; + +/** + * List networks + * @param {Object} params request query + * @param {Boolean} params.admin_state_up Filter the list result by the administrative state of the resource, which is up (true) or down (false). + * @param {Number} params.mtu Filter the network list result by the maximum transmission unit (MTU) value to address fragmentation. Minimum value is 68 for IPv4, and 1280 for IPv6. + * @param {String} params.name Filter the list result by the human-readable name of the resource. + * @param {String} params.project_id Filter the list result by the ID of the project that owns the resource. + * @param {String} params['provider:network_type'] Filter the list result by the type of physical network that this network/segment is mapped to. + * @param {String} params['provider:physical_network'] Filter the list result by the physical network where this network/segment is implemented. + * @param {String} params['provider:segmentation_id'] Filter the list result by the ID of the isolated segment on the physical network. + * @param {String} params.revision_number Filter the list result by the revision number of the resource. + * @param {Boolean} params.shared Filter the network list result based on if the network is shared across all tenants. + * @param {String} params.status Filter the network list result by network status. Values are ACTIVE, DOWN, BUILD or ERROR. + * @returns {Promise} + */ +export const fetchNetworksOnNeutron = (params) => + axios.request({ + method: 'get', + url: getNeutronBaseUrl('networks'), + params, + }); + +/** + * List DHCP agents hosting a network + * @param {String} networkId The ID of the attached network. + * @returns {Promise} + */ +export const fetchListDhcpAgentsOnNeutron = (networkId) => + axios.request({ + method: 'get', + url: getNeutronBaseUrl(`networks/${networkId}/dhcp-agents`), + }); + +/** + * Show network details + * @param {String} networkId The ID of the attached network. + * @returns {Promise} + */ +export const fetchNetworkDetailsOnNeutron = (networkId) => + axios.request({ + method: 'get', + url: getNeutronBaseUrl(`networks/${networkId}`), + }); + +/** + * Show Network IP Availability + * @param {String} networkId The ID of the attached network. + * @returns {Promise} + */ +export const fetchNetworkIpAvailabilityDetailsOnNeutron = (networkId) => + axios.request({ + method: 'get', + url: getNeutronBaseUrl(`network-ip-availabilities/${networkId}`), + }); diff --git a/src/api/neutron/ports.js b/src/api/neutron/ports.js new file mode 100644 index 00000000..dcb84866 --- /dev/null +++ b/src/api/neutron/ports.js @@ -0,0 +1,58 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getNeutronBaseUrl from './base'; + +/** + * List ports + * @param {Object} params request query + * @param {String} params.device_id Filter the port list result by the ID of the device that uses this port. + * @param {String} params.device_owner Filter the port result list by the entity type that uses this port. + * @see https://docs.openstack.org/api-ref/network/v2/index.html?expanded=list-ports-detail#ports + */ +export const fetchPortsOnNeutron = (params) => + axios.request({ + method: 'get', + url: getNeutronBaseUrl('ports'), + params, + }); + +/** + * Update port + * @param {String} portId The ID of the port. + * @param {Object} data request body + * @param {String} data.port A port object. + * @see https://docs.openstack.org/api-ref/network/v2/index.html?expanded=update-port-detail#ports + */ +export const updatePortOnNeutron = (portId, data) => + axios.request({ + method: 'put', + url: getNeutronBaseUrl(`ports/${portId}`), + data, + }); + +/** + * Create port + * @param {Object} data request body + * @param {String} data.port A port object. + * @see https://docs.openstack.org/api-ref/network/v2/index.html?expanded=create-port-detail#ports + */ +export const createPortOnNeutron = (data) => + axios.request({ + method: 'post', + url: getNeutronBaseUrl('ports'), + data, + }); diff --git a/src/api/neutron/qos-policies.js b/src/api/neutron/qos-policies.js new file mode 100644 index 00000000..1d4ce27f --- /dev/null +++ b/src/api/neutron/qos-policies.js @@ -0,0 +1,144 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getNeutronBaseUrl from './base'; + +/** + * Update QoS policy + * @param {String} policyId The ID of the QoS policy. + * @param {Object} data request body + * @param {Object} data.policy A QoS policy object. + * @param {String} data.policy.description A human-readable description for the resource. Default is an empty string. + * @param {Boolean} data.policy.is_default If true, the QoS policy is the default policy. + * @param {Boolean} data.policy.shared Set to true to share this policy with other projects. Default is false. + * @param {String} data.policy.name Human-readable name of the resource. + * @returns {Promise} + */ +export const updateQosPolicy = (policyId, data) => + axios.request({ + method: 'put', + url: getNeutronBaseUrl(`qos/policies/${policyId}`), + data, + }); + +/** + * Create bandwidth limit rule + * @param {String} policyId The ID of the QoS policy. + * @param {Object} data request body + * @param {Object} data.bandwidth_limit_rule A bandwidth_limit_rule object. + * @param {Number} data.bandwidth_limit_rule.max_kbps The maximum KBPS (kilobits per second) value. + * @param {Number} data.bandwidth_limit_rule.max_burst_kbps The maximum burst size (in kilobits). Default is 0. + * @param {Boolean} data.bandwidth_limit_rule.direction Valid values are egress and ingress. Default value is egress. + * @returns {Promise} + */ +export const createBandwidthLimitRulesQosPolicy = (policyId, data) => + axios.request({ + method: 'post', + url: getNeutronBaseUrl(`qos/policies/${policyId}/bandwidth_limit_rules`), + data, + }); + +/** + * Update bandwidth limit rule + * @param {String} policyId The ID of the QoS policy. + * @param {Object} ruleId The ID of the QoS rule. + * @param {Object} data request body + * @param {Object} data.bandwidth_limit_rule A bandwidth_limit_rule object. + * @param {Number} data.bandwidth_limit_rule.max_kbps The maximum KBPS (kilobits per second) value. + * @param {Number} data.bandwidth_limit_rule.max_burst_kbps The maximum burst size (in kilobits). Default is 0. + * @param {Boolean} data.bandwidth_limit_rule.direction Valid values are egress and ingress. Default value is egress. + * @returns {Promise} + */ +export const updateBandwidthLimitRulesQosPolicy = (policyId, ruleId, data) => + axios.request({ + method: 'put', + url: getNeutronBaseUrl( + `qos/policies/${policyId}/bandwidth_limit_rules/${ruleId}` + ), + data, + }); + +/** + * Delete bandwidth limit rule + * @param {String} policyId The ID of the QoS policy. + * @param {Object} ruleId The ID of the QoS rule. + * @returns {Promise} + */ +export const deleteBandwidthLimitRulesQosPolicy = (policyId, ruleId) => + axios.request({ + method: 'delete', + url: getNeutronBaseUrl( + `qos/policies/${policyId}/bandwidth_limit_rules/${ruleId}` + ), + }); + +/** + * Create DSCP marking rule + * @param {String} policyId The ID of the QoS policy. + * @param {Object} data request body + * @param {Object} data.dscp_marking_rule A dscp_marking_rule object. + * @param {Number} data.dscp_marking_rule.dscp_mark The DSCP mark value. + * @returns {Promise} + */ +export const createDscpMarkingRuleQosPolicy = (policyId, data) => + axios.request({ + method: 'post', + url: getNeutronBaseUrl(`qos/policies/${policyId}/dscp_marking_rules`), + data, + }); + +/** + * Update DSCP marking rule + * @param {String} policyId The ID of the QoS policy. + * @param {String} dscpRuleId The ID of the DSCP rule. + * @param {Object} data request body + * @param {Object} data.dscp_marking_rule A dscp_marking_rule object. + * @param {Number} data.dscp_marking_rule.dscp_mark The DSCP mark value. + * @returns {Promise} + */ +export const updateDscpMarkingRuleQosPolicy = (policyId, dscpRuleId, data) => + axios.request({ + method: 'put', + url: getNeutronBaseUrl( + `qos/policies/${policyId}/dscp_marking_rules/${dscpRuleId}` + ), + data, + }); + +/** + * Delete DSCP marking rule + * @param {String} policyId The ID of the QoS policy. + * @param {String} dscpRuleId The ID of the DSCP rule. + * @returns {Promise} + */ +export const deleteDscpMarkingRuleQosPolicy = (policyId, dscpRuleId) => + axios.request({ + method: 'delete', + url: getNeutronBaseUrl( + `qos/policies/${policyId}/dscp_marking_rules/${dscpRuleId}` + ), + }); + +/** + * Show QoS policy details + * @param {String} policyId The ID of the QoS policy. + * @returns {Promise} + */ +export const fetchQosPolicieDetailsOnNeutron = (policyId) => + axios.request({ + method: 'get', + url: getNeutronBaseUrl(`qos/policies/${policyId}`), + }); diff --git a/src/api/neutron/quotas.js b/src/api/neutron/quotas.js new file mode 100644 index 00000000..4ce79cf9 --- /dev/null +++ b/src/api/neutron/quotas.js @@ -0,0 +1,49 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getNeutronBaseUrl from './base'; + +/** + * Show quota details for a tenant + * @param {String} projectId The ID of the project. + * @returns {Promise} + */ +export const fetchQuotaDetails = (projectId) => + axios.request({ + method: 'get', + url: getNeutronBaseUrl(`quotas/${projectId}/details`), + }); + +/** + * Update quota for a project + * @param {String} projectId The ID of the project. + * @param {Object} data request body + * @param {Object} data.quota A quota object. + * @param {String} data.quota.floatingip The number of floating IP addresses allowed for each project. A value of -1 means no limit. + * @param {String} data.quota.network The number of networks allowed for each project. A value of -1 means no limit. + * @param {String} data.quota.router The number of routers allowed for each project. A value of -1 means no limit. + * @param {String} data.quota.subnet The number of subnets allowed for each project. A value of -1 means no limit. + * @param {String} data.quota.security_group The number of security groups allowed for each project. A value of -1 means no limit. + * @param {String} data.quota.security_group_rule The number of security group rules allowed for each project. A value of -1 means no limit. + * @param {String} data.quota.firewall_group A firewall group can have a firewall policy for ingress traffic and/or a firewall policy for egress traffic. + * @returns {Promise} + */ +export const updateQuotaDetails = (projectId, data) => + axios.request({ + method: 'put', + url: getNeutronBaseUrl(`quotas/${projectId}`), + data, + }); diff --git a/src/api/neutron/routers.js b/src/api/neutron/routers.js new file mode 100644 index 00000000..478a534c --- /dev/null +++ b/src/api/neutron/routers.js @@ -0,0 +1,102 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getNeutronBaseUrl from './base'; + +/** + * List routers + * @param {Object} params request query + * @param {String} params.project_id Filter the list result by the ID of the project that owns the resource. + * @see https://docs.openstack.org/api-ref/network/v2/index.html?expanded=list-dhcp-agents-hosting-a-network-detail,show-subnet-details-detail,list-routers-detail#id5 + * @returns {Promise} + */ +export const fetchListRoutersOnNeutron = (params) => + axios.request({ + method: 'get', + url: getNeutronBaseUrl('routers'), + params, + }); + +/** + * Show router details + * @param {String} routerId The ID of the router. + * @returns {Promise} + */ +export const fetchRouterDetailsOnNeutron = (routerId) => + axios.request({ + method: 'get', + url: getNeutronBaseUrl(`routers/${routerId}`), + }); + +/** + * Add extra routes to router + * @param {String} routerId The ID of the router. + * @param {Object} data request body + * @param {Object} data.router The router object. + * @param {Array} data.router.routes The extra routes configuration for L3 router. + * @returns {Promise} + */ +export const addExtraRoutesToRouterOnNeutron = (routerId, data) => + axios.request({ + method: 'put', + url: getNeutronBaseUrl(`routers/${routerId}/add_extraroutes`), + data, + }); + +/** + * Remove extra routes from router + * @param {String} routerId The ID of the router. + * @param {Object} data request body + * @param {Object} data.router The router object. + * @param {Array} data.router.routes The extra routes configuration for L3 router. + * @returns {Promise} + */ +export const removeExtraRoutesFromRouterOnNeutron = (routerId, data) => + axios.request({ + method: 'put', + url: getNeutronBaseUrl(`routers/${routerId}/remove_extraroutes`), + data, + }); + +/** + * Add interface to router + * @param {String} routerId The ID of the router. + * @param {Object} data request body + * @param {Object} data.subnet_id The ID of the subnet. One of subnet_id or port_id must be specified. + * @param {Array} data.port_id The ID of the port. One of subnet_id or port_id must be specified. + * @returns {Promise} + */ +export const addInterfaceToRouterOnNeutron = (routerId, data) => + axios.request({ + method: 'put', + url: getNeutronBaseUrl(`routers/${routerId}/add_router_interface`), + data, + }); + +/** + * Remove interface from router + * @param {String} routerId The ID of the router. + * @param {Object} data request body + * @param {Object} data.subnet_id The ID of the subnet. One of subnet_id or port_id must be specified. + * @param {Array} data.port_id The ID of the port. One of subnet_id or port_id must be specified. + * @returns {Promise} + */ +export const removeInterfaceFromRouterOnNeutron = (routerId, data) => + axios.request({ + method: 'put', + url: getNeutronBaseUrl(`routers/${routerId}/remove_router_interface`), + data, + }); diff --git a/src/api/neutron/security-groups.js b/src/api/neutron/security-groups.js new file mode 100644 index 00000000..afc262e9 --- /dev/null +++ b/src/api/neutron/security-groups.js @@ -0,0 +1,28 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getNeutronBaseUrl from './base'; + +/** + * Show security group + * @param {securityGroupId} params The security group id + * @returns {Promise} + */ +export const fetchSecurityGroupsDetails = (securityGroupId) => + axios.request({ + method: 'get', + url: getNeutronBaseUrl(`security-groups/${securityGroupId}`), + }); diff --git a/src/api/neutron/subnets.js b/src/api/neutron/subnets.js new file mode 100644 index 00000000..13b86442 --- /dev/null +++ b/src/api/neutron/subnets.js @@ -0,0 +1,69 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getNeutronBaseUrl from './base'; + +/** + * List subnets + * @param {Object} params request query + * @returns {Promise} + */ +export const fetchListSubnetsOnNeutron = (params) => + axios.request({ + method: 'get', + url: getNeutronBaseUrl('subnets'), + params, + }); + +/** + * Show subnet details + * @param {String} subnetId The ID of the subnet. + * @returns {Promise} + */ +export const fetchSubnetDetailsOnNeutron = (subnetId) => + axios.request({ + method: 'get', + url: getNeutronBaseUrl(`subnets/${subnetId}`), + }); + +/** + * Create subnet + * @param {Object} data request body + * @param {Object} data.subnet A subnet object. + * @see https://docs.openstack.org/api-ref/network/v2/index.html?expanded=list-dhcp-agents-hosting-a-network-detail,show-subnet-details-detail,list-routers-detail,create-subnet-detail#id5 + * @returns {Promise} + */ +export const createSubnetOnNeutron = (data) => + axios.request({ + method: 'post', + url: getNeutronBaseUrl('subnets'), + data, + }); + +/** + * Update subnet + * @param {String} subnetId The ID of the subnet. + * @param {Object} data request body + * @param {Object} data.subnet A subnet object. + * @see https://docs.openstack.org/api-ref/network/v2/index.html?expanded=list-ports-detail,update-subnet-detail#ports + * @returns {Promise} + */ +export const updateSubnetOnNeutron = (subnetId, data) => + axios.request({ + method: 'put', + url: getNeutronBaseUrl(`subnets/${subnetId}`), + data, + }); diff --git a/src/api/neutron/vpn.js b/src/api/neutron/vpn.js new file mode 100644 index 00000000..678183d2 --- /dev/null +++ b/src/api/neutron/vpn.js @@ -0,0 +1,108 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getNeutronBaseUrl from './base'; + +/** + * Update IKE policy + * @param {String} ikepolicyId The ID of the IKE policy. + * @param {Object} data request body + * @param {Object} data.ikepolicy An ikepolicy object. + * @see https://docs.openstack.org/api-ref/network/v2/index.html?expanded=update-ike-policy-detail#vpnaas-2-0-vpn-vpnservices-ikepolicies-ipsecpolicies-endpoint-groups-ipsec-site-connections + * @returns {Promise} + */ +export const updateIkePolicyOnNeutron = (ikepolicyId, data) => + axios.request({ + method: 'put', + url: getNeutronBaseUrl(`vpn/ikepolicies/${ikepolicyId}`), + data, + }); + +/** + * Update IPsec connection + * @param {String} connectionId The ID of the IPsec site-to-site connection. + * @param {Object} data request body + * @param {Object} data.ipsec_site_connection An ipsec_site_connection object. + * @see https://docs.openstack.org/api-ref/network/v2/index.html?expanded=update-ipsec-connection-detail#vpnaas-2-0-vpn-vpnservices-ikepolicies-ipsecpolicies-endpoint-groups-ipsec-site-connections + * @returns {Promise} + */ +export const updateIpConnectionOnNeutron = (connectionId, data) => + axios.request({ + method: 'put', + url: getNeutronBaseUrl(`vpn/ipsec-site-connections/${connectionId}`), + data, + }); + +/** + * Show IPsec connection + * @param {String} connectionId The ID of the IPsec site-to-site connection. + * @param {Object} params request query + * @returns {Promise} + */ +export const fetchIpConnectionDetailsOnNeutron = (connectionId, params) => + axios.request({ + method: 'get', + url: getNeutronBaseUrl(`vpn/ipsec-site-connections/${connectionId}`), + params, + }); + +/** + * Update VPN endpoint group + * @param {String} endpointGroupId The ID of the VPN endpoint group. + * @param {Object} data request body + * @param {Object} data.endpoint_group An ipsec_site_connection object. + * @param {Object} data.endpoint_group.name Human-readable name of the resource. Default is an empty string. + * @param {Object} data.endpoint_group.description A human-readable description for the resource. Default is an empty string. + * @returns {Promise} + */ +export const updateEndpointGroupOnNeutron = (endpointGroupId, data) => + axios.request({ + method: 'put', + url: getNeutronBaseUrl(`vpn/endpoint-groups/${endpointGroupId}`), + data, + }); + +/** + * Update VPN service + * @param {String} serviceId The ID of the VPN service. + * @param {Object} data request body + * @param {Object} data.vpnservice A vpnservice object. + * @param {Object} data.vpnservice.name Human-readable name of the resource. Default is an empty string. + * @param {Object} data.vpnservice.description A human-readable description for the resource. Default is an empty string. + * @param {Boolean} data.vpnservice.admin_state_up The administrative state of the resource, which is up (true) or down (false). + * @returns {Promise} + */ +export const updateVpnServiceNeutron = (serviceId, data) => + axios.request({ + method: 'put', + url: getNeutronBaseUrl(`vpn/vpnservices/${serviceId}`), + data, + }); + +/** + * Update IPsec policy + * @param {String} ipsecpolicyId The ID of the IPsec policy. + * @param {Object} data request body + * @param {Object} data.ipsecpolicy An ipsecpolicy object. + * @see https://docs.openstack.org/api-ref/network/v2/index.html?expanded=update-ipsec-policy-detail#vpnaas-2-0-vpn-vpnservices-ikepolicies-ipsecpolicies-endpoint-groups-ipsec-site-connections + * @returns {Promise} + */ +export const updateIpsecPolicyOnNeutron = (ipsecpolicyId, data) => + axios.request({ + method: 'put', + url: getNeutronBaseUrl(`vpn/ipsecpolicies/${ipsecpolicyId}`), + data, + }); diff --git a/src/api/nova/base.js b/src/api/nova/base.js new file mode 100644 index 00000000..0d4a3366 --- /dev/null +++ b/src/api/nova/base.js @@ -0,0 +1,23 @@ +// Copyright 2021 99cloud +// +// 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. + +/** + * @param {String} key api url + * @returns {String} + */ +import { novaBase } from 'utils/constants'; + +const getNovaBaseUrl = (key) => `${novaBase()}/${key}`; + +export default getNovaBaseUrl; diff --git a/src/api/nova/flavor.js b/src/api/nova/flavor.js new file mode 100644 index 00000000..43347fa6 --- /dev/null +++ b/src/api/nova/flavor.js @@ -0,0 +1,116 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getNovaBaseUrl from './base'; + +/** + * List Flavor Access Information For Given Flavor + * @param {String} flavorId The ID of the flavor. + * @returns {Promise} + */ +export const fetchFlavorAccessinfomation = (flavorId) => + axios.request({ + method: 'get', + url: getNovaBaseUrl(`flavors/${flavorId}/os-flavor-access`), + }); + +/** + * Create Flavor + * @param {Object} data request body + * @param {Object} data.flavor A flavor is a combination of memory, disk size, and CPUs. + * @param {String} data.flavor.name The display name of a flavor. + * @param {String} data.flavor.description A free form description of the flavor. + * @param {String} data.flavor.id The ID of the flavor. + * @param {Number} data.flavor.ram The amount of RAM a flavor has, in MiB. + * @param {Number} data.flavor.disk The size of the root disk that will be created in GiB. + * @param {Number} data.flavor.vcpus The number of virtual CPUs that will be allocated to the server. + * @param {Number} data.flavor.swap The size of a dedicated swap disk that will be allocated, in MiB. + * @param {Number} data.flavor['OS-FLV-EXT-DATA:ephemeral'] The size of the ephemeral disk that will be created, in GiB. + * @param {Number} data.flavor.rxtx_factor The receive / transmit factor (as a float) that will be set on ports if the network backend supports the QOS extension. + * @param {Boolean} data.flavor.['os-flavor-access:is_public'] Whether the flavor is public + * @returns {Promise} + */ +export const createFlavor = (data) => + axios.request({ + method: 'post', + url: getNovaBaseUrl('flavors'), + data, + }); + +/** + * Add Or Remove Flavor Access To Tenant + * @param {String} flavorId The ID of the flavor. + * @param {Object} data request body + * @param {Object} data.addTenantAccess The action. + * @param {String} data.addTenantAccess.tenant The UUID of the tenant in a multi-tenancy cloud. + * @param {String} data.removeTenantAccess The action. + * @param {String} data.removeTenantAccess.tenant The UUID of the tenant in a multi-tenancy cloud. + * @returns {Promise} + */ +export const addOrDeleteFlavorAccessToTenant = (flavorId, data) => + axios.request({ + method: 'post', + url: getNovaBaseUrl(`flavors/${flavorId}/action`), + data, + }); + +/** + * Create Extra Specs For A Flavor + * @param {String} flavorId The ID of the flavor. + * @param {Object} data request body + * @param {Object} data.extra_specs A dictionary of the flavor’s extra-specs key-and-value pairs. + * @param {String} data.extra_specs.key The extra spec key of a flavor. + * @param {String} data.extra_specs.value The extra spec value of a flavor. + * @returns {Promise} + */ +export const createExtraSpecsForFlavor = (flavorId, data) => + axios.request({ + method: 'post', + url: getNovaBaseUrl(`flavors/${flavorId}/os-extra_specs`), + data, + }); + +/** + * Update An Extra Spec For A Flavor + * @param {String} flavorId The ID of the flavor. + * @param {Object} flavorExtraSpecKey The extra spec key for the flavor. + * @param {Object} data request body + * @param {String} data.key The extra spec key of a flavor. + * @param {String} data.value The extra spec value of a flavor. + * @returns {Promise} + */ +export const updateExtraSpecsForFlavor = (flavorId, flavorExtraSpecKey, data) => + axios.request({ + method: 'put', + url: getNovaBaseUrl( + `flavors/${flavorId}/os-extra_specs/${flavorExtraSpecKey}` + ), + data, + }); + +/** + * Delete An Extra Spec For A Flavor + * @param {String} flavorId The ID of the flavor. + * @param {Object} flavorExtraSpecKey The extra spec key for the flavor. + * @returns {Promise} + */ +export const deleteExtraSpecsForFlavor = (flavorId, flavorExtraSpecKey) => + axios.request({ + method: 'delete', + url: getNovaBaseUrl( + `flavors/${flavorId}/os-extra_specs/${flavorExtraSpecKey}` + ), + }); diff --git a/src/api/nova/os-aggregates.js b/src/api/nova/os-aggregates.js new file mode 100644 index 00000000..778e4ca6 --- /dev/null +++ b/src/api/nova/os-aggregates.js @@ -0,0 +1,32 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getNovaBaseUrl from './base'; + +/** + * Add Host, Remove Host, Create Or Update Aggregate Metadata + * @param {Object} data request body + * @param {Object} data.add_host when add host + * @param {Object} data.remove_host when remove host + * @param {Object} data.set_metadata when set metadata + * @returns {Promise} + */ +export const toggleChangeAggregate = (aggregateId, data) => + axios.request({ + method: 'get', + url: getNovaBaseUrl(`os-aggregates/${aggregateId}/action`), + data, + }); diff --git a/src/api/nova/os-hypervisors.js b/src/api/nova/os-hypervisors.js new file mode 100644 index 00000000..417fed09 --- /dev/null +++ b/src/api/nova/os-hypervisors.js @@ -0,0 +1,38 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getNovaBaseUrl from './base'; + +/** + * List Hypervisors Details + * @returns {Promise} + */ +export const fetchOsHypervisorsDetails = () => + axios.request({ + method: 'get', + url: getNovaBaseUrl('os-hypervisors/detail'), + }); + +/** + * Show Hypervisor Details + * @param {String} hypervisorId path + * @returns {Promise} + */ +export const fetchOsHypervisorDetails = (hypervisorId) => + axios.request({ + method: 'get', + url: getNovaBaseUrl(`os-hypervisors/${hypervisorId}`), + }); diff --git a/src/api/nova/os-quota-sets.js b/src/api/nova/os-quota-sets.js new file mode 100644 index 00000000..a982e5ff --- /dev/null +++ b/src/api/nova/os-quota-sets.js @@ -0,0 +1,45 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getNovaBaseUrl from './base'; + +/** + * Show The Detail of Quota + * @returns {Promise} + */ +export const fetchOsQuotaSetsDetails = (tenantId) => + axios.request({ + method: 'get', + url: getNovaBaseUrl(`os-quota-sets/${tenantId}/detail`), + }); + +/** + * Update Quotas + * @param {String} tenantId The UUID of the tenant in a multi-tenancy cloud. + * @param {Object} data request body + * @param {Object} data.quota_set A quota object. + * @param {String} data.quota_set.instances The number of allowed servers for each tenant. + * @param {String} data.quota_set.cores The number of allowed server cores for each tenant. + * @param {String} data.quota_set.ram The amount of allowed server RAM, in MiB, for each tenant. + * @param {String} data.quota_set.server_groups The number of allowed server groups for each tenant. + * @returns {Promise} + */ +export const updateQuotaSets = (tenantId, data) => + axios.request({ + method: 'put', + url: getNovaBaseUrl(`os-quota-sets/${tenantId}`), + data, + }); diff --git a/src/api/nova/os-service.js b/src/api/nova/os-service.js new file mode 100644 index 00000000..526c07fe --- /dev/null +++ b/src/api/nova/os-service.js @@ -0,0 +1,47 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getNovaBaseUrl from './base'; + +/** + * List Compute Services + * @param {Object} params request query + * @param {String} params.binary Filter the service list result by binary name of the service. example : nova-compute + * @param {String} params.host Filter the service list result by the host name. + * @returns {Promise} + */ +export const fetchOsServices = (params) => + axios.request({ + method: 'get', + url: getNovaBaseUrl('os-services'), + params, + }); + +/** + * Update Compute Service + * @param {String} serviceId The id of the service as a uuid. + * @param {Object} data request body + * @param {String} data.status The status of the service. One of enabled or disabled. + * @param {String} data.disabled_reason The reason for disabling a service. + * @param {Boolean} data.forced_down forced_down is a manual override to tell nova that the service in question has been fenced manually by the operations team. + * @returns {Promise} + */ +export const updateComputeService = (serviceId, data) => + axios.request({ + method: 'put', + url: getNovaBaseUrl(`os-services/${serviceId}`), + data, + }); diff --git a/src/api/nova/server.js b/src/api/nova/server.js new file mode 100644 index 00000000..ddbdea13 --- /dev/null +++ b/src/api/nova/server.js @@ -0,0 +1,202 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getNovaBaseUrl from './base'; + +/** + * Create server + * @param {Object} data request body + * @param {Object} data.server A server object + * @param {String} data.server.availability_zone availability_zone + * @param {Array[Object]} data.server.block_device_mapping_v2 example : [{boot_index:0,delete_on_termination:true,destination_type:"volume",source_type:"image",uuid:"66e129c5-7386-4620-b02a-8e578405e735",volume_size:10,volume_type:"9bcdbe9a-2e06-430f-a6a6-ba77c507cf51"}] + * @param {String} data.server.flavorRef The flavor reference, as an ID (including a UUID) or full URL, for the flavor for your server instance. + * @param {String} data.server.imageRef imageRef + * @param {String} data.server.key_name key_name + * @param {String} data.server.adminPass admins password + * @param {Number} data.server.min_count when count > 1 + * @param {Number} data.server.max_count when count > 1 + * @param {String} data.server.return_reservation_id when count > 1 + * @param {String} data.server.name The server name + * @param {String} data.server.hypervisor_hostname when physicalNodeType.value !== "smart" + * @param {String} data.server.user_data Configuration information or scripts to use upon launch. Must be Base64 encoded. Restricted to 65535 bytes. + * @param {Object} data.server["OS-SCH-HNT:scheduler_hints"] example : {group: "xxxxx"} + * @param {Array[Object]} data.server.networks example : [{uuid: "xxxx"}] + * @param {Array[Object]} data.server.security_groups example : [{name: "xxxx"}] + * @returns {Promise} + */ +export const createServer = (data) => + axios.request({ + method: 'post', + url: getNovaBaseUrl('servers'), + data, + }); + +/** + * Delete server + * @param {String} id The UUID of the server. + * @returns {Promise} + */ +export const deleteServer = (id) => + axios.request({ + method: 'delete', + url: getNovaBaseUrl(`servers/${id}`), + }); + +/** + * List Servers + * @param {Object} params request query + * @param {String} params.reservation_id A reservation id as returned by a servers multiple create call. + * @returns {Promise} + */ +export const fetchListServersOnNova = (params) => + axios.request({ + method: 'get', + url: getNovaBaseUrl('servers'), + params, + }); + +/** + * Show Server Details + * @param {String} serverId The UUID of the server. + * @param {Object} params request query + * @returns {Promise} + */ +export const fetchServerDetails = (serverId, params) => + axios.request({ + method: 'get', + url: getNovaBaseUrl(`servers/${serverId}`), + params, + }); + +/** + * Create Console + * @param {String} serverId The UUID of the server. + * @param {Object} data request body + * @param {Object} data.remote_console The remote console object. + * @param {String} data.remote_console.protocol The protocol of remote console. + * @param {String} data.remote_console.type The type of remote console. + * @returns {Promise} + */ +export const createConsoleOnServer = (serverId, data) => + axios.request({ + method: 'post', + url: getNovaBaseUrl(`servers/${serverId}/remote-consoles`), + data, + }); + +/** + * Servers - run an administrative action + * @param {String} serverId The UUID of the server. + * @param {Object} data request body + * @param {String} data.injectNetworkInfo Inject Network Information (injectNetworkInfo Action + * @param {String} data.migrate The action to cold migrate a server. + * @returns {Promise} + */ +export const serverActionOnNova = (serverId, data) => + axios.request({ + method: 'post', + url: getNovaBaseUrl(`servers/${serverId}/action`), + data, + }); + +/** + * List Port Interfaces + * @param {String} serverId The UUID of the server. + * @returns {Promise} + */ +export const fetchListPortInterfaces = (serverId) => + axios.request({ + method: 'get', + url: getNovaBaseUrl(`servers/${serverId}/os-interface`), + }); + +/** + * Create Interface + * @param {String} serverId The UUID of the server. + * @param {Object} data request body + * @param {Object} data.interfaceAttachment Specify the interfaceAttachment action in the request body. + * @param {Object} data.ip_address The IP address. It is required when fixed_ips is specified. + * @param {Object} data.port_id The ID of the port for which you want to create an interface. + * @param {Object} data.net_id The ID of the network for which you want to create a port interface. + * @param {Object} data.fixed_ips Fixed IP addresses. + * @param {Object} data.tag A device role tag that can be applied to a network interface when attaching it to the VM. + * @returns {Promise} + */ +export const createOsInterfaces = (serverId, data) => + axios.request({ + method: 'post', + url: getNovaBaseUrl(`servers/${serverId}/os-interface`), + data, + }); + +/** + * Detach Interface + * @param {String} serverId The UUID of the server. + * @param {String} portId The UUID of the port. + * @returns {Promise} + */ +export const deletePortInterfaces = (serverId, portId) => + axios.request({ + method: 'delete', + url: getNovaBaseUrl(`servers/${serverId}/os-interface/${portId}`), + }); + +/** + * List volume attachments for an instance + * @param {String} serverId The UUID of the server. + * @param {Object} params request query + * @param {Number} params.limit max_limit + * @param {Number} params.offset offset is where to start in the list + * @returns {Promise} + */ +export const fetchVolumeAttachments = (serverId, params) => + axios.request({ + method: 'get', + url: getNovaBaseUrl(`servers/${serverId}/os-volume_attachments`), + params, + }); + +/** + * Attach a volume to an instance + * @param {String} serverId The UUID of the server. + * @param {Object} data The UUID of the port. + * @param {Object} data.volumeAttachment A dictionary representation of a volume attachment containing the fields device and volumeId. + * @param {Object} data.volumeAttachment.volumeId The UUID of the volume to attach. + * @param {Object} data.volumeAttachment.device Name of the device. + * @param {Object} data.volumeAttachment.tag A device role tag that can be applied to a volume when attaching it to the VM. + * @param {Boolean} data.volumeAttachment.delete_on_termination To delete the attached volume when the server is destroyed. + * @returns {Promise} + */ +export const attachVolumeOnInstance = (serverId, data) => + axios.request({ + method: 'post', + url: getNovaBaseUrl(`servers/${serverId}/os-volume_attachments}`), + data, + }); + +/** + * Detach a volume from an instance + * @param {String} serverId The UUID of the server. + * @param {Object} volumeId The UUID of the volume to detach. + * @returns {Promise} + */ +export const deleteVolumeOnInstance = (serverId, volumeId) => + axios.request({ + method: 'delete', + url: getNovaBaseUrl( + `servers/${serverId}/os-volume_attachments/${volumeId}}` + ), + }); diff --git a/src/api/octavia/base.js b/src/api/octavia/base.js new file mode 100644 index 00000000..85f0e052 --- /dev/null +++ b/src/api/octavia/base.js @@ -0,0 +1,23 @@ +// Copyright 2021 99cloud +// +// 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. + +/** + * @param {String} key api url + * @returns {String} + */ +import { octaviaBase } from 'utils/constants'; + +const getOctaviaBaseUrl = (key) => `${octaviaBase()}/${key}`; + +export default getOctaviaBaseUrl; diff --git a/src/api/octavia/lbaas.js b/src/api/octavia/lbaas.js new file mode 100644 index 00000000..cc08b198 --- /dev/null +++ b/src/api/octavia/lbaas.js @@ -0,0 +1,132 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getOctaviaBaseUrl from './base'; + +/** + * Update a Load Balancer + * @param {String} loadbalancerId The ID of the load balancer to query. + * @param {Object} data request body + * @param {Object} data.loadbalancer A load balancer object. + * @param {Boolean} data.loadbalancer.admin_state_up The administrative state of the resource, which is up (true) or down (false). + * @param {String} data.loadbalancer.name Human-readable name of the resource. + * @param {Array} data.loadbalancer.tags A list of simple strings assigned to the resource. + * @param {String} data.loadbalancer.vip_qos_policy_id The ID of the QoS Policy which will apply to the Virtual IP (VIP). + * @returns {Promise} + */ +export const updateLoadBalancer = (loadbalancerId, data) => + axios.request({ + method: 'put', + url: getOctaviaBaseUrl(`lbaas/loadbalancers/${loadbalancerId}`), + data, + }); + +/** + * List Load Balancers + * @param {Object} params request query + * @param {String} params.project_id The ID of the project to query. + * @param {String} params.fields A load balancer object. + * @returns {Promise} + */ +export const fetchListLoadBalancers = (params) => + axios.request({ + method: 'get', + url: getOctaviaBaseUrl('lbaas/loadbalancers'), + params, + }); + +/** + * Show Load Balancer details + * @param {String} loadbalancerId The ID of the load balancer to query. + * @param {Object} params request query + * @param {String} params.fields A load balancer object. + * @returns {Promise} + */ +export const fetchLoadBalancerDetails = (loadbalancerId, params) => + axios.request({ + method: 'get', + url: getOctaviaBaseUrl(`lbaas/loadbalancers/${loadbalancerId}`), + params, + }); + +/** + * Remove a Load Balancer + * @param {String} loadbalancerId The ID of the load balancer to query. + * @param {Object} params request query + * @param {Boolean} params.cascade If true will delete all child objects of the load balancer. + * @returns {Promise} + */ +export const deleteLoadBalancer = (loadbalancerId, params) => + axios.request({ + method: 'delete', + url: getOctaviaBaseUrl(`lbaas/loadbalancers/${loadbalancerId}`), + params, + }); + +/** + * Create Member + * @param {String} poolId The ID of the pool to query. + * @param {Object} data request body + * @param {Object} data.member The member object. + * @returns {Promise} + */ +export const createMemberOnOctavia = (poolId, data) => + axios.request({ + method: 'post', + url: getOctaviaBaseUrl(`lbaas/pools/${poolId}/members`), + data, + }); + +/** + * Batch Update Members + * @param {String} poolId The ID of the pool to query. + * @param {Object} data request body + * @param {Object} data.members The members object. + * @returns {Promise} + */ +export const batchUpdateMembersOnOctavia = (poolId, data) => + axios.request({ + method: 'put', + url: getOctaviaBaseUrl(`lbaas/pools/${poolId}/members`), + data, + }); + +/** + * Update A Member + * @param {String} poolId The ID of the pool to query. + * @param {String} memberId The ID of the member to query. + * @param {Object} data request body + * @param {Object} data.member The member object. + * @returns {Promise} + */ +export const updateAMemberOnOctavia = (poolId, memberId, data) => + axios.request({ + method: 'put', + url: getOctaviaBaseUrl(`lbaas/pools/${poolId}/members/${memberId}`), + data, + }); + +/** + * Delete A Member + * @param {String} poolId The ID of the pool to query. + * @param {String} memberId The ID of the member to query. + * @returns {Promise} + */ +export const deleteAMemberOnOctavia = (poolId, memberId) => + axios.request({ + method: 'delete', + url: getOctaviaBaseUrl(`lbaas/pools/${poolId}/members/${memberId}`), + }); diff --git a/src/api/octavia/pools.js b/src/api/octavia/pools.js new file mode 100644 index 00000000..db37880a --- /dev/null +++ b/src/api/octavia/pools.js @@ -0,0 +1,28 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getOctaviaBaseUrl from './base'; + +/** + * Show Pool Details + * @param {Object} poolId The ID of the pool to query. + * @returns {Promise} + */ +export const fetchPoolDetailsOnOctavia = (poolId) => + axios.request({ + method: 'get', + url: getOctaviaBaseUrl(`pools/${poolId}`), + }); diff --git a/src/api/panko/base.js b/src/api/panko/base.js new file mode 100644 index 00000000..e3b159d3 --- /dev/null +++ b/src/api/panko/base.js @@ -0,0 +1,23 @@ +// Copyright 2021 99cloud +// +// 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. + +/** + * @param {String} key api url + * @returns {String} + */ +import { pankoBase } from 'utils/constants'; + +const getPankoBaseUrl = (key) => `${pankoBase()}/${key}`; + +export default getPankoBaseUrl; diff --git a/src/api/panko/event.js b/src/api/panko/event.js new file mode 100644 index 00000000..faa139a1 --- /dev/null +++ b/src/api/panko/event.js @@ -0,0 +1,50 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getPankoBaseUrl from './base'; + +/** + * List events + * @param {Object} params request query + * @param {String} params['q.field'] 'filter_self' + * @param {String} params['q.op'] 'le' + * @param {Boolean} params['q.value'] true or false + * @param {String} params.sort 'generated:desc' + * @param {Number} params.limit 10 + * @param {String} params.mariker "string" + * @returns {Promise} + */ +export const fetchEvents = (params) => + axios.request({ + method: 'get', + url: getPankoBaseUrl('events'), + params, + }); + +/** + * Fetch count for event + * @param {Object} params request query + * @param {String} params['q.field'] 'filter_self' + * @param {String} params['q.op'] 'le' + * @param {Boolean} params['q.value'] true or false + * @returns {Promise} + */ +export const fetchEventCount = (params) => + axios.request({ + method: 'get', + url: getPankoBaseUrl('events/count'), + params, + }); diff --git a/src/api/placement/base.js b/src/api/placement/base.js new file mode 100644 index 00000000..30017b79 --- /dev/null +++ b/src/api/placement/base.js @@ -0,0 +1,23 @@ +// Copyright 2021 99cloud +// +// 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. + +/** + * @param {String} key api url + * @returns {String} + */ +import { placementBase } from 'utils/constants'; + +const getPlacementBaseUrl = (key) => `${placementBase()}/${key}`; + +export default getPlacementBaseUrl; diff --git a/src/api/placement/resource-providers.js b/src/api/placement/resource-providers.js new file mode 100644 index 00000000..4f7aff71 --- /dev/null +++ b/src/api/placement/resource-providers.js @@ -0,0 +1,28 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getPlacementBaseUrl from './base'; + +/** + * List resource provider inventories + * @param {String} uuid path + * @returns {Promise} + */ +export const fetchResourceProviderInventories = (uuid) => + axios.request({ + method: 'get', + url: getPlacementBaseUrl(`resource_providers/${uuid}/inventories`), + }); diff --git a/src/api/placement/traits.js b/src/api/placement/traits.js new file mode 100644 index 00000000..9db353ba --- /dev/null +++ b/src/api/placement/traits.js @@ -0,0 +1,31 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getPlacementBaseUrl from './base'; + +/** + * List traits + * @param {Object} params request query + * @param {String} params.name A string to filter traits. + * @param {Boolean} params.associated Available values for the parameter are true and false. + * @returns {Promise} + */ +export const fetchListTraitsOnPlacement = (params) => + axios.request({ + method: 'get', + url: getPlacementBaseUrl('traits'), + params, + }); diff --git a/src/api/skyline/base.js b/src/api/skyline/base.js new file mode 100644 index 00000000..19765c92 --- /dev/null +++ b/src/api/skyline/base.js @@ -0,0 +1,23 @@ +// Copyright 2021 99cloud +// +// 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. + +/** + * @param {String} key api url + * @returns {String} + */ +import { skylineBase } from 'utils/constants'; + +const getSkylineBaseUrl = (key) => `${skylineBase()}/${key}`; + +export default getSkylineBaseUrl; diff --git a/src/api/skyline/contrib.js b/src/api/skyline/contrib.js new file mode 100644 index 00000000..aafea31b --- /dev/null +++ b/src/api/skyline/contrib.js @@ -0,0 +1,47 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getSkylineBaseUrl from './base'; + +/** + * List Keystone Endpoints + * @returns {Promise} + */ +export const fetchKeystoneEndpoints = () => + axios.request({ + method: 'get', + url: getSkylineBaseUrl('contrib/keystone_endpoints'), + }); + +/** + * List Domains + * @returns {Promise} + */ +export const fetchDomains = () => + axios.request({ + method: 'get', + url: getSkylineBaseUrl('contrib/domains'), + }); + +/** + * List Regions + * @returns {Promise} + */ +export const fetchRegions = () => + axios.request({ + method: 'get', + url: getSkylineBaseUrl('contrib/regions'), + }); diff --git a/src/api/skyline/extension.js b/src/api/skyline/extension.js new file mode 100644 index 00000000..51d9279e --- /dev/null +++ b/src/api/skyline/extension.js @@ -0,0 +1,155 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getSkylineBaseUrl from './base'; + +/** + * List Servers. + * Notes: + * The host of sort_keys is only used for admin/system_admin role users. + * The name is to support for fuzzy queries. + * @param {Object} params request query + * @param {Number} params.limit Default value : 10 + * @param {String} params.marker marker + * @param {String} params.sort_dirs Available values : desc, asc + * @param {Array[String]} params.sort_keys Available values : uuid, display_name, vm_state, locked, created_at, host, project_id + * @param {Boolean} params.all_projects Default value : false + * @param {String} params.project_id Only works when the all_projects filter is also specified. + * @param {String} params.project_name Only works when the all_projects filter is also specified. + * @param {String} params.name name + * @param {String} params.floating_ip Floating IP of server. + * @param {String} params.fixed_ip Fixed IP of server. + * @param {String} params.status Available values : ACTIVE, BUILD, ERROR, HARD_REBOOT, MIGRATING, PAUSED, REBOOT, REBUILD, RESCUE, RESIZE, SHELVED, SHELVED_OFFLOADED, SHUTOFF, SOFT_DELETED, SUSPENDED, UNKNOWN + * @param {String} params.host It will be ignored for non-admin user. + * @param {String} params.flavor_id flavors id + * @param {Array[String]} params.uuid UUID of server. + * @returns {Promise} + */ +export const fetchListServers = (params) => + axios.request({ + method: 'get', + url: getSkylineBaseUrl('extension/servers'), + params, + }); + +/** + * List Recycle Servers. + * Notes: + * The updated_at of sort_keys is used as deleted_at. + * The name is to support for fuzzy queries. + * @param {Object} params request query + * @param {Number} params.limit Default value : 10 + * @param {String} params.marker marker + * @param {String} params.sort_dirs Available values : desc, asc + * @param {Array[String]} params.sort_keys Available values : uuid, display_name, updated_at, project_id + * @param {Boolean} params.all_projects Default value : false + * @param {String} params.project_id Only works when the all_projects filter is also specified. + * @param {String} params.project_name Only works when the all_projects filter is also specified. + * @param {String} params.name name + * @param {String} params.floating_ip Floating IP of server. + * @param {String} params.fixed_ip Fixed IP of server. + * @param {Array[String]} params.uuid UUID of server. + * @returns {Promise} + */ +export const fetchListRecycleServers = (params) => + axios.request({ + method: 'get', + url: getSkylineBaseUrl('extension/recycle_servers'), + params, + }); + +/** + * List Volumes. + * @param {Object} params request query + * @param {Number} params.limit Default value : 10 + * @param {String} params.marker marker + * @param {String} params.sort_dirs Available values : desc, asc + * @param {Array[String]} params.sort_keys Available values : id, name, size, status, bootable, created_at + * @param {Boolean} params.all_projects Default value : false + * @param {String} params.project_id Only works when the all_projects filter is also specified. + * @param {String} params.name name + * @param {Boolean} params.multiattach Default value : false + * @param {String} params.status Available values : creating, available, reserved, attaching, detaching, in-use, maintenance, deleting, awaiting-transfer, error, error_deleting, backing-up, restoring-backup, error_backing-up, error_restoring, error_extending, downloading, uploading, retyping, extending + * @param {Boolean} params.bootable Default value : false + * @param {Array[String]} params.uuid UUID of volume. + * @returns {Promise} + */ +export const fetchListVolumes = (params) => + axios.request({ + method: 'get', + url: getSkylineBaseUrl('extension/volumes'), + params, + }); + +/** + * List Volume Snapshots. + * @param {Object} params request query + * @param {Number} params.limit Default value : 10 + * @param {String} params.marker marker + * @param {String} params.sort_dirs Available values : desc, asc + * @param {Array[String]} params.sort_keys Available values : id, name, status, created_at + * @param {Boolean} params.all_projects Default value : false + * @param {String} params.project_id Only works when the all_projects filter is also specified. + * @param {String} params.name name + * @param {String} params.status Available values : CREATING, AVAILABLE, DELETING, ERROR, ERROR_DELETING + * @param {String} params.volume_id volumes id + * @returns {Promise} + */ +export const fetchListVolumeSnapshots = (params) => + axios.request({ + method: 'get', + url: getSkylineBaseUrl('extension/volume_snapshots'), + params, + }); + +/** + * List Ports. + * @param {Object} params request query + * @param {Number} params.limit Default value : 10 + * @param {String} params.marker marker + * @param {String} params.sort_dirs Available values : desc, asc + * @param {Array[String]} params.sort_keys Available values : id, name, mac_address, status, project_id + * @param {Boolean} params.all_projects Default value : false + * @param {String} params.project_id Only works when the all_projects filter is also specified. + * @param {String} params.name name + * @param {String} params.status Available values : ACTIVE, DOWN, BUILD, ERROR, N/A + * @param {String} params.network_name networks name + * @param {String} params.network_id networks id + * @param {String} params.device_id devices id + * @param {Array[String]} params.device_owner Available values : , compute:nova, network:dhcp, network:floatingip, network:router_gateway, network:router_ha_interface, network:ha_router_replicated_interface + * @param {Array[String]} params.uuid UUID of port. + * @returns {Promise} + */ +export const fetchListPorts = (params) => + axios.request({ + method: 'get', + url: getSkylineBaseUrl('extension/ports'), + params, + }); + +/** + * List compute services. + * @param {Object} params request query + * @param {String} params.binary binary + * @param {String} params.host host + * @returns {Promise} + */ +export const fetchListComputeServices = (params) => + axios.request({ + method: 'get', + url: getSkylineBaseUrl('extension/compute-services'), + params, + }); diff --git a/src/api/skyline/login.js b/src/api/skyline/login.js new file mode 100644 index 00000000..089d4d71 --- /dev/null +++ b/src/api/skyline/login.js @@ -0,0 +1,64 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getSkylineBaseUrl from './base'; + +/** + * login + * @param {Object} data request body + * @param {String} data.region RegionOne + * @param {String} data.domain default + * @param {String} data.username admin + * @param {String} data.password password + * @returns {Promise} + */ +export const login = (data) => + axios.request({ + method: 'post', + url: getSkylineBaseUrl('login'), + data, + }); + +/** + * logout + * @returns {Promise} + */ +export const logout = () => + axios.request({ + method: 'post', + url: getSkylineBaseUrl('logout'), + }); + +/** + * fetch profile + * @returns {Promise} + */ +export const fetchProfile = () => + axios.request({ + method: 'get', + url: getSkylineBaseUrl('profile'), + }); + +/** + * switch_project + * @param {String} projectId projects id + * @returns {Promise} + */ +export const switchProject = (projectId) => + axios.request({ + method: 'post', + url: getSkylineBaseUrl(`switch_project/${projectId}`), + }); diff --git a/src/api/skyline/policy.js b/src/api/skyline/policy.js new file mode 100644 index 00000000..3e3c2070 --- /dev/null +++ b/src/api/skyline/policy.js @@ -0,0 +1,40 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getSkylineBaseUrl from './base'; + +/** + * List policies + * @returns {Promise} + */ +export const fetchPolicies = () => + axios.request({ + method: 'get', + url: getSkylineBaseUrl('policies'), + }); + +/** + * Check policies + * @param {Object} data request body + * @param {Array[String]} data.rules ["string"] + * @returns {Promise} + */ +export const checkPolicies = (data) => + axios.request({ + method: 'post', + url: getSkylineBaseUrl('policies/check'), + data, + }); diff --git a/src/api/skyline/setting.js b/src/api/skyline/setting.js new file mode 100644 index 00000000..ce85d8ff --- /dev/null +++ b/src/api/skyline/setting.js @@ -0,0 +1,63 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +import getSkylineBaseUrl from './base'; + +/** + * Get a setting item. + * @param {String} key path + * @returns {Promise} + */ +export const fetchSetting = (key) => + axios.request({ + method: 'get', + url: getSkylineBaseUrl(`setting/${key}`), + }); + +/** + * Reset a setting item to default + * @param {String} key path + * @returns {Promise} + */ +export const resetSetting = (key) => + axios.request({ + method: 'delete', + url: getSkylineBaseUrl(`setting/${key}`), + }); + +/** + * Update a setting item. + * @param {Object} data request body + * @param {String} data.key "string" + * @param {String} data.value "string" + * @returns {Promise} + */ +export const updateSetting = (data) => + axios.request({ + method: 'put', + url: getSkylineBaseUrl('setting'), + data, + }); + +/** + * Get all settings. + * @returns {Promise} + */ +export const fetchAllSettings = () => + axios.request({ + method: 'get', + url: getSkylineBaseUrl('settings'), + }); diff --git a/src/api/storage/storage-classes.js b/src/api/storage/storage-classes.js new file mode 100644 index 00000000..3883531f --- /dev/null +++ b/src/api/storage/storage-classes.js @@ -0,0 +1,27 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import axios from '@/libs/axios'; + +/** + * Create Storageclasses + * @param {Object} data request body + * @returns {Promise} + */ +export const createStorageclasses = (data) => + axios.request({ + method: 'post', + url: 'apis/storage.k8s.io/v1/storageclasses', + data, + }); diff --git a/src/api/swift/base.js b/src/api/swift/base.js new file mode 100644 index 00000000..1b78587a --- /dev/null +++ b/src/api/swift/base.js @@ -0,0 +1,23 @@ +// Copyright 2021 99cloud +// +// 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. + +/** + * @param {String} key api url + * @returns {String} + */ +import { swiftBase } from 'utils/constants'; + +const getSwiftBaseUrl = (key) => `${swiftBase()}/${key}`; + +export default getSwiftBaseUrl; diff --git a/src/asset/image/ArchLinux.svg b/src/asset/image/ArchLinux.svg new file mode 100644 index 00000000..9d62fa46 --- /dev/null +++ b/src/asset/image/ArchLinux.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/asset/image/TmpFileImage.png b/src/asset/image/TmpFileImage.png new file mode 100644 index 0000000000000000000000000000000000000000..ae918c9eb82c1bcb5e2b0108d3d9ea2f48020df1 GIT binary patch literal 4042 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 literal 0 HcmV?d00001 diff --git a/src/asset/image/adminImage.svg b/src/asset/image/adminImage.svg new file mode 100644 index 00000000..bee2f70f --- /dev/null +++ b/src/asset/image/adminImage.svg @@ -0,0 +1,13 @@ + + + SliceCopy + + + + + + + + + + \ No newline at end of file diff --git a/src/asset/image/adminInstance.svg b/src/asset/image/adminInstance.svg new file mode 100644 index 00000000..c2040b86 --- /dev/null +++ b/src/asset/image/adminInstance.svg @@ -0,0 +1,7 @@ + + + 形状 + + + + \ No newline at end of file diff --git a/src/asset/image/adminNetwork.svg b/src/asset/image/adminNetwork.svg new file mode 100644 index 00000000..a28c68f0 --- /dev/null +++ b/src/asset/image/adminNetwork.svg @@ -0,0 +1,13 @@ + + + wangluo-2 + + + + + + + + + + \ No newline at end of file diff --git a/src/asset/image/adminRouter.svg b/src/asset/image/adminRouter.svg new file mode 100644 index 00000000..8810cdc7 --- /dev/null +++ b/src/asset/image/adminRouter.svg @@ -0,0 +1,13 @@ + + + luyouqi + + + + + + + + + + \ No newline at end of file diff --git a/src/asset/image/adminSecurityGroup.svg b/src/asset/image/adminSecurityGroup.svg new file mode 100644 index 00000000..ed7e020d --- /dev/null +++ b/src/asset/image/adminSecurityGroup.svg @@ -0,0 +1,16 @@ + + + 编组 32 + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/asset/image/adminVolume.svg b/src/asset/image/adminVolume.svg new file mode 100644 index 00000000..c071285a --- /dev/null +++ b/src/asset/image/adminVolume.svg @@ -0,0 +1,13 @@ + + + 编组 38 + + + + + + + + + + \ No newline at end of file diff --git a/src/asset/image/animnbus.png b/src/asset/image/animnbus.png new file mode 100644 index 0000000000000000000000000000000000000000..c6351d387ead9b740f3f9196868900243b345221 GIT binary patch literal 41237 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 literal 0 HcmV?d00001 diff --git a/src/asset/image/arch.svg b/src/asset/image/arch.svg new file mode 100644 index 00000000..f57758c5 --- /dev/null +++ b/src/asset/image/arch.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/asset/image/centos.svg b/src/asset/image/centos.svg new file mode 100644 index 00000000..91a4c3dd --- /dev/null +++ b/src/asset/image/centos.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/asset/image/cloud.png b/src/asset/image/cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..417c2e22b74fdc3d3bb32108c948a52dbb700048 GIT binary patch literal 17009 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 G_P+p>IV1`I literal 0 HcmV?d00001 diff --git a/src/asset/image/coreos.svg b/src/asset/image/coreos.svg new file mode 100644 index 00000000..dfc81b05 --- /dev/null +++ b/src/asset/image/coreos.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/asset/image/critical-alert.svg b/src/asset/image/critical-alert.svg new file mode 100644 index 00000000..4451ad83 --- /dev/null +++ b/src/asset/image/critical-alert.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/asset/image/debian.svg b/src/asset/image/debian.svg new file mode 100644 index 00000000..d43168d1 --- /dev/null +++ b/src/asset/image/debian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/asset/image/empty-card.svg b/src/asset/image/empty-card.svg new file mode 100644 index 00000000..28893d0f --- /dev/null +++ b/src/asset/image/empty-card.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/asset/image/favicon.ico b/src/asset/image/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..3005f9b00f73f205491987e9cd5c1abd1698f4aa GIT binary patch literal 6512 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 literal 0 HcmV?d00001 diff --git a/src/asset/image/fedora.svg b/src/asset/image/fedora.svg new file mode 100644 index 00000000..cd09cd86 --- /dev/null +++ b/src/asset/image/fedora.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/asset/image/freebsd.svg b/src/asset/image/freebsd.svg new file mode 100644 index 00000000..7ffcbea6 --- /dev/null +++ b/src/asset/image/freebsd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/asset/image/image.svg b/src/asset/image/image.svg new file mode 100644 index 00000000..00964e2f --- /dev/null +++ b/src/asset/image/image.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/asset/image/instance.png b/src/asset/image/instance.png new file mode 100644 index 0000000000000000000000000000000000000000..6ea6aceab902cb3f8732b052e6ec5fa0d0c549fe GIT binary patch literal 7589 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 literal 0 HcmV?d00001 diff --git a/src/asset/image/instance.svg b/src/asset/image/instance.svg new file mode 100644 index 00000000..c56d9f23 --- /dev/null +++ b/src/asset/image/instance.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/asset/image/interface.png b/src/asset/image/interface.png new file mode 100644 index 0000000000000000000000000000000000000000..bcd7459d9a8636bf93c648fcfcf85ae5ddd70b2d GIT binary patch literal 3960 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 \ No newline at end of file diff --git a/src/asset/image/loadBalancer.png b/src/asset/image/loadBalancer.png new file mode 100644 index 0000000000000000000000000000000000000000..15c6a35cf88ed03cde6daa90ef8edcc23588b1be GIT binary patch literal 15330 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 literal 0 HcmV?d00001 diff --git a/src/asset/image/lock.svg b/src/asset/image/lock.svg new file mode 100644 index 00000000..32838f79 --- /dev/null +++ b/src/asset/image/lock.svg @@ -0,0 +1,12 @@ + + + jiesuo + + + + + + + + + \ No newline at end of file diff --git a/src/asset/image/login.png b/src/asset/image/login.png new file mode 100644 index 0000000000000000000000000000000000000000..c149a600da09249e518f76fd2745490209f9e109 GIT binary patch literal 362273 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 z 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

(-Ne$VPsKaN7mPDXc=uzgE-SlU-%1! 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 ZK2bo-ywWrINLt?kTIzag)lclB{vS_Iz!m@i literal 0 HcmV?d00001 diff --git a/src/asset/image/loginFull.png b/src/asset/image/loginFull.png new file mode 100644 index 0000000000000000000000000000000000000000..b532574490c92d7f6af12160db7fdf6379de50ac GIT binary patch literal 229330 zcmWieWmJ@18--~BMGzQ75a}8~Lg^HwdxCDsAqA1{MjD3hoOzH`KG22%$JQ_~FF(|4wo?b$xMgaNp=? zz!Zh$EQoN485pI7q>Tk64W-l(!tz$4Z>?Xj$k|5bn);MWd!Zy;_|Pk5PF<&_M*V!r>-bBm>YDw5nY;F0w?q^9*L&8xV! z|Jb;d6FU1qRQylKI35y!V9wF1W`1FH?V8rX<$qR#tC};1Cm@cI!#WP(5nnn}{u|_d1%32@{vi=Q~mt#jlY)IvG&$?J+5H6?P+ce2S8so05X7c5kcU ze6RipOGhun#41Tc1O5`7Yl?#(sG<7y4a|GCHIGDL)_^)f_bs6!!4st7gZX5{LXp8J zDGNgP>&xg_prPvaUe;nSK>abvTQ^$?&OSf>kgWl^qxX9OqUb+{+kc1u78E<^4^Ksu zHKZPPNEqOAYO@Z_91UdL-3=|)Wns1!dQ>u+{Q8Ao8*AAXUz#*$NBc+xR^h0A3^X&e ziduUT+e;bqwjo=s!sEM@Abq@T%F4k`Ql%>}w-Pr%#0j1|pPS3bxW2w-FA6}bk2O-X z1qKD(b9okht?*<$Rkg3wO3V-CH<^onuv3Se|_HQ90^Z z{dCisiT{apClGy-yVxu4B4B)8+UzTc~= zM4bAX18;L)AV2VQJbCde%!-Np&q6xGE%}kbsnNA#-Om2|vW{ju;|7xcH@`jL z(@WE!fQ!SwC&xb%tK_D}r-Ltop2oKkNf6mrO>u2stgT&NjjQZyIP07BT+u~u9H00c z!aD)IN)o-#-=$i8e-twG$wtv#+HtV-_09G7&m1evNtD3j7fboZW+soxgPOAu#txWr zhxL4ADGTvHL}^OrMB@jM-0%G=)BtayNMD7NrQzB?F<>L)!YX8ZW4 z^uGz!EUR*wV;^}0vtfRGi%Hx>*V@~Io4eKIq`sY27=#T}&&=%x4k0a;Ki`YvROld1 z*n1%lHud$?&=iE864DBo2kza&^-4L$F1wuySluPYC68?O9NPKwzg_tnR}|h$FJCZ` zpozp1GCVn_l$`kpAYBpaR64?}>Q-HrF)COCDI9@Q-9FfJKEtoFxw6ljqTfgiRl-FG zo=MO8T*;%v;y;Y~aBKbM&C9q@yIh-CLM#{PVum3)>}9_L6cnU~dN7N3UfbIAO9`Tm zG28vC$3a9R1;t(Reh;_IZ##DENy%P!e}Haf%Aih%E-?_H)@M;wI!QrsRN zBihe80^GI6@z6I*n9uvVXbrvEE;gfji_DQ$^jXQL+u+{5WKMQ@P?lX@4`oAsO8+yH zR9ea6X#637b|{yV7RaGDM+8{zUyWa7D4{5kq@zwxbgEJ%$ZZ}LBT9v!ePtV8;wId( zoDteh<5}bpGW)xNyfHcFYPF?C90`=FU692`&W44)A74GwEX_4dcu|jj|K|f`#|ZZY zOb(+4m(O#$W7V8~f-FtK#=t#hx_8n%yc#kdjs7<@dfrtu;Kl$`$Uo*A`SRXE`bpim z+grhND>PjT9x1z+rIMv&uL~;=?&Rd`z0n8HiLNveGU#666qEbSu0uenhwW8TyODlt zZs`|F5s(bhCJNTXr<-GpK?uuEj8BcjOQtRNu7~;#ZGYOc)qe22JYK?wJJH_2!u}RI zzT3HgmruT@<^{1zfCsmSB(1PpD~02hR^UsRC9G>=stU}{S9${ln-16lg7N?^Hm;K5 z^L%vx9voLMV)!b8pm;X7(^v`rTMFv(kb6o7GHwCLbH{hW@GFu&eD*EEyZ}d~r}(BAb21+%|kgu1C&-Z#z&uNba&olm0iv?4X(y)g_A|P>)hA}=Bf0Ghc9&p3+B8`>jb2bcE zTUt;ag@&*OO~V9`r%H)nI(9KkX7tx$Xae_72hO>PlEKlCgu_8}Oj%9h{d^YP9(76c zpEB(4mb;HSfLwo+n5G;hqss$F50_FejaSHc#rgzv3bQ{qt#1xJyh9AWYA<6{7-wdl z*fRr~k=9@bh+r|(7!C7j)9* Zmq6(*8Q}f%?&OYxD+sn)&wIK+}`$64iG&*}(LY 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%0A3DyG{NPyJ!%Ji+Zb!2Ycw7#*Gn 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�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

KOuw--wkr0wV9vPjNPSK@~)I% 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 aOm<^ITf=YSkk4$apQWkI^%`T3hyMd{Wz;JG literal 0 HcmV?d00001 diff --git a/src/asset/image/loginRightLogo.png b/src/asset/image/loginRightLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..0c5b1aff94ac93c7f0793c9d489356449d9d6871 GIT binary patch literal 3230 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 + + + + 编组 + + diff --git a/src/asset/image/logo-small.svg b/src/asset/image/logo-small.svg new file mode 100644 index 00000000..c555b8f6 --- /dev/null +++ b/src/asset/image/logo-small.svg @@ -0,0 +1,18 @@ + + + logo-浅色 + + + + + + + + \ No newline at end of file diff --git a/src/asset/image/logo.png b/src/asset/image/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b16a04a5b9601855bf7e2c42678cfee6f3d3208c GIT binary patch literal 3803 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 R8HxY^002ovPDHLkV1ny(ILH71 literal 0 HcmV?d00001 diff --git a/src/asset/image/major-alert.svg b/src/asset/image/major-alert.svg new file mode 100644 index 00000000..5d509f7d --- /dev/null +++ b/src/asset/image/major-alert.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/asset/image/minor-alert.svg b/src/asset/image/minor-alert.svg new file mode 100644 index 00000000..69dd6a7b --- /dev/null +++ b/src/asset/image/minor-alert.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/asset/image/others.svg b/src/asset/image/others.svg new file mode 100644 index 00000000..72f85008 --- /dev/null +++ b/src/asset/image/others.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/asset/image/overview-instance.svg b/src/asset/image/overview-instance.svg new file mode 100755 index 00000000..79ad6c8c --- /dev/null +++ b/src/asset/image/overview-instance.svg @@ -0,0 +1,13 @@ + + + 编组 + + + + + + + + + + \ No newline at end of file diff --git a/src/asset/image/overview-network.svg b/src/asset/image/overview-network.svg new file mode 100755 index 00000000..a1b0ce31 --- /dev/null +++ b/src/asset/image/overview-network.svg @@ -0,0 +1,12 @@ + + + wangluo + + + + + + + + + \ No newline at end of file diff --git a/src/asset/image/overview-router.svg b/src/asset/image/overview-router.svg new file mode 100755 index 00000000..2fc3576e --- /dev/null +++ b/src/asset/image/overview-router.svg @@ -0,0 +1,14 @@ + + + luyouqi + + + + + + + + + + + \ No newline at end of file diff --git a/src/asset/image/overview-volume.svg b/src/asset/image/overview-volume.svg new file mode 100755 index 00000000..da4259ce --- /dev/null +++ b/src/asset/image/overview-volume.svg @@ -0,0 +1,17 @@ + + + 编组 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/asset/image/router.png b/src/asset/image/router.png new file mode 100644 index 0000000000000000000000000000000000000000..e9d526a193e922500ab755f0a98bee9d796fe576 GIT binary patch literal 14823 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 \ No newline at end of file diff --git a/src/asset/image/ubuntu.svg b/src/asset/image/ubuntu.svg new file mode 100644 index 00000000..3ff1f489 --- /dev/null +++ b/src/asset/image/ubuntu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/asset/image/unlock.svg b/src/asset/image/unlock.svg new file mode 100644 index 00000000..7e8b014a --- /dev/null +++ b/src/asset/image/unlock.svg @@ -0,0 +1,12 @@ + + + jiesuo + + + + + + + + + \ No newline at end of file diff --git a/src/asset/image/volume-container.svg b/src/asset/image/volume-container.svg new file mode 100755 index 00000000..18ff8d30 --- /dev/null +++ b/src/asset/image/volume-container.svg @@ -0,0 +1,34 @@ + + + + 编组 10 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/asset/image/volume.svg b/src/asset/image/volume.svg new file mode 100644 index 00000000..f5d53b44 --- /dev/null +++ b/src/asset/image/volume.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/asset/image/windows.svg b/src/asset/image/windows.svg new file mode 100644 index 00000000..7c15f809 --- /dev/null +++ b/src/asset/image/windows.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/asset/template/index.html b/src/asset/template/index.html new file mode 100644 index 00000000..2b38b4e7 --- /dev/null +++ b/src/asset/template/index.html @@ -0,0 +1,12 @@ + + + + + + Cloud + + + +
+ + diff --git a/src/components/Cards/EmptyTable/index.jsx b/src/components/Cards/EmptyTable/index.jsx new file mode 100644 index 00000000..6caaa1c4 --- /dev/null +++ b/src/components/Cards/EmptyTable/index.jsx @@ -0,0 +1,69 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React from 'react'; +import PropTypes from 'prop-types'; +import classnames from 'classnames'; + +import { Row, Col, Button } from 'antd'; + +import styles from './index.less'; + +export default class EmptyList extends React.Component { + static propTypes = { + className: PropTypes.string, + name: PropTypes.string, + desc: PropTypes.string, + createText: PropTypes.string, + operations: PropTypes.oneOfType([PropTypes.node, PropTypes.element]), + onCreate: PropTypes.func, + }; + + static defaultProps = { + name: '', + }; + + render() { + const { className, name, operations, onCreate, createText } = this.props; + const desc = + this.props.desc || + t(`${name.split(' ').join('_').toUpperCase()}_CREATE_DESC`); + + const btnText = createText || `${t('Create ')}${t(name)}`; + + return ( +
+ + + + + +

+ {operations || + (onCreate && ( + + ))} + + +

+ ); + } +} diff --git a/src/components/Cards/EmptyTable/index.less b/src/components/Cards/EmptyTable/index.less new file mode 100644 index 00000000..0b30cd2b --- /dev/null +++ b/src/components/Cards/EmptyTable/index.less @@ -0,0 +1,18 @@ +@import '~styles/variables'; + +.wrapper { + padding: 38px 72px; + border-radius: @border-radius; + background-color: #ffffff; + box-shadow: @base-shadow; + + img { + margin-right: 70px; + } +} + +.desc { + max-width: 580px; + margin-bottom: 20px; + font-family: @font-family-id; +} \ No newline at end of file diff --git a/src/components/Cards/NotFound/index.jsx b/src/components/Cards/NotFound/index.jsx new file mode 100644 index 00000000..27702ba3 --- /dev/null +++ b/src/components/Cards/NotFound/index.jsx @@ -0,0 +1,69 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React from 'react'; +import emptyCard from '@/asset/image/empty-card.svg'; +import { firstUpperCase } from 'utils/index'; +import { Link } from 'react-router-dom'; +import styles from './index.less'; + +export default class NotFound extends React.Component { + render() { + const { title, link, codeError, endpointError, goList, isAction } = + this.props; + let h = ''; + if (codeError) { + h = 'Error'; + } else if (endpointError) { + h = t('Not Open'); + } else { + h = t('Resource Not Found'); + } + let pTitle = ''; + let linkTitle = ''; + if (isAction) { + pTitle = t('Unable to {title}, please go back to ', { + title: firstUpperCase(title), + }); + } else if (goList) { + pTitle = t('Unable to get {title}, please go back to ', { + title: firstUpperCase(title), + }); + } else { + pTitle = t('Unable to get {title}, please go to ', { + title: firstUpperCase(title), + }); + } + if (goList) { + linkTitle = {t('list page')}; + } else { + linkTitle = {t('Home page')}; + } + const p = ( +

+ {pTitle} + {linkTitle} +

+ ); + return ( +
+ +
+
{h}
+ {p} +
+
+ ); + } +} diff --git a/src/components/Cards/NotFound/index.less b/src/components/Cards/NotFound/index.less new file mode 100644 index 00000000..189f1033 --- /dev/null +++ b/src/components/Cards/NotFound/index.less @@ -0,0 +1,41 @@ +@import '~styles/variables'; + +.wrapper { + margin-top: 100px; + border-radius: @border-radius; + text-align: center; +} + +.image { + height: 200px; + user-select: none; +} + +.text { + display: inline-block; + vertical-align: top; + width: 600px; + margin-left: 60px; + + :global .h1 { + opacity: 0.4; + font-size: 120px; + line-height: 1.4; + color: #abb4be; + user-select: none; + text-align: left; + } + + p { + text-shadow: 0 4px 8px rgba(36, 46, 66, 0.1); + font-size: 20px; + font-weight: @font-bold; + line-height: 1.4; + color: @second-title-color; + text-align: left; + } + + a { + color: @text-color; + } +} diff --git a/src/components/CodeEditor/AceEditor.jsx b/src/components/CodeEditor/AceEditor.jsx new file mode 100644 index 00000000..a578d0ea --- /dev/null +++ b/src/components/CodeEditor/AceEditor.jsx @@ -0,0 +1,41 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React from 'react'; +import AceEditor from 'react-ace'; +import 'ace-builds/src-noconflict/mode-json'; +// import 'ace-builds/src-noconflict/mode-yaml'; +// import 'ace-builds/src-noconflict/mode-groovy'; +import 'ace-builds/src-noconflict/theme-github'; + +import './custom.less'; + +export default class AceEditorWrapper extends React.Component { + render() { + return ( + + ); + } +} diff --git a/src/components/CodeEditor/custom.less b/src/components/CodeEditor/custom.less new file mode 100644 index 00000000..a7e386f5 --- /dev/null +++ b/src/components/CodeEditor/custom.less @@ -0,0 +1,59 @@ +.ace_editor { + line-height: 20px !important; + font-family: Monaco, Menlo, Consolas, Courier New, monospace; + -webkit-font-smoothing: auto; +} + +.ace_editor.ace-chaos { + color: #ffffff; + background-color: #242e42; +} + +.ace_editor.ace-chaos .ace_gutter { + color: #537f7e; + background-color: #242e42; + border-right: 1px solid #4a5974; +} + +.ace_editor.ace-chaos .ace_variable, +.ace_editor.ace-chaos .ace_identifier, +.ace_editor.ace-chaos .ace_meta.ace_tag { + color: #75e0f2; +} + +.ace_editor.ace-chaos .ace_keyword { + color: #ffffff; +} + +.ace_editor.ace-chaos .ace_string { + color: #ebe087; +} + +.ace_editor.ace-chaos .ace_constant.ace_numeric { + color: #bd99ff; +} + +.ace_editor.ace-chaos .ace_marker-layer .ace_active-line { + background-color: #36435c; +} + +.ace_editor.ace-chaos .ace_indent-guide { + border-right: 1px dotted #777; + padding: 2px 0; +} + +.ace_editor.ace-chaos .ace_marker-layer .ace_selection { + background-color: #4a5974; +} + +.ace_editor.ace-chaos .ace_comment { + color: #aaa; +} + +.ace_editor.ace-chaos .ace_fold:hover { + background-color: #fff; +} + +.ace_editor.ace-chaos .ace_line .ace_fold { + height: auto; +} diff --git a/src/components/CodeEditor/index.jsx b/src/components/CodeEditor/index.jsx new file mode 100644 index 00000000..adeac88f --- /dev/null +++ b/src/components/CodeEditor/index.jsx @@ -0,0 +1,101 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React, { PureComponent } from 'react'; +import PropTypes from 'prop-types'; +import classnames from 'classnames'; +import { getValue } from 'utils/yaml'; +import styles from './index.less'; +import AceEditor from './AceEditor'; + +const getCodeValue = (value, mode) => { + if (value instanceof String) { + return value; + } + Object.keys(value).forEach((key) => { + if (typeof value[key] === 'string' && value[key].indexOf('') !== -1) { + const reg = /<\/h1>[\r\n]([\s\S]*)

/; + const results = reg.exec(value[key]); + if (results) { + value[key] = results[1]; + } + } + }); + if (mode === 'json') { + return JSON.stringify(value, null, 2); + } + if (mode === 'yaml') { + return getValue(value); + } + return value; +}; + +class CodeEditor extends PureComponent { + static propTypes = { + value: PropTypes.oneOfType([PropTypes.string, PropTypes.object]), + mode: PropTypes.string, + options: PropTypes.object, + onChange: PropTypes.func, + }; + + static defaultProps = { + value: {}, + mode: 'yaml', + options: {}, + onChange() {}, + }; + + constructor(props) { + super(props); + + this.state = { + value: getCodeValue(props.value, props.mode), + originValue: props.value, + }; + } + + static getDerivedStateFromProps(props, state) { + const { value, mode } = props; + + if (value !== state.originValue) { + return { + value: getCodeValue(value, mode), + originValue: value, + }; + } + + return null; + } + + handleChange = (value) => { + const { onChange } = this.props; + onChange(value); + }; + + render() { + const { className, mode, options } = this.props; + + return ( + + ); + } +} + +export default CodeEditor; diff --git a/src/components/CodeEditor/index.less b/src/components/CodeEditor/index.less new file mode 100644 index 00000000..fab9cdc8 --- /dev/null +++ b/src/components/CodeEditor/index.less @@ -0,0 +1,4 @@ +.editor { + min-height: 60vh; + border-radius: 4px; +} diff --git a/src/components/Confirm/index.jsx b/src/components/Confirm/index.jsx new file mode 100644 index 00000000..b5f73c31 --- /dev/null +++ b/src/components/Confirm/index.jsx @@ -0,0 +1,107 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React from 'react'; +import { Modal } from 'antd'; +import { + CheckCircleOutlined, + CloseCircleOutlined, + QuestionCircleFilled, +} from '@ant-design/icons'; +import classnames from 'classnames'; +import PropTypes from 'prop-types'; +import { unescapeHtml } from 'utils/index'; +import styles from './index.less'; + +const normalProps = { + title: PropTypes.oneOfType([PropTypes.string, PropTypes.node]), + content: PropTypes.oneOfType([PropTypes.string, PropTypes.node]).isRequired, + onOk: PropTypes.func, + onCancel: PropTypes.func, + icon: PropTypes.node, + isSubmitting: PropTypes.bool, + cancelText: PropTypes.string, + okText: PropTypes.string, + className: PropTypes.string, +}; + +const confirm = (props) => { + const { + title = t('Confirm'), + content, + onOk, + onCancel, + icon, + okText = t('Confirm'), + cancelText = t('Cancel'), + className, + } = props; + Modal.confirm({ + title, + icon: icon || , + className: classnames(styles['confirm-modal'], className), + content: unescapeHtml(content), + okText, + cancelText, + onOk() { + return onOk && onOk(); + }, + onCancel() { + onCancel && onCancel(); + }, + }); +}; + +confirm.propTypes = normalProps; +confirm.defaultProps = { + title: t('Confirm'), + icon: , + isSubmitting: false, + okText: t('Confirm'), + cancelText: t('Cancel'), +}; + +const error = (props) => { + const newProps = { + title: t('Error'), + ...props, + icon: , + }; + confirm(newProps); +}; + +const warn = (props) => { + const newProps = { + title: t('Warn'), + ...props, + icon: , + }; + confirm(newProps); +}; + +const success = (props) => { + const newProps = { + title: t('Success'), + ...props, + icon: , + }; + confirm(newProps); +}; + +export default { + confirm, + error, + warn, + success, +}; diff --git a/src/components/Confirm/index.less b/src/components/Confirm/index.less new file mode 100644 index 00000000..6532fd3f --- /dev/null +++ b/src/components/Confirm/index.less @@ -0,0 +1,25 @@ +@import "~styles/variables"; + +.confirm-modal { + :global { + .ant-modal-confirm-body > .anticon { + font-size: 18px; + margin-right: 20px; + } + } +} +.confirm { + color: @warn-color !important; +} + +.error { + color: @error-color !important; +} + +.success { + color: @success-color !important; +} + +.warn { + color: @warn-color !important; +} \ No newline at end of file diff --git a/src/components/DetailCard/index.jsx b/src/components/DetailCard/index.jsx new file mode 100644 index 00000000..7f5f982a --- /dev/null +++ b/src/components/DetailCard/index.jsx @@ -0,0 +1,157 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React from 'react'; +import { Row, Col, Skeleton, Tooltip, Typography, Popover } from 'antd'; +import { InfoCircleOutlined } from '@ant-design/icons'; +import { has, get, isNumber } from 'lodash'; +import PropTypes from 'prop-types'; +import classnames from 'classnames'; +import { renderFilterMap } from 'utils/index'; +import Status from 'components/Status'; +import styles from './index.less'; + +const { Paragraph } = Typography; + +const getContentValue = (value, dataIndex, data, copyable) => { + const status = get(data, dataIndex); + // get status + if ( + dataIndex.toLowerCase().indexOf('status') >= 0 || + dataIndex.toLowerCase().indexOf('state') >= 0 + ) { + return ; + } + // get copyable + if (value !== '-') { + if ( + (/_?id/g.test(dataIndex.toLowerCase()) && copyable !== false) || + copyable + ) { + return {value}; + } + } + return value || '-'; +}; + +const getContent = (data, option) => { + const { content, dataIndex, render, valueRender, copyable } = option; + if (has(option, 'content')) { + return copyable ? {content} : content; + } + let value = get(data, dataIndex); + if (!render) { + if (valueRender) { + const renderFunc = renderFilterMap[valueRender]; + value = renderFunc && renderFunc(value); + } + } else { + value = render(value, data); + } + if (!isNumber(value)) { + value = value || '-'; + } + return getContentValue(value, dataIndex, data, copyable); +}; + +const renderLabel = (option) => { + const { label, tooltip = '' } = option; + if (!tooltip) { + return label; + } + return ( + + {label} + + ); +}; + +const renderOptions = (options, data, loading, labelCol, contentCol) => + options.map((option, index) => ( + + + {renderLabel(option)} + {getContent(data, option)} + + + )); + +const DetailCard = ({ + title, + titleHelp, + loading, + options, + data, + labelCol, + contentCol, + className, + button, +}) => { + let titleHelpValue; + if (titleHelp) { + titleHelpValue = ( + + + + ); + } + return ( +
+
+ + +

{title}

+ {titleHelpValue} + {button} +
+
+ {renderOptions(options, data, loading, labelCol, contentCol)} +
+
+ ); +}; + +const detailProps = PropTypes.shape({ + label: PropTypes.oneOfType([PropTypes.string, PropTypes.node]), + content: PropTypes.any, + tooltip: PropTypes.oneOfType([PropTypes.string, PropTypes.node]), + dataIndex: PropTypes.string, + valueRender: PropTypes.string, +}); + +DetailCard.defaultProps = { + labelCol: 8, + contentCol: 16, + options: [], + title: '', + titleHelp: '', + loading: false, + data: {}, +}; + +DetailCard.propTypes = { + title: PropTypes.oneOfType([PropTypes.string, PropTypes.node]), + titleHelp: PropTypes.any, + options: PropTypes.arrayOf(detailProps), + loading: PropTypes.bool, + data: PropTypes.object, + labelCol: PropTypes.number, + contentCol: PropTypes.number, +}; + +export default DetailCard; diff --git a/src/components/DetailCard/index.less b/src/components/DetailCard/index.less new file mode 100644 index 00000000..475201cc --- /dev/null +++ b/src/components/DetailCard/index.less @@ -0,0 +1,54 @@ +@import '~styles/variables'; + +@min-space: 8px; +@mid-space: 16px; +@lg-space: 24px; +@box-shadow: 0px 0px 10px 0px rgba(0,0,0,0.05); +@topo-line: 1px solid #D2D2D2; +@resource-box-bg: #fbfdff; +@resource-box-border: 1px solid #cfe1ff; + +@success: #57E39B; +@warning: #FEDF40; +@error: #EB354D; +@link: #0068FF; + +.card { + margin-bottom: @mid-space; + box-shadow: @box-shadow; + background-color: #fff; + border-radius: @border-radius; + flex: 1; + + .card-content { + padding: @mid-space; + + .card-item { + margin-bottom: @min-space; + + h3 { + margin-bottom: 0; + } + + .title-help { + line-height: 26px; + margin-left: @min-space; + } + div { + word-break: break-all; + } + } + + :last-child { + margin-bottom: 0; + } + :global { + .ant-typography { + word-break: break-all; + } + } + } +} + + + diff --git a/src/components/Empty/index.jsx b/src/components/Empty/index.jsx new file mode 100644 index 00000000..abe4ca99 --- /dev/null +++ b/src/components/Empty/index.jsx @@ -0,0 +1,43 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React from 'react'; +import PropTypes from 'prop-types'; +import classnames from 'classnames'; + +import styles from './index.less'; + +export default class Empty extends React.PureComponent { + static propTypes = { + className: PropTypes.string, + img: PropTypes.string, + desc: PropTypes.string, + }; + + static defaultProps = { + img: '/asset/image/empty-card.svg', + desc: 'No relevant data', + }; + + render() { + const { className, img, desc } = this.props; + + return ( +
+ No data + {desc &&
{t(desc)}
} +
+ ); + } +} diff --git a/src/components/Empty/index.less b/src/components/Empty/index.less new file mode 100644 index 00000000..55066f7a --- /dev/null +++ b/src/components/Empty/index.less @@ -0,0 +1,15 @@ +@import '~styles/variables'; + +.wrapper { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + width: 100%; + height: 100%; + padding: 40px 0; +} + +.content { + margin-top: 30px; +} diff --git a/src/components/Form/index.jsx b/src/components/Form/index.jsx new file mode 100644 index 00000000..182cb09f --- /dev/null +++ b/src/components/Form/index.jsx @@ -0,0 +1,511 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React from 'react'; +import { isFunction, has, isObject, isEmpty } from 'lodash'; +import Notify from 'components/Notify'; +import { Row, Col, Form, Button, Spin } from 'antd'; +import classnames from 'classnames'; +import { InfoCircleOutlined } from '@ant-design/icons'; +import { isAdminPage, firstUpperCase, unescapeHtml } from 'utils/index'; + +import { parse } from 'qs'; +import FormItem from 'components/FormItem'; +import styles from './index.less'; + +export default class BaseForm extends React.Component { + constructor(props, options = {}) { + super(props); + + this.options = options; + + this.state = { + // eslint-disable-next-line react/no-unused-state + defaultValue: {}, + // eslint-disable-next-line react/no-unused-state + formData: {}, + isSubmitting: false, + }; + + this.values = {}; + this.response = null; + this.responseError = null; + this.formRef = React.createRef(); + this.codeError = false; + this.currentFormValue = {}; + this.init(); + } + + componentDidMount() { + try { + // this.updateDefaultValue(); + this.updateState(); + } catch (e) { + // eslint-disable-next-line no-console + console.log(e); + } + } + + componentWillUnmount() { + this.unsubscribe && this.unsubscribe(); + this.disposer && this.disposer(); + this.unMountActions && this.unMountActions(); + } + + get canSubmit() { + return true; + } + + get name() { + return ''; + } + + get title() { + return ''; + } + + get className() { + return ''; + } + + get prefix() { + return this.props.match.url; + } + + get routing() { + return this.props.rootStore.routing; + } + + get params() { + return this.props.match.params || {}; + } + + get location() { + return this.props.location || {}; + } + + get locationParams() { + return parse(this.location.search.slice(1)); + } + + get listUrl() { + return '/base/tmp'; + } + + get isAdminPage() { + const { pathname = '' } = this.props.location || {}; + return isAdminPage(pathname); + } + + get hasAdminRole() { + return this.props.rootStore.hasAdminRole; + } + + get currentProjectId() { + return globals.user.project.id; + } + + get currentProjectName() { + return globals.user.project.name; + } + + getUrl(path, adminStr) { + return this.isAdminPage ? `${path}${adminStr || '-admin'}` : path; + } + + get isStep() { + return false; + } + + get isModal() { + return false; + } + + get labelCol() { + return { + xs: { span: 5 }, + sm: { span: 3 }, + }; + } + + get wrapperCol() { + return { + xs: { span: 10 }, + sm: { span: 8 }, + }; + } + + get defaultValue() { + return null; + } + + get formDefaultValue() { + const { context = {} } = this.props; + const { defaultValue } = this; + return { + ...defaultValue, + ...context, + }; + } + + get okBtnText() { + return t('Confirm'); + } + + get instanceName() { + const { name } = this.values || {}; + return name; + } + + get successText() { + return firstUpperCase( + t('{action} successfully, instance: {name}.', { + action: this.name.toLowerCase(), + name: this.instanceName, + }) + ); + } + + get errorText() { + return t('Unable to {action}, instance: {name}.', { + action: this.name.toLowerCase(), + name: this.instanceName, + }); + } + + get isSubmitting() { + const { isSubmitting = false } = this.state; + return isSubmitting; + // return (this.store && this.store.isSubmitting) || false; + } + + get formItems() { + return []; + } + + get validateMessages() { + return []; + } + + get tips() { + return ''; + } + + get showNotice() { + return true; + } + + get nameForStateUpdate() { + const typeList = ['radio', 'more']; + return this.formItems + .filter((it) => typeList.indexOf(it.type) >= 0) + .map((it) => it.name); + } + + updateContext = (allFields) => { + const { updateContext } = this.props; + updateContext && updateContext(allFields); + }; + + unescape = (message) => unescapeHtml(message); + + getFormInstance = () => this.formRef.current; + + // eslint-disable-next-line no-unused-vars + onSubmit = (values) => Promise.resolve(); + + updateSumbitting = (value) => { + this.setState({ + isSubmitting: value || false, + }); + }; + + onOk = (values, containerProps, callback) => { + // eslint-disable-next-line no-console + console.log('onOk', values); + this.values = values; + if (this.codeError) { + return; + } + this.updateSumbitting(true); + if (!this.onSubmit) { + return callback(true, false); + } + return this.onSubmit(values, containerProps).then( + (response) => { + this.updateSumbitting(false); + !this.isModal && this.routing.push(this.listUrl); + this.response = response; + this.showNotice && Notify.success(this.successText); + if (callback && isFunction(callback)) { + callback(true, false); + } + }, + (err) => { + this.updateSumbitting(false); + this.responseError = err; + this.showNotice && Notify.errorWithDetail(this.errorText, err); + // eslint-disable-next-line no-console + console.log(err); + if (callback && isFunction(callback)) { + callback(false, true); + } + } + ); + }; + + onCancel = () => {}; + + getChangedFieldsValue = (changedFields, name) => { + const value = changedFields[name]; + if (isObject(value) && value.value) { + return value.value; + } + if (isObject(value) && value.selectedRows) { + return value.selectedRows[0]; + } + return value; + }; + + // eslint-disable-next-line no-unused-vars + onValuesChange = (changedFields, allFields) => {}; + + // eslint-disable-next-line no-unused-vars + onValuesChangeForm = (changedFields, allFields) => { + // save linkage data to state + const newState = {}; + this.currentFormValue = allFields; + this.nameForStateUpdate.forEach((name) => { + if (has(changedFields, name)) { + const value = this.getChangedFieldsValue(changedFields, name); + newState[name] = value; + } + }); + if (!isEmpty(newState)) { + this.setState({ + ...newState, + }); + } + this.onValuesChange(changedFields, allFields); + }; + + checkFormInput = (callback, failCallback) => { + this.formRef.current && + this.formRef.current.validateFields().then( + (values) => { + callback && callback(values); + this.updateContext(values); + }, + ({ values, errorFields }) => { + if (errorFields && errorFields.length) { + failCallback && failCallback(values, errorFields); + } else { + // eslint-disable-next-line no-console + console.log('checkFormInput-catch', values, errorFields); + // callback && callback(values); + } + } + ); + }; + + onClickSubmit = (callback, checkCallback, containerProps) => { + if (this.codeError) { + return; + } + this.checkFormInput((values) => { + checkCallback && checkCallback(values); + this.onOk(values, containerProps, callback); + }); + }; + + onClickCancel = () => { + this.routing.push(this.listUrl); + }; + + updateDefaultValue = () => { + if (this.formRef.current && this.formRef.current.resetFields) { + this.formRef.current.resetFields(); + } + this.updateContext(this.defaultValue); + }; + + updateFormValue = (key, value) => { + this.formRef.current && + this.formRef.current.setFieldsValue({ + [key]: value, + }); + }; + + updateState() { + // save linkage data to state + const { context } = this.props; + const names = this.nameForStateUpdate; + if (names.length === 0) { + return; + } + const newState = {}; + if (this.checkContextValue()) { + names.forEach((name) => { + newState[name] = this.getChangedFieldsValue(context, name); + }); + } else { + names.forEach((name) => { + newState[name] = this.getChangedFieldsValue(this.defaultValue, name); + }); + } + this.setState({ + ...newState, + }); + } + + checkContextValue() { + const { context } = this.props; + const names = this.nameForStateUpdate; + if (isEmpty(context)) { + return false; + } + const item = names.find((name) => has(context, name)); + return !!item; + } + + init() { + this.store = {}; + } + + renderTips() { + if (this.tips) { + return ( +
+ + {this.tips} +
+ ); + } + return null; + } + + renderFooterLeft() { + return null; + } + + renderFooter() { + if (this.isStep || this.isModal) { + return null; + } + return ( +
+
{this.renderFooterLeft()}
+
+ + +
+
+ ); + } + + renderFormItems() { + try { + return this.formItems.map((it, index) => { + const { name } = it; + this.codeError = false; + return ( + + + + ); + }); + } catch (e) { + // eslint-disable-next-line no-console + console.log(e); + const name = 'error'; + const index = 0; + const it = { + type: 'label', + label: t('Error'), + // if can't submit, go this way to not submit. + // example src/pages/network/containers/VPN/IKEPolicy/actions/Edit.js L60-71 + content: + e.message === 'Can Not Submit' + ? this.errorText + : t('Unable to render form'), + }; + this.codeError = true; + return ( + + + + ); + // return null; + } + } + + renderForms() { + return ( +
+ {this.renderFormItems()} +
+ ); + } + + render() { + return ( +
+ + {this.renderTips()} +
+ {this.renderForms()} +
+ {this.renderFooter()} +
+
+ ); + } +} diff --git a/src/components/Form/index.less b/src/components/Form/index.less new file mode 100644 index 00000000..dfb623eb --- /dev/null +++ b/src/components/Form/index.less @@ -0,0 +1,104 @@ +@import "~styles/variables"; + +.wrapper { + position: relative; + height: 100%; + overflow: hidden; + background-color: #fff; + padding-top: @body-padding; + + :global { + .ant-spin-nested-loading { + height: 100%; + } + + .ant-spin-container { + height: 100%; + } + } +} + +.form { + margin-left: @body-padding * 2; + margin-right: @body-padding * 2; + // padding-top: @body-padding; + background-color: #fff; + height: calc(100% - 48px); + overflow-y: auto; + + :global { + .ant-form-item-label>label { + margin-left: 12px; + } + + .ant-form-item-label>.ant-form-item-required { + margin-left: 0; + } + + .ant-form-item-label { + white-space: break-spaces; + } + } +} + +.footer { + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 48px; + background-color: #fff; + box-shadow: 0px 2px 30px 0px rgba(0, 0, 0, 0.09); +} + +.btns { + float: right; + margin-right: 32px; + margin-top: 8px; + + :global { + button { + margin-left: 8px; + } + } +} + +:global { + .form-item-text { + margin-bottom: 0; + } + + .form-item-divider { + width: 98% !important; + min-width: 90% !important; + margin-left: auto; + margin-right: auto; + } + + .ant-radio-button-wrapper { + color: @color-text-body; + } + .ant-radio-button-wrapper-disabled { + color: rgba(0, 0, 0, 0.25); + } +} + +.tips { + padding: 8px 16px; + background: rgba(89, 157, 255, 0.15); + margin-top: -16px; + margin-bottom: 16px; +} + +.tips-icon { + margin-right: 4px; + color: #0068FF; +} + +.footer-left { + height: 48px; + float: left; + margin-left: 16px; + padding-top: 8px; + color: rgb(72, 72, 72); +} \ No newline at end of file diff --git a/src/components/FormItem/AddSelect/index.jsx b/src/components/FormItem/AddSelect/index.jsx new file mode 100644 index 00000000..87bd083c --- /dev/null +++ b/src/components/FormItem/AddSelect/index.jsx @@ -0,0 +1,272 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React, { Component } from 'react'; +import { Select, Button, Input } from 'antd'; +import { PlusCircleFilled, MinusCircleFilled } from '@ant-design/icons'; +import { isArray, isEqual, isEmpty } from 'lodash'; +import PropTypes from 'prop-types'; +import classnames from 'classnames'; +import { generateId } from 'utils/index'; +import styles from './index.less'; + +export default class index extends Component { + static propTypes = { + minCount: PropTypes.number, + maxCount: PropTypes.number, + tips: PropTypes.node, + options: PropTypes.array, + placeholder: PropTypes.string, + defaultItemValue: PropTypes.any, + addText: PropTypes.string, + addTextTips: PropTypes.string, + width: PropTypes.number, + itemComponent: PropTypes.any, + optionsByIndex: PropTypes.bool, // special: index=0, use [options[0]]; index=1 use [options[1]]; index >= options.length, options + initValue: PropTypes.array, + readonlyKeys: PropTypes.array, + }; + + static defaultProps = { + minCount: 0, + maxCount: Infinity, + addText: t('Add'), + placeholder: t('Please select'), + width: 200, + itemComponent: null, + optionsByIndex: false, + initValue: [], + readonlyKeys: [], + }; + + constructor(props) { + super(props); + const { initValue = [] } = props; + this.state = { + items: this.getInitItems(props), + initValue, + keyId: generateId(), + }; + } + + getInitItems = (props) => { + const { value, initValue } = props; + if (!isEmpty(initValue)) { + return isArray(initValue) ? [...initValue] || [] : []; + } + return isArray(value) ? [...value] || [] : []; + }; + + static getDerivedStateFromProps(nextProps, prevState) { + if (!isEqual(nextProps.initValue, prevState.initValue)) { + return { + initValue: nextProps.initValue, + items: JSON.parse(JSON.stringify(nextProps.initValue)), + keyId: generateId(), + }; + } + return null; + } + + addItem = () => { + const { items } = this.state; + const { maxCount } = this.props; + if (items.length >= maxCount) { + return; + } + const { defaultItemValue } = this.props; + const newItem = { + value: defaultItemValue, + index: items.length, + }; + this.updateItems([...items, newItem]); + }; + + updateItems = (newIems) => { + this.setState( + { + items: newIems, + }, + () => { + const { onChange } = this.props; + if (onChange) { + onChange(newIems); + } + } + ); + }; + + // eslint-disable-next-line no-shadow + canRemove = (index) => { + const { minCount } = this.props; + return index >= minCount; + }; + + // eslint-disable-next-line no-shadow + removeItem = (index) => { + const { items } = this.state; + items.splice(index, 1); + this.updateItems(items); + }; + + // eslint-disable-next-line no-shadow + onItemChange = (newVal, index) => { + const { items } = this.state; + items[index] = { + value: newVal, + index, + }; + this.updateItems(items); + }; + + // eslint-disable-next-line no-shadow + onItemChangeInput = (newVal, index) => { + const { items } = this.state; + items[index] = { + value: newVal, + index, + }; + this.updateItems(items); + }; + + getOptions = (itemIndex) => { + // special: index=0, use [options[0]]; index=1 use [options[1]]; index >= options.length, options + const { optionsByIndex, options } = this.props; + if (!optionsByIndex) { + return options; + } + if (itemIndex < options.length) { + return [options[itemIndex]]; + } + return options; + }; + + renderTip() { + const { tips } = this.props; + if (tips) { + return
{tips}
; + } + return null; + } + + // eslint-disable-next-line no-shadow + renderItem = (item, index) => { + const { itemComponent, readonlyKeys = [], isInput = false } = this.props; + const { placeholder, width } = this.props; + if (!itemComponent) { + if (isInput) { + return ( + { + this.onItemChange(e.currentTarget.value, index); + }} + /> + ); + } + return ( + + + + {type === 'manual' && } + + + ); +}; diff --git a/src/components/FormItem/IPDistributer/Item.jsx b/src/components/FormItem/IPDistributer/Item.jsx new file mode 100644 index 00000000..88c2337e --- /dev/null +++ b/src/components/FormItem/IPDistributer/Item.jsx @@ -0,0 +1,83 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React, { useState } from 'react'; +import { Col, Row, Select } from 'antd'; +import IPAddress from 'components/FormItem/IPDistributer/IPAddress'; + +const Item = ({ subnetsAvailable, onChange, value }) => { + value = value || { + subnet: undefined, + ip_address: { type: 'dhcp', ip: undefined }, + }; + + const [subnet, setSubnet] = useState(value.subnet); + const [ip_address, setIP] = useState({ type: 'dhcp' }); + const [visible, setVisible] = useState(!!value.subnet || false); + const subnetItem = subnetsAvailable.find((i) => i.id === subnet); + + const triggerChange = (changedValue) => { + const item = { + ...value, + subnet, + ip_address, + ...changedValue, + }; + onChange && onChange(item); + }; + + const handleSelectChange = (e, option) => { + setSubnet(option.value); + setVisible(true); + triggerChange({ + subnet: option.value, + }); + }; + + const handleIPChange = (v) => { + setIP(v); + triggerChange({ + ip_address: v, + }); + }; + + return ( + + + + ); + const input = ( + + ); + const deleteValue = deleteType === 1; + const checkbox = ( + + {t('Deleted with the instance')} + + ); + + return ( + + + + {t('Type')} + {selects} + + + {t('Size')} + {input} + GB + {checkbox} + + + + ); + } +} diff --git a/src/components/FormItem/InstanceVolume/index.less b/src/components/FormItem/InstanceVolume/index.less new file mode 100644 index 00000000..c4aa3d27 --- /dev/null +++ b/src/components/FormItem/InstanceVolume/index.less @@ -0,0 +1,15 @@ +.instance-volume { + display: block; + margin-bottom: 8px; +} +.label { + margin-right: 10px; + max-width: 20%; +} +.select { + max-width: 80%; +} +.size-label { + margin-left: 10px; + margin-right: 40px; +} diff --git a/src/components/FormItem/IpInput/index.jsx b/src/components/FormItem/IpInput/index.jsx new file mode 100644 index 00000000..97f35ede --- /dev/null +++ b/src/components/FormItem/IpInput/index.jsx @@ -0,0 +1,163 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React, { Component } from 'react'; +import { Input } from 'antd'; +import PropTypes from 'prop-types'; +import { ipValidate } from 'utils/validate'; +import { sortBy } from 'lodash'; +import styles from './index.less'; + +const { isIPv4 } = ipValidate; + +export default class index extends Component { + static propTypes = { + value: PropTypes.string, + version: PropTypes.number, + onChange: PropTypes.func, + defaultValue: PropTypes.string, + }; + + static defaultProps = { + version: 4, + defaultValue: '', + onChange() {}, + }; + + constructor(props) { + super(props); + const { value, version, defaultValue } = props; + this.state = { + value: this.getIpValues(defaultValue || value), + version, + }; + } + + componentDidUpdate() { + const { disableNotice = false } = this.props; + if (disableNotice) { + return; + } + this.triggerChange(); + } + + static getDerivedStateFromProps(nextProps, prevState) { + const { version } = nextProps; + // fix for re-render when changing ip-version + if (version !== prevState.version) { + return { + version, + value: + version === 4 + ? [undefined, undefined, undefined, undefined] + : undefined, + }; + } + return null; + } + + triggerChange = () => { + const { onChange, version } = this.props; + const { value } = this.state; + let ret; + if (version === 4) { + sortBy(value, (n) => n)[3] !== undefined && (ret = value.join('.')); + } else { + ret = value; + } + onChange && onChange(ret); + }; + + getIpValues = (value) => { + const { version } = this.props; + if (!value && version === 4) { + const ip = []; + for (let i = 0; i < 4; i++) { + ip.push(undefined); + } + return ip; + } + if (isIPv4(value)) { + return value.split('.').map((it) => Number.parseInt(it, 10)); + } + return value; + }; + + // eslint-disable-next-line no-shadow + onInputChange = (newVal, index) => { + const { value } = this.state; + let ipValue = Number.parseInt(newVal, 10); + if (Number.isNaN(ipValue)) { + ipValue = undefined; + } + if (ipValue < 0) { + ipValue = 0; + } + if (ipValue > 255) { + ipValue = 255; + } + value[index] = ipValue; + this.setState( + { + value, + }, + () => { + this.triggerChange(); + } + ); + }; + + onInputChangeIPv6 = (value) => { + this.setState( + { + value, + }, + () => { + this.triggerChange(); + } + ); + }; + + render() { + const { value } = this.state; + const { version } = this.props; + if (version === 6) { + return ( +
+ { + this.onInputChangeIPv6(e.currentTarget.value); + }} + /> +
+ ); + } + // eslint-disable-next-line no-shadow + const inputs = value.map((it, index) => ( +
+ { + this.onInputChange(e.currentTarget.value, index); + }} + /> +
+ )); + return
{inputs}
; + } +} diff --git a/src/components/FormItem/IpInput/index.less b/src/components/FormItem/IpInput/index.less new file mode 100644 index 00000000..b9475225 --- /dev/null +++ b/src/components/FormItem/IpInput/index.less @@ -0,0 +1,45 @@ +.ip-input { + width: 172px; + overflow: hidden; + border-radius: 4px; +} +.item-wrapper { + width: 44px; + position: relative; + display: inline-block; +} +.item-wrapper:last-child { + width: 40px; +} +.item-wrapper:after { + content: " "; + width: 4px; + height: 4px; + border-radius: 50%; + background-color: #484848; + position: absolute; + top: 13px; +} +.item-wrapper:last-child:after { + display: none; +} +.item { + width: 40px; + padding-left: 8px; + padding-right: 8px; + border-top: none; + border-left: none; + border-right: none; + border-radius: 0; + text-align: center; +} + +.item:focus { + border-top: none; + border-left: none; + border-right: none; + box-shadow: none; +} +.ipv6 { + width: 120px; +} \ No newline at end of file diff --git a/src/components/FormItem/IpInputSimple/index.jsx b/src/components/FormItem/IpInputSimple/index.jsx new file mode 100644 index 00000000..083c2b2a --- /dev/null +++ b/src/components/FormItem/IpInputSimple/index.jsx @@ -0,0 +1,58 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React, { Component } from 'react'; +import { Input, Form } from 'antd'; +import { ipValidate } from 'utils/validate'; + +const { ipv4Validator, ipv6Validator } = ipValidate; + +export default class index extends Component { + static isFormItem = true; + + getRules(rules, version) { + let newRules = { + validator: version === 4 ? ipv4Validator : ipv6Validator, + }; + if (rules && rules.length > 0) { + newRules = { + ...newRules, + ...rules[0], + }; + } + return [newRules]; + } + + render() { + const { componentProps = {}, formItemProps = {} } = this.props; + const { version = 4, ...componentRest } = componentProps; + const placeholder = + version === 4 ? t('Please input ipv4') : t('Please input ipv6'); + const props = { + placeholder, + ...componentRest, + }; + const { rules, ...rest } = formItemProps; + const newRules = this.getRules(rules, version); + const newFormItemProps = { + ...rest, + rules: newRules, + }; + return ( + + + + ); + } +} diff --git a/src/components/FormItem/IpInputSimple/index.less b/src/components/FormItem/IpInputSimple/index.less new file mode 100644 index 00000000..b9475225 --- /dev/null +++ b/src/components/FormItem/IpInputSimple/index.less @@ -0,0 +1,45 @@ +.ip-input { + width: 172px; + overflow: hidden; + border-radius: 4px; +} +.item-wrapper { + width: 44px; + position: relative; + display: inline-block; +} +.item-wrapper:last-child { + width: 40px; +} +.item-wrapper:after { + content: " "; + width: 4px; + height: 4px; + border-radius: 50%; + background-color: #484848; + position: absolute; + top: 13px; +} +.item-wrapper:last-child:after { + display: none; +} +.item { + width: 40px; + padding-left: 8px; + padding-right: 8px; + border-top: none; + border-left: none; + border-right: none; + border-radius: 0; + text-align: center; +} + +.item:focus { + border-top: none; + border-left: none; + border-right: none; + box-shadow: none; +} +.ipv6 { + width: 120px; +} \ No newline at end of file diff --git a/src/components/FormItem/JsonInput/index.jsx b/src/components/FormItem/JsonInput/index.jsx new file mode 100644 index 00000000..7f9f1f3b --- /dev/null +++ b/src/components/FormItem/JsonInput/index.jsx @@ -0,0 +1,63 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React, { Component } from 'react'; +import { Form } from 'antd'; +import { jsonValidator } from 'utils/validate'; +import AceEditor from 'react-ace'; + +export default class JsonInput extends Component { + static isFormItem = true; + + getRules(rules) { + let newRules = { + validator: jsonValidator, + }; + if (rules && rules.length > 0) { + newRules = { + ...newRules, + ...rules[0], + }; + } + return [newRules]; + } + + render() { + const { componentProps, formItemProps } = this.props; + const { rules, ...rest } = formItemProps; + const newRules = this.getRules(rules); + const newFormItemProps = { + ...rest, + rules: newRules, + }; + const options = { + ...componentProps, + mode: 'json', + wrapEnabled: true, + tabSize: 2, + width: '100%', + height: '200px', + setOptions: { + enableBasicAutocompletion: true, + enableLiveAutocompletion: true, + enableSnippets: true, + }, + }; + return ( + + + + ); + } +} diff --git a/src/components/FormItem/KeyValueInput/index.jsx b/src/components/FormItem/KeyValueInput/index.jsx new file mode 100644 index 00000000..dde6f706 --- /dev/null +++ b/src/components/FormItem/KeyValueInput/index.jsx @@ -0,0 +1,108 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React, { Component } from 'react'; +import { Input, Row, Col } from 'antd'; +import PropTypes from 'prop-types'; +import { PauseOutlined } from '@ant-design/icons'; + +export default class index extends Component { + static propTypes = { + onChange: PropTypes.func, + // eslint-disable-next-line react/no-unused-prop-types + value: PropTypes.object, + keyReadonly: PropTypes.bool, + valueReadonly: PropTypes.bool, + }; + + static defaultProps = { + onChange: null, + value: { + key: '', + value: '', + }, + keyReadonly: false, + valueReadonly: false, + }; + + constructor(props) { + super(props); + this.state = { + key: '', + value: '', + }; + } + + static getDerivedStateFromProps(nextProps, prevState) { + const { key, value } = nextProps.value || {}; + if (key !== prevState.key || value !== prevState.value) { + return { + key, + value, + }; + } + return null; + } + + onChange = (value) => { + const { onChange } = this.props; + if (onChange) { + onChange(value); + } + }; + + onKeyChange = (e) => { + this.onChange({ + ...this.state, + key: e.target.value, + }); + }; + + onValueChange = (e) => { + this.onChange({ + ...this.state, + value: e.target.value, + }); + }; + + render() { + const { key, value } = this.state; + const { keyReadonly, valueReadonly } = this.props; + return ( + + + + + + + + + + + + ); + } +} diff --git a/src/components/FormItem/Label/index.jsx b/src/components/FormItem/Label/index.jsx new file mode 100644 index 00000000..d02aaf08 --- /dev/null +++ b/src/components/FormItem/Label/index.jsx @@ -0,0 +1,96 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import imageSvg from 'src/asset/image/image.svg'; + +import { + DesktopOutlined, + BorderOuterOutlined, + SecurityScanOutlined, + InboxOutlined, + GlobalOutlined, + GatewayOutlined, + UserOutlined, + CameraOutlined, + SaveOutlined, + KeyOutlined, + ClusterOutlined, + TagOutlined, + HddOutlined, + CloudServerOutlined, +} from '@ant-design/icons'; +import styles from './index.less'; + +const ImageIcon = ( + image_icon +); + +const iconTypeMap = { + instance: , + router: , + externalNetwork: , + network: , + firewall: , + volume: , + gateway: , + user: , + snapshot: , + backup: , + keypair: , + image: ImageIcon, + aggregate: , + metadata: , + flavor: , + host: , +}; + +export default class index extends Component { + static propTypes = { + content: PropTypes.any, + value: PropTypes.any, + icon: PropTypes.node, + iconType: PropTypes.string, + }; + + static defaultProps = { + icon: null, + iconType: '', + content: '', + value: null, + }; + + renderIcon() { + const { icon, iconType } = this.props; + if (iconType) { + const iconComp = iconTypeMap[iconType] || null; + return {iconComp}; + } + return {icon || null}; + } + + render() { + const { content, value, iconType, ...rest } = this.props; + if (content) { + return content; + } + return ( + + {this.renderIcon()} + {value} + + ); + } +} diff --git a/src/components/FormItem/Label/index.less b/src/components/FormItem/Label/index.less new file mode 100644 index 00000000..5060c5b8 --- /dev/null +++ b/src/components/FormItem/Label/index.less @@ -0,0 +1,3 @@ +.icon { + margin-right: 8px; +} \ No newline at end of file diff --git a/src/components/FormItem/MacAddressInput/index.jsx b/src/components/FormItem/MacAddressInput/index.jsx new file mode 100644 index 00000000..5945b36d --- /dev/null +++ b/src/components/FormItem/MacAddressInput/index.jsx @@ -0,0 +1,116 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React, { Component } from 'react'; +import { Col, Form, Input, Row, Select } from 'antd'; +import { macAddressValidate } from 'utils/validate'; + +class MacAddressInput extends Component { + constructor(props) { + super(props); + this.state = { + name: { + type: '', + mac: '', + }, + }; + } + + handleSelectChange = (e) => { + const { name } = this.state; + this.setState( + { + name: { + ...name, + type: e, + }, + }, + () => { + const { onChange } = this.props; + if (onChange) { + onChange(this.state.name); + } + } + ); + }; + + handleInputChange = (e) => { + const { name } = this.state; + this.setState({ + name: { + ...name, + mac: e, + }, + }); + }; + + render() { + const { value, name, options } = this.props; + const { type } = value || { type: undefined }; + + return ( + + + + + + ) : null + // + // {t('Mac Address Numbers can be use {num}' + // , { num: 123 })} + // + } + + + ); + } +} + +export default MacAddressInput; diff --git a/src/components/FormItem/MemberAllocator/IPAddress.jsx b/src/components/FormItem/MemberAllocator/IPAddress.jsx new file mode 100644 index 00000000..aa552eab --- /dev/null +++ b/src/components/FormItem/MemberAllocator/IPAddress.jsx @@ -0,0 +1,86 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React, { useState } from 'react'; +import { InputNumber, Row, Col, Input } from 'antd'; + +export default ({ value = {}, onChange, disabled }) => { + const [ip, setIp] = useState(value.ip || undefined); + const [protocol_port, setPort] = useState(value.protocol_port || undefined); + const [weight, setWeight] = useState(value.weight); + + const triggerChange = (changedValue) => { + onChange({ + ip, + protocol_port, + weight, + ...value, + ...changedValue, + }); + }; + + const onIpChange = ({ target: { value: newIP } }) => { + setIp(newIP); + triggerChange({ + ip: newIP, + }); + }; + + const onPortChange = (val) => { + val && setPort(val); + val && + triggerChange({ + protocol_port: val, + }); + }; + + const onWeightChange = (val) => { + val && setWeight(val); + val && + triggerChange({ + weight: val, + }); + }; + + return ( + + + + + + + + + + + + ); +}; diff --git a/src/components/FormItem/MemberAllocator/Item.jsx b/src/components/FormItem/MemberAllocator/Item.jsx new file mode 100644 index 00000000..ed9f4f88 --- /dev/null +++ b/src/components/FormItem/MemberAllocator/Item.jsx @@ -0,0 +1,51 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React, { useState } from 'react'; +import IPAddress from './IPAddress'; + +const Item = ({ onChange, value }) => { + value = value || { + ip_address: { ip: undefined, protocol_port: undefined, weight: 1 }, + canEdit: true, + }; + const [ip_address, setIP] = useState(value.ip_address); + // const [visible, setVisible] = useState(!!value.subnet || false); + + const triggerChange = (changedValue) => { + const item = { + ...value, + ip_address, + ...changedValue, + }; + onChange && onChange(item); + }; + + const handleIPChange = (v) => { + setIP(v); + triggerChange({ + ip_address: v, + }); + }; + + return ( + + ); +}; + +export default Item; diff --git a/src/components/FormItem/MemberAllocator/index.jsx b/src/components/FormItem/MemberAllocator/index.jsx new file mode 100644 index 00000000..5f6026e7 --- /dev/null +++ b/src/components/FormItem/MemberAllocator/index.jsx @@ -0,0 +1,309 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React, { useState } from 'react'; +import { Form, Button, Row, Col, Select } from 'antd'; +import { MinusCircleOutlined, PlusOutlined } from '@ant-design/icons'; +import SelectTable from 'components/FormItem/SelectTable'; +import { ipValidate } from 'utils/validate'; +import { isAdminPage } from 'utils/index'; +import { Link } from 'react-router-dom'; +import { Address4, Address6 } from 'ip-address'; +import Item from './Item'; + +const { isIPv4, isIpv6 } = ipValidate; + +const MemberAllocator = ({ componentProps, formItemProps }) => { + const { maxNumber = 10, ports, isLoading, members = [] } = componentProps; + const { name, onChange } = formItemProps; + + const [currentFieldsLength, setLength] = useState(0); + + const triggerChange = (data) => { + onChange && onChange(data); + }; + + function getUrl(path, adminStr) { + const { pathname } = window.location; + return isAdminPage(pathname) ? `${path}${adminStr || '-admin'}` : path; + } + + let addOuter = () => {}; + + return ( +
+ + ( +
+
+ + {record.id} + +
+
{n || '-'}
+
+ ), + }, + { + title: t('Binding Instance'), + dataIndex: 'server_name', + }, + { + title: t('IP'), + dataIndex: 'fixed_ips', + render: (fixed_ips, record) => { + if (fixed_ips.length === 0) { + return '-'; + } + const options = fixed_ips.map((i) => ({ + label: i.ip_address, + value: i.ip_address, + subnet_id: i.subnet_id, + })); + record.currentOption = options[0].value; + return ( + + this.onInputChange(value, record)} + placeholder={t('Please select')} + /> + ); + } + if ( + type === 'integer' || + type === 'number' || + (type === 'string' && enums.length === 0) + ) { + const props = { + defaultValue, + onChange: (value) => this.onInputChange(value, record), + placeholder: t('Please input'), + required: true, + }; + if (minimum !== undefined) { + props.minimum = minimum; + } + if (maximum !== undefined) { + props.maximum = maximum; + } + if (type === 'string') { + return ; + } + if (type === 'integer') { + props.precision = 0; + props.formatter = (value) => `$ ${value}`.replace(/\D/g, ''); + } + return ; + } + // if (enums.length > 0 && operators.length === 1 && operators[0] === '') { + if (enums.length > 0) { + const options = enums.map((it) => ({ + value: it, + label: it, + })); + return ( + +
+ ); + } +} diff --git a/src/components/FormItem/NetworkSelect/index.jsx b/src/components/FormItem/NetworkSelect/index.jsx new file mode 100644 index 00000000..095ec368 --- /dev/null +++ b/src/components/FormItem/NetworkSelect/index.jsx @@ -0,0 +1,369 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React from 'react'; +import { Row, Col, Form, Tooltip, Input } from 'antd'; +import Select from 'components/FormItem/Select'; +import PropTypes from 'prop-types'; +import { ipValidate } from 'utils/validate'; +import { QuestionCircleOutlined } from '@ant-design/icons'; +import { ipTypeOptions } from 'resources/network'; +// import { getIpInitValue } from 'resources/instance'; +import styles from './index.less'; + +const { isIPv4, isIpv6, isIpInRangeAll } = ipValidate; + +export default class NetworkSelect extends React.Component { + static propTypes = { + // eslint-disable-next-line react/no-unused-prop-types + networks: PropTypes.array, + // eslint-disable-next-line react/no-unused-prop-types + subnets: PropTypes.array, + value: PropTypes.object, + ipType: PropTypes.number, + name: PropTypes.string, + optionsByIndex: PropTypes.bool, + index: PropTypes.number, + }; + + static defaultProps = { + networks: [], + subnets: [], + value: {}, + ipType: 0, + name: 'network', + optionsByIndex: false, + index: 0, + }; + + constructor(props) { + super(props); + const { value } = props; + const { network, subnet, ip, ipType } = value; + this.state = { + network: network || null, + subnet: subnet || null, + ip: ip || '0.0.0.0', + ipType: ipType || 0, + }; + } + + static getDerivedStateFromProps(nextProps, prevState) { + if ( + nextProps.networks !== prevState.networks || + nextProps.subnets !== prevState.subnets + ) { + const { networks, subnets } = nextProps; + return { + networks, + subnets, + }; + } + return null; + } + + componentDidMount() { + this.checkNetwork(); + } + + onChange = () => { + this.checkNetwork(() => { + const { onChange } = this.props; + const { network, subnet, ip, ipType, validateStatus, errorMsg } = + this.state; + const networkOptions = this.getNetworkOptions(); + const subnetOptions = this.getSubnetOptions(); + const networkOption = networkOptions.find((it) => it.value === network); + const subnetOption = subnetOptions.find((it) => it.value === subnet); + const ipTypeOption = ipTypeOptions.find((it) => it.value === ipType); + if (onChange) { + onChange({ + network, + subnet, + ip, + ipType, + networkOption, + subnetOption, + ipTypeOption, + validateStatus, + errorMsg, + }); + } + }); + }; + + onNetworkChange = (value) => { + const { subnets } = this.state; + const subs = subnets.filter((it) => it.network_id === value); + const subnet = subs.length ? subs[0].id : null; + this.setState( + { + network: value, + subnet, + ipType: 0, + // defaultIp: this.getIpInitValue(subnet), + ip: undefined, + }, + this.onChange + ); + }; + + onSubnetChange = (value) => { + this.setState( + { + subnet: value, + // defaultIp: this.getIpInitValue(value), + ip: undefined, + }, + this.onChange + ); + }; + + // getIpInitValue = (subnet) => { + // const { subnets } = this.state; + // const subnetItem = subnets.find(it => it.id === subnet); + // return getIpInitValue(subnetItem); + // } + + onTypeChange = (value) => { + this.setState( + { + ipType: value, + }, + this.onChange + ); + }; + + onIPChange = (e) => { + const { value } = e.currentTarget; + this.setState( + { + ip: value, + }, + this.onChange + ); + }; + + checkNetwork = (callback) => { + const { network, subnets, subnet, ip, ipType } = this.state; + const item = subnets.find((it) => it.id === subnet); + const { allocation_pools: pools } = item || {}; + + if (!network) { + this.setState( + { + errorMsg: t('Pleasse select a network!'), + validateStatus: 'error', + }, + callback + ); + return; + } + // if (!subnet) { + // this.setState({ + // errorMsg: t('Pleasse select a subnet!'), + // validateStatus: 'error', + // }, callback); + // return; + // } + if (ipType === 1 && !isIPv4(ip) && !isIpv6(ip)) { + this.setState( + { + errorMsg: t('Pleasse input a valid ip!'), + validateStatus: 'error', + }, + callback + ); + return; + } + if (pools && ipType === 1) { + const okPool = pools.find((pool) => + isIpInRangeAll(ip, pool.start, pool.end) + ); + if (!okPool) { + this.setState( + { + errorMsg: t('The ip is not within the allocated pool!'), + validateStatus: 'error', + }, + callback + ); + return; + } + } + this.setState( + { + errorMsg: undefined, + validateStatus: 'success', + }, + callback + ); + }; + + getNetworkOptions = () => { + const { networks } = this.state; + const { optionsByIndex, index } = this.props; + let datas = [...networks]; + if (optionsByIndex && index < networks.length) { + datas = [networks[index]]; + } + return datas.map((it) => ({ + label: it.name, + value: it.id, + })); + }; + + getSubnetOptions = () => { + const { network, subnets } = this.state; + if (!network) { + return []; + } + return subnets + .filter((it) => it.network_id === network) + .map((it) => ({ + label: it.name, + value: it.id, + })); + }; + + renderNetwork() { + const { network } = this.state; + return ( + + +
{tips}
+ + ); + } + + renderIpType() { + const { network, ipType } = this.state; + if (!network) { + return null; + } + return ( + + + + + + + ); + } + + render() { + const { validateStatus, errorMsg } = this.state; + const { name } = this.props; + return ( + + + {this.renderNetwork()} + {this.renderIpType()} + {this.renderSubnet()} + {this.renderIp()} + + + ); + } +} diff --git a/src/components/FormItem/NetworkSelect/index.less b/src/components/FormItem/NetworkSelect/index.less new file mode 100644 index 00000000..e4b67e18 --- /dev/null +++ b/src/components/FormItem/NetworkSelect/index.less @@ -0,0 +1,36 @@ +@import "~styles/variables"; +.network-select { + display: block; + height: 61.6px; + margin-bottom: 0 !important; + position: relative; + :global { + .ant-form-item-control-input-content { + height: 61.6px; + } + .ant-form-item-explain { + position: absolute; + bottom: 0; + } + } +} +.label { + margin-right: 10px; +} +.select { + margin-right: 40px; +} +.size-label { + margin-left: 10px; + margin-right: 40px; +} +.tips { + margin-top: 0; +} +.label { + color: @color-text-caption; + line-height: 30px; +} +.content { + color: @color-text-body; +} \ No newline at end of file diff --git a/src/components/FormItem/NetworkSelectTable/index.jsx b/src/components/FormItem/NetworkSelectTable/index.jsx new file mode 100644 index 00000000..9ac5d90f --- /dev/null +++ b/src/components/FormItem/NetworkSelectTable/index.jsx @@ -0,0 +1,190 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React, { Component } from 'react'; +import { inject, observer } from 'mobx-react'; +import TabSelectTable from 'components/FormItem/TabSelectTable'; +import { NetworkStore } from 'stores/neutron/network'; +import { yesNoOptions } from 'utils/constants'; +import { networkColumns, networkSortProps } from 'resources/network'; +import { isAdminPage } from 'utils/index'; + +@inject('rootStore') +@observer +export default class NetworkSelectTable extends Component { + constructor(props) { + super(props); + this.stores = { + project: new NetworkStore(), + shared: new NetworkStore(), + external: new NetworkStore(), + all: new NetworkStore(), + }; + } + + get location() { + const { location = {} } = (this.props.rootStore || {}).routing || {}; + return location; + } + + get isAdminPage() { + const { pathname } = this.location; + return isAdminPage(pathname); + } + + get currentProjectId() { + return globals.user.project.id; + } + + get hasAdminRole() { + return this.props.rootStore.hasAdminRole; + } + + get showExternal() { + const { showExternal = false } = this.props; + return showExternal; + } + + get networkTabs() { + const tabs = [ + { title: t('Current Project Network'), key: 'project' }, + { title: t('Shared Network'), key: 'shared' }, + ]; + if (this.showExternal) { + tabs.push({ + title: t('External Network'), + key: 'external', + }); + } + if (this.hasAdminRole) { + tabs.push({ + title: t('All Network'), + key: 'all', + }); + } + tabs.forEach((tab) => { + tab.props = this.getSelectTableProps(tab); + }); + return tabs; + } + + getSelectTableProps = (tab) => ({ + columns: this.getColumns(tab), + filterParams: this.getNetworkFilters(tab), + extraParams: this.getNetworkExtraParams(tab), + backendPageStore: this.getStore(tab), + disabledFunc: this.getDisabledFunc(), + isMulti: this.props.isMulti || false, + ...networkSortProps, + }); + + getUrl(path, adminStr) { + return this.isAdminPage ? `${path}${adminStr || '-admin'}` : path; + } + + getColumns = (tab) => { + const columns = networkColumns(this); + columns[0].render = null; + const { key } = tab; + if (key === 'project') { + return columns.filter((it) => it.dataIndex !== 'project_id'); + } + if (['shared', 'router:external'].indexOf(key) >= 0) { + return columns.filter((it) => it.dataIndex !== key); + } + return columns; + }; + + onChange = (value) => { + const { onChange } = this.props; + onChange && onChange(value); + }; + + get labelStyle() { + return { + marginRight: 16, + }; + } + + getStore(tab) { + const { key } = tab; + return this.stores[key]; + } + + getNetworkFilters = (tab) => { + const { key } = tab; + const filters = [ + { + label: t('Name'), + name: 'name', + }, + ]; + if (key !== 'shared') { + filters.push({ + label: t('Shared'), + name: 'shared', + options: yesNoOptions, + }); + } + if (this.showExternal && key !== 'external') { + filters.push({ + label: t('External Network'), + name: 'router:external', + options: yesNoOptions, + }); + } + if (key !== 'project') { + filters.push({ + label: t('Project Range'), + name: 'project_id', + options: [ + { label: t('Current Project'), key: this.currentProjectId }, + { label: t('All'), key: 'all' }, + ], + }); + } + return filters; + }; + + getNetworkExtraParams = (tab) => { + const { key } = tab; + if (key === 'project') { + return { project_id: this.currentProjectId }; + } + if (key === 'shared') { + return { shared: true }; + } + if (key === 'external') { + return { 'router:external': true }; + } + return {}; + }; + + getDisabledFunc() { + return this.props.disabledFunc; + } + + render() { + const { isMulti = false, header, value } = this.props; + return ( + + ); + } +} diff --git a/src/components/FormItem/PortRange/index.jsx b/src/components/FormItem/PortRange/index.jsx new file mode 100644 index 00000000..cb1cd24b --- /dev/null +++ b/src/components/FormItem/PortRange/index.jsx @@ -0,0 +1,49 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React, { Component } from 'react'; +import { Input, Form } from 'antd'; +import { portRangeValidate, portRangeMessage } from 'utils/validate'; + +export default class index extends Component { + static isFormItem = true; + + getRules(rules) { + const newRules = { + validator: portRangeValidate, + }; + return [newRules, ...rules]; + } + + render() { + const { componentProps, formItemProps } = this.props; + const placeholder = t('Please input port range'); + const props = { + placeholder, + ...componentProps, + }; + const { rules, ...rest } = formItemProps; + const newRules = this.getRules(rules); + const newFormItemProps = { + ...rest, + rules: newRules, + extra: portRangeMessage, + }; + return ( + + + + ); + } +} diff --git a/src/components/FormItem/Radio/index.jsx b/src/components/FormItem/Radio/index.jsx new file mode 100644 index 00000000..eccfac92 --- /dev/null +++ b/src/components/FormItem/Radio/index.jsx @@ -0,0 +1,90 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React, { Component } from 'react'; +import { Radio } from 'antd'; +import PropTypes from 'prop-types'; +import classnames from 'classnames'; +import styles from './index.less'; + +export default class index extends Component { + static propTypes = { + options: PropTypes.array, + onChange: PropTypes.func, + optionType: PropTypes.string, + buttonStyle: PropTypes.string, + onlyRadio: PropTypes.bool, + isWrappedValue: PropTypes.bool, + }; + + static defaultProps = { + options: [], + optionType: 'button', + buttonStyle: 'solid', + onlyRadio: false, + isWrappedValue: false, + }; + + onChange = (e) => { + const { value } = e.target; + const { options, onChange, isWrappedValue } = this.props; + if (!isWrappedValue) { + onChange && onChange(value); + } else { + const option = options.find((it) => it.value === value); + onChange && onChange(option); + } + }; + + getValue = (isWrappedValue, value) => { + if (value === undefined) return value; + return isWrappedValue ? value.value : value; + }; + + render() { + const { + options, + optionType, + buttonStyle, + onlyRadio, + className, + value, + isWrappedValue, + ...rest + } = this.props; + const items = options.map((it) => + optionType === 'default' ? ( + + {it.label} + + ) : ( + + {it.label} + + ) + ); + return ( + + {items} + + ); + } +} diff --git a/src/components/FormItem/Radio/index.less b/src/components/FormItem/Radio/index.less new file mode 100644 index 00000000..ab000363 --- /dev/null +++ b/src/components/FormItem/Radio/index.less @@ -0,0 +1,18 @@ +@import "~styles/variables"; + +.only-radio { + :global { + .ant-radio-button-wrapper { + margin-left: 8px; + border-radius: @border-radius; + border-left-width: 1px; + } + .ant-radio-button-wrapper:before { + display: none; + } + .ant-radio-button-wrapper:first-child { + margin-left: 0; + border-radius: @border-radius; + } + } +} \ No newline at end of file diff --git a/src/components/FormItem/Select/index.jsx b/src/components/FormItem/Select/index.jsx new file mode 100644 index 00000000..58804478 --- /dev/null +++ b/src/components/FormItem/Select/index.jsx @@ -0,0 +1,105 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React, { Component } from 'react'; +import { Select, Row, Col, Checkbox } from 'antd'; +import { isUndefined, isNull } from 'lodash'; +import styles from './index.less'; + +export default class index extends Component { + constructor(props) { + super(props); + const { checkOptions } = props; + if (checkOptions) { + this.state = { + selectAll: false, + }; + } + } + + onChange = (value, option) => { + const { onChange, isWrappedValue } = this.props; + onChange && onChange(isWrappedValue ? option : value); + }; + + getValue = () => { + const { value, isWrappedValue } = this.props; + if (value === undefined) return value; + return isWrappedValue ? value.value : value; + }; + + onCheckChange = () => { + const { selectAll } = this.state; + const { options, checkOptions } = this.props; + this.setState( + { + selectAll: 1 - selectAll, + }, + this.onChange( + selectAll === 1 + ? checkOptions[checkOptions.length - 1].value + : options[options.length - 1].value + ) + ); + }; + + render() { + const { + value, + placeholder = t('Please select'), + isWrappedValue, + checkOptions, + checkBoxInfo, + ...rest + } = this.props; + if (isUndefined(value) || isNull(value)) { + return ( + + + + {box} + + + ); + } + return ( + + + + {items} + + ); + // return currentUser && currentUser.name ? menuHeaderDropdown : null; + return ( + +
+ + + {/* style={{ display: 'inline-block', width: '115px' }} */} + {projectName} + + + {userDomainName} +
+
+ ); + } +} diff --git a/src/components/Layout/GlobalHeader/ProjectTable.jsx b/src/components/Layout/GlobalHeader/ProjectTable.jsx new file mode 100644 index 00000000..7a03b462 --- /dev/null +++ b/src/components/Layout/GlobalHeader/ProjectTable.jsx @@ -0,0 +1,147 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { inject, observer } from 'mobx-react'; +import { ModalAction } from 'containers/Action'; +import { toJS } from 'mobx'; +import { allCanReadPolicy } from 'resources/policy'; + +@inject('rootStore') +@observer +export default class ProjectSelect extends ModalAction { + static id = 'project-id'; + + static title = t('Switch Project'); + + static buttonText = ' '; + + init() {} + + get name() { + return t('Switch Project'); + } + + static get modalSize() { + return 'large'; + } + + getModalSize() { + return 'large'; + } + + get messageHasItemName() { + return false; + } + + static policy = allCanReadPolicy; + + static allowed = () => Promise.resolve(true); + + state = { + projectName: '', + }; + + get user() { + const { user } = this.props.rootStore; + return user; + } + + get project() { + const { + project: { + id: projectId = '', + name: projectName = '', + domain: { name: userDomainName } = {}, + } = {}, + } = this.user || {}; + return { + projectId, + projectName, + userDomainName, + }; + } + + get projects() { + const { projects = {} } = this.user || {}; + const { projectName } = this.state; + const items = Object.keys(toJS(projects) || {}) + .map((key) => { + const { name, domain_id } = projects[key]; + return { + id: key, + projectId: key, + name, + domain_id, + }; + }) + .filter((it) => { + if (!projectName) { + return true; + } + return ( + it.name.toLowerCase().indexOf(projectName.toLowerCase()) >= 0 || + it.projectId.toLowerCase().indexOf(projectName.toLowerCase()) >= 0 + ); + }); + return items; + } + + get defaultValue() { + const { projectId = '' } = this.project; + return { + project: { + selectedRowKeys: [projectId], + }, + }; + } + + get formItems() { + return [ + { + name: 'project', + label: t('Owned Project'), + type: 'select-table', + datas: this.projects, + filterParams: [ + { + label: t('Project Name'), + name: 'name', + }, + ], + columns: [ + { + title: t('Project Name'), + dataIndex: 'name', + }, + { + title: t('ID'), + dataIndex: 'id', + }, + ], + }, + ]; + } + + onSubmit = async (values) => { + const { + project: { selectedRowKeys }, + } = values; + const key = selectedRowKeys[0]; + const item = this.projects.find((it) => it.id === key); + const { domain_id: domainId } = item || {}; + const { rootStore } = this.props; + this.routing.push('/base/overview'); + await rootStore.switchProject(key, domainId); + }; +} diff --git a/src/components/Layout/GlobalHeader/RightContent.jsx b/src/components/Layout/GlobalHeader/RightContent.jsx new file mode 100644 index 00000000..08ad311c --- /dev/null +++ b/src/components/Layout/GlobalHeader/RightContent.jsx @@ -0,0 +1,107 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React from 'react'; +import { Button, Col, Row } from 'antd'; +import Avatar from './AvatarDropdown'; +import styles from './index.less'; + +const gotoConsole = (type, props) => { + const { rootStore } = props; + rootStore.clearData(); + if (type === 0) { + rootStore.routing.push('/base/overview'); + } else { + rootStore.routing.push('/base/overview-admin'); + } +}; + +const GlobalHeaderRight = (props) => { + const { isAdminPage = false, rootStore: { hasAdminRole = false } = {} } = + props; + let linkRender = null; + if (isAdminPage) { + linkRender = ( + + ); + } else if (hasAdminRole) { + linkRender = ( + + ); + } + + return ( +
+ + {linkRender} + + + + +
+ ); +}; + +export default GlobalHeaderRight; + +// import React from 'react'; +// import Avatar from './AvatarDropdown'; +// import { Divider } from 'antd'; +// import styles from './index.less'; +// import Message from './Message'; +// import { Link } from 'react-router-dom'; + +// const GlobalHeaderRight = (props) => { +// const { isAdminPage = false, rootStore: { hasAdminRole = false } = {} } = props; +// let linkRender = null; +// if (hasAdminRole) { +// const consoleLink = isAdminPage ? +// { t('Console') } : +// {t('Console')}; +// const adminLink = !isAdminPage ? +// { t('Administrator') } : +// {t('Administrator')}; +// linkRender =
+// { consoleLink } +// +// { adminLink } +//
; +// } + +// return
+// {linkRender} +// +// +//
; +// }; + +// export default GlobalHeaderRight; diff --git a/src/components/Layout/GlobalHeader/Token.jsx b/src/components/Layout/GlobalHeader/Token.jsx new file mode 100644 index 00000000..6bbd2ce0 --- /dev/null +++ b/src/components/Layout/GlobalHeader/Token.jsx @@ -0,0 +1,132 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React from 'react'; +import { inject, observer } from 'mobx-react'; +import { Typography } from 'antd'; +import { ModalAction } from 'containers/Action'; +import { allCanReadPolicy } from 'resources/policy'; +import styles from './index.less'; + +const { Paragraph } = Typography; + +@inject('rootStore') +@observer +export default class Token extends ModalAction { + static id = 'get-token'; + + static title = t('Get Token'); + + get name() { + return t('Get Token'); + } + + get token() { + const key = 'keystone_token'; + const item = localStorage.getItem(key); + try { + return JSON.parse(item) || {}; + } catch (e) { + return {}; + } + } + + get showNotice() { + return false; + } + + get tokenValue() { + return this.token.value || ''; + } + + get tokenExpiry() { + const { expires } = this.token; + return expires || 0; + } + + getLeftStr = (value) => { + const left = value - Date.now(); + const seconds = Math.floor(left / 1000); + if (seconds < 60) { + return t('{seconds} seconds', { seconds }); + } + const minutes = Math.floor(seconds / 60); + const leftSeconds = seconds % 60; + if (minutes < 60) { + return t('{minutes} minutes {leftSeconds} seconds', { + minutes, + leftSeconds, + }); + } + const hours = Math.floor(minutes / 60); + const leftMinutes = minutes % 60; + return t('{hours} hours {leftMinutes} minutes {leftSeconds} seconds', { + hours, + leftMinutes, + leftSeconds, + }); + }; + + get tips() { + return t( + 'Please save your token properly and it will be valid for {left}.', + { left: this.getLeftStr(this.tokenExpiry) } + ); + } + + get defaultValue() { + const value = { + token: this.tokenValue, + }; + return value; + } + + static policy = allCanReadPolicy; + + static allowed = () => Promise.resolve(true); + + get labelCol() { + return { + xs: { span: 0 }, + sm: { span: 0 }, + }; + } + + get wrapperCol() { + return { + xs: { span: 24 }, + sm: { span: 24 }, + }; + } + + get formItems() { + return [ + { + name: 'token', + label: '', + type: 'label', + component: ( + +
{this.tokenValue}
+
+ ), + }, + ]; + } + + onSubmit = () => Promise.resolve(); +} diff --git a/src/components/Layout/GlobalHeader/index.jsx b/src/components/Layout/GlobalHeader/index.jsx new file mode 100644 index 00000000..41941b80 --- /dev/null +++ b/src/components/Layout/GlobalHeader/index.jsx @@ -0,0 +1,28 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React from 'react'; +import RightContent from './RightContent'; +import ProjectDropdown from './ProjectDropdown'; +import styles from './index.less'; + +export default function HeaderContent(props) { + const { isAdminPage = false } = props; + return ( +
+ {!isAdminPage && } + +
+ ); +} diff --git a/src/components/Layout/GlobalHeader/index.less b/src/components/Layout/GlobalHeader/index.less new file mode 100644 index 00000000..ce79864f --- /dev/null +++ b/src/components/Layout/GlobalHeader/index.less @@ -0,0 +1,192 @@ +@import "~styles/variables"; + +.menu { + :global(.anticon) { + margin-right: 8px; + } + + :global(.ant-dropdown-menu-item) { + min-width: 245px; + } + + .no-hover { + overflow: hidden; + + &:hover { + background-color: #fff; + } + } + + .name-item { + padding: 0 12px; + line-height: 40px; + + .user-label { + font-weight: "bold"; + margin-right: 8px; + } + + span { + line-height: 40px; + } + } + + .menu-item { + line-height: 30px; + } +} + +.no-padding-top { + padding-top: 0; +} + +.logout { + float: right; + line-height: 40px; +} + +.right { + position: absolute; + top: 0; + right: 31px; + line-height: @header-height; + + .action { + display: inline-block; + } + + .right_message { + + .message_avatar { + background-color: #fff; + color: rgba(0, 0, 0, 0.65); + margin-top: -4px; + } + + :global { + .ant-badge-dot { + transform: translate(-55%, 10%); + } + .ant-avatar-square { + border-radius: 3px !important; + } + } + } +} + +.project-menu { + :global(.ant-dropdown-menu) { + width: 170px; + } + + :global { + + .ant-dropdown-menu-item:hover, + .ant-dropdown-menu-submenu-title:hover { + cursor: pointer; + } + + .ant-dropdown-menu-item-disabled, + .ant-dropdown-menu-submenu-title-disabled { + cursor: pointer; + } + } + + .title { + cursor: auto; + + &:hover { + background-color: #fff; + } + } +} + +.project { + float: left; + cursor: pointer; + font-size: 14px; + line-height: @header-height; + + :global { + .ant-divider { + background-color: #d2d2d2; + margin-left: 24px; + margin-right: 24px; + } + .ant-btn-link { + position: absolute; + min-width: 280px; + min-height: 40px; + } + } +} + +.header { + padding-left: 36px; + overflow: hidden; + background-color: #fff; + height: 100%; + color: @title-color; + position: relative; +} + +.avatar { + box-shadow: 0px 2px 20px 0px rgba(0, 0, 0, 0.09); + border: none; + width: 30px; + height: 30px; + color: #bfbfbf; +} + +.domain { + font-size: 14px; +} + +.links { + margin-right: 20px; + display: inline-block; + + :global { + .ant-divider { + background-color: #d2d2d2; + margin-left: 24px; + margin-right: 24px; + } + } + + .link { + color: @title-color; + + &:hover { + color: @primary-color; + } + } + + .active { + color: @primary-color; + } +} + +.password-btn { + max-width: 100px; + + span { + max-width: 80px; + } +} + +.single-link { + color: @primary-color; + margin-right: 5px; +} + +.token { + pre { + padding: .4em .6em; + white-space: pre-wrap; + word-wrap: break-word; + background: hsla(0, 0%, 58.8%, .1); + border: 1px solid hsla(0, 0%, 39.2%, .2); + border-radius: 3px; + } +} \ No newline at end of file diff --git a/src/components/Layout/GlobalNav/index.jsx b/src/components/Layout/GlobalNav/index.jsx new file mode 100644 index 00000000..3fcc92b8 --- /dev/null +++ b/src/components/Layout/GlobalNav/index.jsx @@ -0,0 +1,81 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React from 'react'; +import PropTypes from 'prop-types'; +import classnames from 'classnames'; + +import { trimEnd } from 'lodash'; + +import NavItem from './item'; + +import styles from './index.less'; + +class GlobalNav extends React.Component { + static propTypes = { + className: PropTypes.string, + navs: PropTypes.array.isRequired, + // eslint-disable-next-line react/no-unused-prop-types + prefix: PropTypes.string, + // eslint-disable-next-line react/no-unused-prop-types + checkSelect: PropTypes.func, + onItemClick: PropTypes.func, + innerRef: PropTypes.object, + }; + + static defaultProps = { + className: '', + prefix: '', + checkSelect() {}, + onItemClick() {}, + }; + + get currentPath() { + const { + location: { pathname }, + match: { url }, + } = this.props; + + const { length } = trimEnd(url, '/'); + return pathname.slice(length + 1); + } + + render() { + const { className, navs, innerRef, onItemClick } = this.props; + const classNames = classnames(styles.wrapper, className); + + return ( +
+ {navs.map((nav) => ( +
+ {nav.title &&

{t(nav.title)}

} +
    + {nav.items.map((item) => ( + + ))} +
+
+ ))} +
+ ); + } +} + +export default GlobalNav; diff --git a/src/components/Layout/GlobalNav/index.less b/src/components/Layout/GlobalNav/index.less new file mode 100644 index 00000000..99f9f919 --- /dev/null +++ b/src/components/Layout/GlobalNav/index.less @@ -0,0 +1,102 @@ +@import '~styles/variables'; +@import '~styles/mixins'; + +.wrapper { + position: fixed; + top: 60px; + left: 8px; + width: $nav-width; + height: calc(100vh - 68px); + padding: 40px 20px; + border-radius: $border-radius; + background-color: $dark; + box-shadow: 4px 8px 16px 0 rgba(0, 0, 0, 0.1); + transition: left $trans-speed ease-in-out; + overflow-y: auto; + z-index: 212; + + .subNav > ul > li { + &.select { + box-shadow: 0 4px 8px 0 rgba(25, 30, 41, 0.2); + background-color: #d8dee5; + border: solid 1px #404e68; + } + + &:hover { + background-color: #d8dee5; + } + + &:active { + background-color: #d8dee5; + border: solid 1px #404e68; + } + + & > a { + color: $light; + transition: color $trans-speed ease-in-out; + + @media (max-width: 1366px) { + padding: 7px 12px; + } + + :global .qicon { + color: #b6c2cd; + fill: #b6c2cd; + } + } + } +} + +.subNav { + & > p { + color: $light-color02; + margin-bottom: 12px; + } + + & > ul { + margin-bottom: 20px; + + & > li { + border-radius: 18px; + border: solid 1px transparent; + transition: all $trans-speed ease-in-out; + + & > a, + .title { + display: block; + padding: 7px 12px; + color: #4a5974; + font-weight: 500; + cursor: pointer; + + @media (max-width: 1366px) { + padding: 7px 0; + } + + :global { + .icon { + margin-right: 8px; + vertical-align: text-bottom; + } + } + } + + &.select, + &:hover, + &:active { + & > a { + color: $primary; + + :global .qicon { + color: #1890ff; + fill:#6fb4f5; + } + } + } + + & + li { + margin-top: 4px; + } + } + } +} diff --git a/src/components/Layout/GlobalNav/item.jsx b/src/components/Layout/GlobalNav/item.jsx new file mode 100644 index 00000000..45128bb3 --- /dev/null +++ b/src/components/Layout/GlobalNav/item.jsx @@ -0,0 +1,57 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React from 'react'; +import PropTypes from 'prop-types'; +import classnames from 'classnames'; +import { Link } from 'react-router-dom'; +import { Icon } from 'antd'; + +import styles from './index.less'; + +export default class NavItem extends React.Component { + static propTypes = { + item: PropTypes.object, + current: PropTypes.string, + prefix: PropTypes.string, + onClick: PropTypes.func, + }; + + checkSelect = (item = {}) => { + const { current } = this.props; + + return current.startsWith(item.name); + }; + + renderIcon(icon) { + return ; + } + + render() { + const { item, prefix, onClick } = this.props; + + return ( +
  • + + {this.renderIcon(item.icon)} {t(item.title)} + +
  • + ); + } +} diff --git a/src/components/Layout/HeaderDropdown/index.jsx b/src/components/Layout/HeaderDropdown/index.jsx new file mode 100644 index 00000000..720909ba --- /dev/null +++ b/src/components/Layout/HeaderDropdown/index.jsx @@ -0,0 +1,28 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { Dropdown } from 'antd'; +import React from 'react'; +import classNames from 'classnames'; +// import styles from './index.less'; + +// const HeaderDropdown = ({ overlayClassName: cls, ...restProps }) => ( +// +// ); + +const HeaderDropdown = ({ overlayClassName: cls, ...restProps }) => ( + +); + +export default HeaderDropdown; diff --git a/src/components/Layout/HeaderDropdown/index.less b/src/components/Layout/HeaderDropdown/index.less new file mode 100644 index 00000000..cb10b589 --- /dev/null +++ b/src/components/Layout/HeaderDropdown/index.less @@ -0,0 +1,16 @@ +// @import '~antd/es/style/themes/default.less'; + +// .container > * { +// background-color: #fff; +// border-radius: @border-radius; +// box-shadow: @shadow-1-down; +// } + +// @media screen and (max-width: @screen-xs) { +// .container { +// width: 100% !important; +// } +// .container > * { +// border-radius: 0 !important; +// } +// } diff --git a/src/components/Layout/Nav/index.jsx b/src/components/Layout/Nav/index.jsx new file mode 100644 index 00000000..0c769588 --- /dev/null +++ b/src/components/Layout/Nav/index.jsx @@ -0,0 +1,81 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React from 'react'; +import PropTypes from 'prop-types'; + +import { trimEnd } from 'lodash'; + +import NavItem from './item'; + +import styles from './index.less'; + +class Nav extends React.Component { + static propTypes = { + className: PropTypes.string, + navs: PropTypes.array.isRequired, + // eslint-disable-next-line react/no-unused-prop-types + prefix: PropTypes.string, + // eslint-disable-next-line react/no-unused-prop-types + checkSelect: PropTypes.func, + onItemClick: PropTypes.func, + innerRef: PropTypes.object, + }; + + static defaultProps = { + className: '', + prefix: '', + checkSelect() {}, + onItemClick() {}, + }; + + get currentPath() { + const { + location: { pathname }, + match: { url }, + } = this.props; + + const { length } = trimEnd(url, '/'); + return pathname.slice(length + 1); + } + + render() { + const { className, navs, match, innerRef, onItemClick } = this.props; + + const prefix = trimEnd(match.url, '/'); + + return ( +
    + {navs.map((nav) => ( +
    + {nav.title &&

    {t(nav.title)}

    } +
      + {nav.items.map((item) => ( + + ))} +
    +
    + ))} +
    + ); + } +} + +export default Nav; diff --git a/src/components/Layout/Nav/index.less b/src/components/Layout/Nav/index.less new file mode 100644 index 00000000..8a651a80 --- /dev/null +++ b/src/components/Layout/Nav/index.less @@ -0,0 +1,134 @@ +@import '~styles/variables'; + +.subNav { + & > p { + color: #79879c; + margin-bottom: 12px; + } + + & > ul { + margin-bottom: 20px; + + & > li { + border-radius: 18px; + border: solid 1px transparent; + transition: all $trans-speed ease-in-out; + + & > a, + .title { + display: block; + padding: 7px 12px; + color: #4a5974; + font-weight: 500; + cursor: pointer; + + @media (max-width: 1366px) { + padding: 7px 0; + } + + :global { + .icon { + margin-right: 8px; + vertical-align: text-bottom; + } + + .qicon-chevron-down { + margin-top: 4px; + transition: all $trans-speed ease-in-out; + } + } + + .devopsIcon { + width: 16px; + height: 16px; + padding: 2px; + margin-right: 8px; + vertical-align: text-bottom; + } + } + + &.select, + &.childSelect, + &:hover, + &:active { + & > a { + color: $primary; + + :global .qicon { + color: $icon-color; + fill: #6fb4f5; + } + + .devopsIcon { + color: $icon-color; + fill: #6fb4f5; + } + } + + .title { + :global .qicon-chevron-down { + transform: rotate(-180deg); + } + } + + .innerNav > li { + height: 20px; + margin-top: 8px; + opacity: 1; + transition: height $trans-speed ease-in-out, + margin-top $trans-speed ease-in-out, + opacity $trans-speed ease-in-out 0.1s; + } + } + + & + li { + margin-top: 4px; + } + } + } +} + +.innerNav { + margin-bottom: 4px; + padding-left: 38px; + + @media (max-width: 1366px) { + padding-left: 26px; + } + + & > li { + height: 0; + opacity: 0; + overflow: auto; + transition: height $trans-speed ease-in-out 0.1s, + margin-top $trans-speed ease-in-out 0.1s, opacity $trans-speed ease-in-out; + + & > a { + color: #4a5974; + } + + &.select, + &:hover, + &:active { + & > a { + color: $primary; + } + } + } +} + +.back { + margin: 20px 0; + padding: 8px 12px; + & > a > svg { + width: 16px; + height: 16px; + margin-right: 8px; + vertical-align: text-top; + } +} + +.rightIcon { + float: right; + margin-right: 0 !important; +} diff --git a/src/components/Layout/Nav/item.jsx b/src/components/Layout/Nav/item.jsx new file mode 100644 index 00000000..49b172ac --- /dev/null +++ b/src/components/Layout/Nav/item.jsx @@ -0,0 +1,88 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React from 'react'; +import PropTypes from 'prop-types'; +import classnames from 'classnames'; +import { Link } from 'react-router-dom'; +import { Icon } from 'antd'; + +import styles from './index.less'; + +export default class NavItem extends React.Component { + static propTypes = { + item: PropTypes.object, + current: PropTypes.string, + prefix: PropTypes.string, + onClick: PropTypes.func, + }; + + checkSelect = (item = {}) => { + const { current } = this.props; + + if (item.children) { + return item.children.some((child) => this.checkSelect(child)); + } + + if (item.tabs) { + return item.tabs.some((tab) => this.checkSelect(tab)); + } + + return current.startsWith(item.name); + }; + + render() { + const { item, prefix, onClick } = this.props; + + if (item.children) { + return ( +
  • +
    + {t(item.title)} + +
    +
      + {item.children.map((child) => ( +
    • + {t(child.title)} +
    • + ))} +
    +
  • + ); + } + + return ( +
  • + + {t(item.title)} + +
  • + ); + } +} diff --git a/src/components/Layout/Selector/index.jsx b/src/components/Layout/Selector/index.jsx new file mode 100644 index 00000000..564cd20f --- /dev/null +++ b/src/components/Layout/Selector/index.jsx @@ -0,0 +1,150 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React from 'react'; +import PropTypes from 'prop-types'; +import classNames from 'classnames'; + +import { Icon, Dropdown, Spin, Menu } from 'antd'; + +import styles from './index.less'; + +export default class Selector extends React.Component { + static propTypes = { + icon: PropTypes.string, + defaultIcon: PropTypes.string, + value: PropTypes.string, + type: PropTypes.string, + loading: PropTypes.bool, + options: PropTypes.array, + onSelect: PropTypes.func, + onScrollBottom: PropTypes.func, + }; + + static defaultProps = { + icon: '', + defaultIcon: '', + value: '', + type: '', + loading: false, + options: [], + onSelect() {}, + onScrollBottom() {}, + }; + + constructor(props) { + super(props); + + this.contentRef = React.createRef(); + } + + componentDidMount() { + if (this.contentRef.current) { + this.$dropdownContent = + this.contentRef.current.querySelector('.dropdown-content'); + this.$dropdownContent.addEventListener('scroll', this.handleScroll); + } + } + + componentDidUpdate() { + if (this.contentRef.current) { + const $menu = this.contentRef.current.querySelector( + '.dropdown-content > .menu-wrapper' + ); + + if ($menu && this.$dropdownContent) { + this.threshold = + $menu.offsetHeight - this.$dropdownContent.offsetHeight; + } + } + } + + componentWillUnmount() { + if (this.$dropdownContent) { + this.$dropdownContent.removeEventListener('scroll', this.handleScroll); + } + } + + get isMulti() { + return this.props.options.length > 1; + } + + handleScroll = (e) => { + if (this.threshold && e.target.scrollTop >= this.threshold - 2) { + this.props.onScrollBottom(); + } + }; + + handleMenuClick = (e, key) => { + this.props.onSelect(key); + }; + + renderList() { + const { defaultIcon, options, loading } = this.props; + + if (!this.isMulti) { + return null; + } + + return ( +
    + + {options.map((option) => ( + + + {option.label} + + ))} + +
    + {loading && } +
    +
    + ); + } + + render() { + const { icon, defaultIcon, value, type, options } = this.props; + + const option = options.find((item) => item.value === value) || {}; + + return ( +
    + +
    +
    + +
    +
    +

    {type}

    +
    {option.label || value}
    +
    + {this.isMulti && ( +
    + +
    + )} +
    +
    +
    + ); + } +} diff --git a/src/components/Layout/Selector/index.less b/src/components/Layout/Selector/index.less new file mode 100644 index 00000000..ae1413aa --- /dev/null +++ b/src/components/Layout/Selector/index.less @@ -0,0 +1,98 @@ +@import '~styles/variables'; +@import '~styles/mixins'; + +.titleWrapper { + position: relative; + margin-bottom: 20px; + padding: 12px; + border-radius: $border-radius; + background-color: $background-color; + box-shadow: 0 8px 16px 0 rgba(36, 46, 66, 0.2); + + .icon { + display: inline-block; + vertical-align: middle; + width: 40px; + height: 40px; + padding: 8px; + margin-right: 12px; + border-radius: 100px 0 100px 100px; + background-color: rgba(239, 244, 249, 0.08); + + img { + width: 24px; + height: 24px; + } + } + + .text { + display: inline-block; + vertical-align: middle; + width: 124px; + + :global .h6 { + font-family: $font-family-id; + line-height: 1.43; + color: #ffffff; + @include ellipsis; + } + + p { + color: #d8dee5; + } + } + + .arrow { + position: absolute; + bottom: 12px; + right: 12px; + width: 20px; + height: 20px; + padding: 3px; + border-radius: 50%; + background-color: rgba(85, 188, 138, 0.1); + + :global .icon { + width: 14px; + height: 14px; + background-color: $primary; + border-radius: 50%; + vertical-align: inherit; + } + } +} + +.multi { + cursor: pointer; +} + +.dropdown { + background-color: $background-color; + + :global { + .dropdown-content { + max-height: 300px; + overflow-y: auto; + overflow-x: hidden; + } + + .menu { + padding: 12px; + } + + .menu-item { + padding: 6px 20px 6px 14px; + + img { + width: 16px; + height: 16px; + margin-right: 10px; + } + } + } +} + +.bottom { + position: relative; + text-align: center; +} diff --git a/src/components/Layout/index.js b/src/components/Layout/index.js new file mode 100644 index 00000000..987dbd1b --- /dev/null +++ b/src/components/Layout/index.js @@ -0,0 +1,17 @@ +// Copyright 2021 99cloud +// +// 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. + +export { default as Nav } from './Nav'; +export { default as GlobalNav } from './GlobalNav'; +export { default as Selector } from './Selector'; diff --git a/src/components/Loading/index.jsx b/src/components/Loading/index.jsx new file mode 100644 index 00000000..c126d457 --- /dev/null +++ b/src/components/Loading/index.jsx @@ -0,0 +1,47 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React from 'react'; +import { Icon, Modal } from 'antd'; + +const Loading = ({ pastDelay, timedOut, error }) => { + if (pastDelay) { + return ( + + +

    Loading...

    +
    + ); + } + if (timedOut) { + return
    Taking a long time...
    ; + } + if (error) { + return
    Error!
    ; + } + return null; +}; + +export default Loading; diff --git a/src/components/MagicInput/index.jsx b/src/components/MagicInput/index.jsx new file mode 100644 index 00000000..16d2823a --- /dev/null +++ b/src/components/MagicInput/index.jsx @@ -0,0 +1,574 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React, { PureComponent } from 'react'; +import PropTypes from 'prop-types'; +import { Input, Tag, Menu, Divider, Button, Checkbox } from 'antd'; +import { CloseOutlined, SearchOutlined } from '@ant-design/icons'; +import classnames from 'classnames'; +import { isEmpty } from 'lodash'; +import styles from './index.less'; + +const option = PropTypes.shape({ + label: PropTypes.string.isRequired, + key: PropTypes.oneOfType([ + PropTypes.string.isRequired, + PropTypes.bool.isRequired, + ]), + component: PropTypes.node, +}); + +const filterParam = PropTypes.shape({ + label: PropTypes.string.isRequired, + name: PropTypes.string.isRequired, + isSingle: PropTypes.bool, + isServer: PropTypes.bool, + allowed: PropTypes.func, + options: PropTypes.arrayOf(option), + isTime: PropTypes.bool, +}); + +// eslint-disable-next-line no-unused-vars +const getTags = (props) => { + // eslint-disable-next-line no-shadow + const { initValue, filterParams } = props; + if (!initValue) { + return []; + } + if (isEmpty(filterParams)) { + return []; + } + const tags = []; + Object.keys(initValue).forEach((key) => { + const item = filterParams.find((it) => it.name === key); + if (item) { + const value = initValue[key]; + tags.push({ + value, + filter: item, + }); + } + }); + return tags; +}; + +class MagicInput extends PureComponent { + static propTypes = { + filterParams: PropTypes.arrayOf(filterParam), + // eslint-disable-next-line react/no-unused-prop-types + initValue: PropTypes.object, + placeholder: PropTypes.string, + onInputChange: PropTypes.func, + onInputFocus: PropTypes.func, + }; + + static defaultProps = { + filterParams: [], + initValue: {}, + placeholder: t('Click here for filters.'), + }; + + constructor(props) { + super(props); + + this.inputRef = React.createRef(); + + this.state = { + tags: [], + currentFilter: null, + isFocus: false, + optionClear: false, + checkValues: [], + }; + } + + componentDidMount() { + this.initTags(this.props); + } + + getFilterParams = () => { + // eslint-disable-next-line no-shadow + const { filterParams } = this.props; + const { tags } = this.state; + const filters = []; + filterParams.forEach((item) => { + const alreadyTag = tags.find((it) => it.filter.name === item.name); + if (!alreadyTag) { + filters.push(item); + } + }); + return filters; + }; + + onTagsChange = () => { + const { onInputChange } = this.props; + const { tags } = this.state; + onInputChange && onInputChange(tags); + }; + + onFocusChange = (value) => { + const { onInputFocus } = this.props; + onInputFocus && onInputFocus(value); + }; + + getDefaultFilter = () => { + const { filterParams } = this.props; + return filterParams.find((it) => !it.options); + }; + + handleEnter = (e) => { + e && e.preventDefault(); + e && e.stopPropagation(); + const { value } = e.currentTarget; + if (!value) { + return; + } + this.updateInput(value); + }; + + handleBlur = () => { + const { currentFilter } = this.state; + if (currentFilter) { + this.setState({ + isFocus: true, + }); + this.onFocusChange(true); + } else { + this.onFocusChange(false); + } + }; + + handleKeyUp = (e) => { + if (e.keyCode === 8 || e.keyCode === 46) { + const { currentFilter, tags } = this.state; + const { value } = this.inputRef.current.state; + if (currentFilter && isEmpty(value)) { + this.setState({ + currentFilter: null, + }); + } else if (tags.length > 0 && isEmpty(value)) { + this.handleTagClose(tags[tags.length - 1].filter.name); + } + } + }; + + handleFocus = () => { + this.setState({ + isFocus: true, + }); + this.onFocusChange(true); + }; + + handleInputChange = (e) => { + this.setState({ + inputValue: e.target.value, + }); + }; + + handleTagClose = (name) => { + const { tags, checkValues } = this.state; + const newTags = tags.filter((it) => it.filter.name !== name); + const leftCheckValues = checkValues.filter( + (it) => it.split('--')[0] !== name + ); + this.setState( + { + tags: newTags, + optionClear: false, + checkValues: leftCheckValues, + }, + () => { + this.onTagsChange(); + } + ); + }; + + handleOptionClick = ({ key }) => { + let value; + if (key === 'true') { + value = true; + } else { + value = key === 'false' ? false : key; + } + this.updateInput(value); + }; + + handleSelectFilter = ({ key }) => { + // eslint-disable-next-line no-shadow + const { filterParams } = this.props; + const filter = filterParams.find((it) => it.name === key); + this.setState( + { + currentFilter: filter, + isFocus: true, + }, + () => { + this.inputRef.current.focus(); + this.onFocusChange(true); + } + ); + }; + + initTags(props) { + // eslint-disable-next-line no-shadow + const { initValue, filterParams } = props; + if (!initValue) { + return; + } + if (isEmpty(filterParams)) { + return; + } + const tags = []; + const checkValues = []; + Object.keys(initValue).forEach((key) => { + const item = filterParams.find((it) => it.name === key); + if (item) { + const { options = [] } = item; + const value = initValue[key]; + if (options.length) { + const optionItem = options.find((op) => op.key === value); + if (optionItem && optionItem.isQuick) { + checkValues.push(`${item.name}--${value}`); + } + } + tags.push({ + value, + filter: item, + }); + } + }); + this.setState({ + tags, + checkValues, + }); + } + + renderKey() { + const { currentFilter } = this.state; + if (!currentFilter) { + return null; + } + return ( + + {`${currentFilter.label}`} + + + ); + } + + renderTags() { + const { tags } = this.state; + const tagItems = tags.map((it) => { + const { filter, value } = it; + const { options } = filter; + let label = value; + if (options) { + const current = options.find((item) => item.key === value); + label = current ? current.label : value; + } + return ( + this.handleTagClose(filter.name)} + > + {filter.label} + + {label} + + ); + }); + return
    {tagItems}
    ; + } + + renderOptions() { + const { currentFilter, tags } = this.state; + const { options, correlateOption } = currentFilter; + if (!options) { + return null; + } + + const correlateTag = tags.filter( + (it) => it.filter.name === correlateOption + ); + let suboptions = []; + if (correlateOption && correlateTag[0]) { + suboptions = options.filter( + (it) => it.correlateValue.indexOf(correlateTag[0].value) > -1 + ); + } + const menuItems = (suboptions[0] ? suboptions : options).map((it) => ( + {it.label} + )); + return ( + + {menuItems} + + ); + } + + renderMenu() { + const { currentFilter, isFocus, optionClear, inputValue } = this.state; + if (inputValue) { + return null; + } + if (!isFocus) { + return null; + } + if (currentFilter) { + return this.renderOptions(); + } + let filters = this.getFilterParams(); + if (optionClear) { + filters = []; + } + + const menuItems = filters.map((it) => ( + {it.label} + )); + return ( + + {this.renderOptionsClose(filters)} + {menuItems} + + ); + } + + // eslint-disable-next-line react/sort-comp + clearOptions = () => { + this.setState({ + optionClear: true, + }); + }; + + renderOptionsClose = (filters) => { + const { filterParams } = this.props; + const { optionClear } = this.state; + if (optionClear || !filters[0] || filterParams.length === filters.length) { + return null; + } + return ( + + {this.renderModal()} + + ); + } +} diff --git a/src/components/NotFound/index.jsx b/src/components/NotFound/index.jsx new file mode 100644 index 00000000..50a0f69a --- /dev/null +++ b/src/components/NotFound/index.jsx @@ -0,0 +1,70 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React from 'react'; +import styles from './index.less'; + +export default class NotFound extends React.Component { + constructor(props) { + super(props); + this.state = { + time: 10, + }; + } + + componentDidMount() { + this.interval = setInterval(() => { + this.setState(({ time }) => ({ + time: Math.max(time - 1, 0), + })); + }, 1100); + } + + UNSAFE_componentWillUpdate(nextProps, nextState) { + if (nextState.time === 0) { + if (this.interval) { + clearInterval(this.interval); + } + + window.location.href = '/'; + } + } + + componentWillUnmount() { + if (this.interval) { + clearInterval(this.interval); + } + } + + render() { + return ( +
    + +
    +
    Not Found
    +

    + {t.html('NOT_FOUND_DESC', { + time: this.state.time, + link: '/', + })} +

    +
    +
    + ); + } +} diff --git a/src/components/NotFound/index.less b/src/components/NotFound/index.less new file mode 100644 index 00000000..ec79e424 --- /dev/null +++ b/src/components/NotFound/index.less @@ -0,0 +1,39 @@ +@import '~styles/variables'; + +.wrapper { + margin-top: 132px; + text-align: center; +} + +.image { + height: 200px; + user-select: none; +} + +.text { + display: inline-block; + vertical-align: top; + width: 600px; + margin-left: 60px; + + :global .h1 { + opacity: 0.4; + font-size: 120px; + line-height: 168px; + color: #abb4be; + user-select: none; + } + + p { + text-shadow: 0 4px 8px rgba(36, 46, 66, 0.1); + font-size: 20px; + font-weight: @font-bold; + line-height: 1.4; + color: @text-color; + text-align: left; + } + + a { + color: #329dce; + } +} diff --git a/src/components/Notify/index.jsx b/src/components/Notify/index.jsx new file mode 100644 index 00000000..ed433a61 --- /dev/null +++ b/src/components/Notify/index.jsx @@ -0,0 +1,160 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React from 'react'; +import { notification } from 'antd'; +import PropTypes from 'prop-types'; +import { + InfoCircleOutlined, + CheckCircleOutlined, + CloseCircleOutlined, + LoadingOutlined, +} from '@ant-design/icons'; +import CodeEditor from 'components/CodeEditor'; +import ModalButton from 'components/ModalButton'; +import globalRootStore from 'stores/root'; +import { unescapeHtml } from 'utils/index'; +import styles from './index.less'; + +const open = (args) => { + const { + title = t('Error'), + type = 'error', + description = '', + onClose, + top = 48, + } = args; + + let iconColor = '#F5222D'; + let icon = null; + + if (type === 'info') { + iconColor = '#0068FF'; + icon = ; + } else if (type === 'success') { + iconColor = '#57E39B'; + icon = ; + } else if (type === 'error') { + iconColor = '#EB354D'; + icon = ; + } else if (type === 'process') { + iconColor = '#0068FF'; + icon = ; + } else if (type === 'warn') { + iconColor = '#FEDF40'; + icon = ; + } + + const duration = type === 'error' || type === 'warn' ? 0 : 4.5; + + notification.open({ + message: unescapeHtml(title), + duration, + icon, + description: unescapeHtml(description), + className: styles.notify, + onClose, + top, + style: { + whiteSpace: 'pre-line', + }, + }); +}; + +open.propTypes = { + title: PropTypes.string, + type: PropTypes.string, + description: PropTypes.string, +}; + +const success = (title, description) => { + open({ + title, + description, + type: 'success', + }); +}; + +const info = (title, description) => { + open({ + title, + description, + type: 'info', + }); +}; + +const error = (title, description) => { + globalRootStore.addNoticeCount(); + open({ + title, + description, + type: 'error', + onClose: () => { + globalRootStore.removeNoticeCount(); + }, + }); +}; + +const warn = (title, description) => { + open({ + title, + description, + type: 'warn', + }); +}; + +const process = (title, description) => { + open({ + title, + description, + type: 'process', + }); +}; + +const errorWithDetail = (title, err) => { + const description = err ? ( + + } + /> + ) : ( + '' + ); + error(title, description); +}; + +const Notify = { + open, + success, + error, + warn, + info, + process, + errorWithDetail, +}; + +export default Notify; diff --git a/src/components/Notify/index.less b/src/components/Notify/index.less new file mode 100644 index 00000000..7f177d73 --- /dev/null +++ b/src/components/Notify/index.less @@ -0,0 +1,21 @@ +.notify { + :global { + .ant-notification-notice-icon { + font-size: 18px; + } + + .ant-notification-notice-message { + font-size: 12px; + word-break: break-all; + } + + .ant-notification-notice-with-icon .ant-notification-notice-message { + margin-left: 32px; + } + } +} + +.codeEditor { + height: 400px !important; + min-height: 400px !important; +} \ No newline at end of file diff --git a/src/components/PageLoading/index.jsx b/src/components/PageLoading/index.jsx new file mode 100644 index 00000000..2d6412e6 --- /dev/null +++ b/src/components/PageLoading/index.jsx @@ -0,0 +1,33 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React from 'react'; +import { Spin } from 'antd'; + +const PageLoading = (props) => { + const { className } = props; + return ( +
    + +
    + ); +}; + +export default PageLoading; diff --git a/src/components/Pagination/index.jsx b/src/components/Pagination/index.jsx new file mode 100644 index 00000000..204b2f8e --- /dev/null +++ b/src/components/Pagination/index.jsx @@ -0,0 +1,228 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { LeftOutlined, RightOutlined } from '@ant-design/icons'; +import { Button, Select } from 'antd'; +import classnames from 'classnames'; +import styles from './index.less'; + +export default class index extends Component { + static propTypes() { + return { + total: PropTypes.number, + currentDataSize: PropTypes.number.isRequired, + current: PropTypes.number.isRequired, + pageSize: PropTypes.number.isRequired, + defaultCurrent: PropTypes.number, + defaultPageSize: PropTypes.number, + pageSizeOptions: PropTypes.array, + onChange: PropTypes.func, + isLoading: PropTypes.bool, + className: PropTypes.object, + }; + } + + static defaultProps = { + isLoading: false, + total: undefined, + defaultCurrent: 1, + defaultPageSize: 10, + pageSizeOptions: [10, 20, 50, 100], + onChange: (page, pageSize) => { + // eslint-disable-next-line no-console + console.log(page, pageSize); + }, + }; + + constructor(props) { + super(props); + const { + current, + pageSize, + defaultCurrent, + defaultPageSize, + currentDataSize, + isLoading, + total, + } = props; + this.state = { + current: current || defaultCurrent, + pageSize: pageSize || defaultPageSize, + currentDataSize, + isLoading, + total, + }; + } + + static getDerivedStateFromProps(nextProps, prevState) { + if ( + nextProps.currentDataSize !== prevState.currentDataSize || + (nextProps.current && nextProps.current !== prevState.current) || + nextProps.isLoading !== prevState.isLoading || + nextProps.total !== prevState.total + ) { + const { currentDataSize, current = 1, isLoading, total } = nextProps; + return { + currentDataSize, + current, + isLoading, + total, + }; + } + return null; + } + + onChange = (current, pageSize) => { + const { onChange } = this.props; + onChange && onChange(current, pageSize); + }; + + onChangePageSize = (pageSize) => { + this.setState( + { + pageSize, + }, + () => { + this.onChange(1, pageSize); + } + ); + }; + + onClickPre = () => { + const { current, pageSize } = this.state; + if (current === 1) { + return; + } + this.setState( + { + current: current - 1, + }, + () => { + this.onChange(current - 1, pageSize); + } + ); + }; + + onClickNext = () => { + const { current, pageSize, currentDataSize } = this.state; + if (currentDataSize < pageSize) { + return; + } + this.setState({ + current: current + 1, + }); + this.onChange(current + 1, pageSize); + }; + + onFocusChange = (value) => { + const { onFocusChange } = this.props; + onFocusChange && onFocusChange(value); + }; + + onFocus = () => { + this.onFocusChange(true); + }; + + onBlur = () => { + this.onFocusChange(false); + }; + + checkNextByTotal() { + const { pageSize, total, current } = this.state; + if (total === undefined) { + return true; + } + if (!total) { + return false; + } + return current < Math.ceil(total / pageSize); + } + + renderTotal() { + const { hideTotal } = this.props; + if (hideTotal) { + return null; + } + const { current, currentDataSize, pageSize, isLoading, total } = this.state; + if (total !== undefined) { + return {t('Total {total} items', { total })}; + } + if (isLoading) { + return null; + } + if (currentDataSize < pageSize) { + const totalCompute = (current - 1) * pageSize + currentDataSize; + return {t('Total {total} items', { total: totalCompute })}; + } + return null; + } + + renderPageSelect() { + const { pageSizeOptions, defaultPageSize } = this.props; + const { pageSize } = this.state; + const options = pageSizeOptions.map((it) => ({ + label: t('{pageSize} items/page', { pageSize: it }), + value: it, + })); + return ( + +
    + ); + } + + renderActions() { + const { + primaryActions, + containerProps, + onClickAction, + onFinishAction, + onCancelAction, + primaryActionsExtra, + } = this.props; + if (primaryActions) { + return ( + + ); + } + return null; + } + + renderCustomButton() { + const { hideCustom } = this.props; + if (hideCustom) { + return null; + } + return ( + +