Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding support for adoption scenario 1 #818

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,16 @@ CLEANUP_DIR_CMD ?= rm -Rf
# be also cloned from OPENSTACK_REPO/OPENSTACK_BRANCH.
CHECKOUT_FROM_OPENSTACK_REF ?= false

NETWORK_INTERNALAPI_ADDRESS_PREFIX ?= 172.17.0
NETWORK_STORAGE_ADDRESS_PREFIX ?= 172.18.0
NETWORK_TENANT_ADDRESS_PREFIX ?= 172.19.0
NETWORK_STORAGEMGMT_ADDRESS_PREFIX ?= 172.20.0
NETWORK_DESIGNATE_ADDRESS_PREFIX ?= 172.28.0
INTERNALAPI_HOST_ROUTES ?=
STORAGE_HOST_ROUTES ?=
TENANT_HOST_ROUTES ?=
STORAGEMGMT_HOST_ROUTES ?=

# network isolation
NETWORK_ISOLATION ?= true
NETWORK_ISOLATION_USE_DEFAULT_NETWORK ?= true
Expand Down Expand Up @@ -2230,6 +2240,15 @@ nncp_with_retries: ## Deploy NNCP with retries
.PHONY: nncp
nncp: export INTERFACE=${NNCP_INTERFACE}
nncp: export BRIDGE_NAME=${NNCP_BRIDGE}
nncp: export INTERNALAPI_PREFIX=${NETWORK_INTERNALAPI_ADDRESS_PREFIX}
nncp: export NNCP_INTERNALAPI_HOST_ROUTES=${INTERNALAPI_HOST_ROUTES}
nncp: export STORAGE_PREFIX=${NETWORK_STORAGE_ADDRESS_PREFIX}
nncp: export NNCP_STORAGE_HOST_ROUTES=${STORAGE_HOST_ROUTES}
nncp: export STORAGEMGMT_PREFIX=${NETWORK_STORAGEMGMT_ADDRESS_PREFIX}
nncp: export NNCP_STORAGEMGMT_HOST_ROUTES=${STORAGEMGMT_HOST_ROUTES}
nncp: export TENANT_PREFIX=${NETWORK_TENANT_ADDRESS_PREFIX}
nncp: export NNCP_TENANT_HOST_ROUTES=${TENANT_HOST_ROUTES}
nncp: export DESIGNATE_PREFIX=${NETWORK_DESIGNATE_ADDRESS_PREFIX}
ifeq ($(NETWORK_BGP), true)
nncp: export BGP=enabled
nncp: export INTERFACE_BGP_1=${NNCP_BGP_1_INTERFACE}
Expand Down Expand Up @@ -2295,6 +2314,11 @@ netattach: export IPV6_ENABLED=true
netattach: export CTLPLANE_IPV6_ADDRESS_PREFIX=${NNCP_CTLPLANE_IPV6_ADDRESS_PREFIX}
netattach: export CTLPLANE_IPV6_ADDRESS_SUFFIX=${NNCP_CTLPLANE_IPV6_ADDRESS_SUFFIX}
endif
netattach: export INTERNALAPI_PREFIX=${NETWORK_INTERNALAPI_ADDRESS_PREFIX}
netattach: export STORAGE_PREFIX=${NETWORK_STORAGE_ADDRESS_PREFIX}
netattach: export STORAGEMGMT_PREFIX=${NETWORK_STORAGEMGMT_ADDRESS_PREFIX}
netattach: export TENANT_PREFIX=${NETWORK_TENANT_ADDRESS_PREFIX}
netattach: export DESIGNATE_PREFIX=${NETWORK_DESIGNATE_ADDRESS_PREFIX}
netattach: export VLAN_START=${NETWORK_VLAN_START}
netattach: export VLAN_STEP=${NETWORK_VLAN_STEP}
netattach: export CTLPLANE_IP_ADDRESS_PREFIX=${NNCP_CTLPLANE_IP_ADDRESS_PREFIX}
Expand Down Expand Up @@ -2344,6 +2368,11 @@ endif
metallb_config: export NAMESPACE=metallb-system
metallb_config: export CTLPLANE_METALLB_POOL=${METALLB_POOL}
metallb_config: export CTLPLANE_METALLB_IPV6_POOL=${METALLB_IPV6_POOL}
metallb_config: export INTERNALAPI_PREFIX=${NETWORK_INTERNALAPI_ADDRESS_PREFIX}
metallb_config: export STORAGE_PREFIX=${NETWORK_STORAGE_ADDRESS_PREFIX}
metallb_config: export STORAGEMGMT_PREFIX=${NETWORK_STORAGEMGMT_ADDRESS_PREFIX}
metallb_config: export TENANT_PREFIX=${NETWORK_TENANT_ADDRESS_PREFIX}
metallb_config: export DESIGNATE_PREFIX=${NETWORK_DESIGNATE_ADDRESS_PREFIX}
ifeq ($(NETWORK_ISOLATION_IPV4), true)
metallb_config: export IPV4_ENABLED=true
endif
Expand Down
31 changes: 31 additions & 0 deletions devsetup/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,17 @@ CRC_HTTPS_PROXY ?=
OCP_NETWORK_NAME ?=crc
NETWORK_ISOLATION_USE_DEFAULT_NETWORK ?= true

ADOPTED_INTERNALAPI_NETWORK ?= 172.17.1.0/24
ADOPTED_STORAGE_NETWORK ?= 172.18.1.0/24
ADOPTED_EXTERNAL_NETWORK ?= 172.21.1.0/24
ADOPTED_STORAGEMGMT_NETWORK ?= 172.20.1.0/24
ADOPTED_TENANT_NETWORK ?= 172.9.1.0/24
STANDALONE_INTERNALAPI_NET_PREFIX ?= 172.17.0
STANDALONE_STORAGE_NET_PREFIX ?= 172.18.0
STANDALONE_EXTERNAL_NET_PREFFIX ?= 172.21.0
STANDALONE_STORAGEMGMT_NET_PREFIX ?= 172.20.0
STANDALONE_TENANT_NET_PREFIX ?= 172.19.0

NETWORK_ISOLATION_MAC ?= 52:54:00:11:11:10
ifeq ($(NETWORK_ISOLATION_USE_DEFAULT_NETWORK), true)
NETWORK_ISOLATION_NET_NAME ?= default
Expand Down Expand Up @@ -463,6 +474,16 @@ tripleo_deploy: export REGISTRY_PWD ?= ${RH_REGISTRY_PWD}
tripleo_deploy: export COMPUTE_CEPH_ENABLED=${EDPM_COMPUTE_CEPH_ENABLED}
tripleo_deploy: export COMPUTE_CEPH_NOVA=${EDPM_COMPUTE_CEPH_NOVA}
tripleo_deploy: export TRIPLEO_NETWORKING=${EDPM_CONFIGURE_NETWORKING}
tripleo_deploy: export NETWORK_INTERNAL_PREFIX = ${STANDALONE_INTERNALAPI_NET_PREFIX}
tripleo_deploy: export NETWORK_STORAGE_PREFIX = ${STANDALONE_STORAGE_NET_PREFIX}
tripleo_deploy: export NETWORK_STORAGE_MGMT_PREFIX = ${STANDALONE_STORAGEMGMT_NET_PREFIX}
tripleo_deploy: export NETWORK_TENANT_PREFIX = ${STANDALONE_TENANT_NET_PREFIX}
tripleo_deploy: export NETWORK_EXTERNAL_PREFFIX = ${STANDALONE_EXTERNAL_NET_PREFFIX}
tripleo_deploy: export ADOPTED_INTERNAL_NET = ${ADOPTED_INTERNALAPI_NETWORK}
tripleo_deploy: export ADOPTED_STORAGE_NET = ${ADOPTED_STORAGE_NETWORK}
tripleo_deploy: export ADOPTED_STORAGE_MGMT_NET = ${ADOPTED_STORAGEMGMT_NETWORK}
tripleo_deploy: export ADOPTED_TENANT_NET = ${ADOPTED_TENANT_NETWORK}
tripleo_deploy: export ADOPTED_EXTERNAL_NET = ${ADOPTED_EXTERNAL_NETWORK}
tripleo_deploy:
$(eval $(call vars))
scripts/tripleo.sh
Expand All @@ -480,6 +501,16 @@ standalone_deploy: export COMPUTE_DHCP_AGENT_ENABLED=${EDPM_COMPUTE_DHCP_AGENT_E
standalone_deploy: export STANDALONE=true
standalone_deploy: export INTERFACE_MTU=${NETWORK_MTU}
standalone_deploy: export EDPM_COMPUTE_NETWORK = ${NETWORK_ISOLATION_NET_NAME}
standalone_deploy: export NETWORK_INTERNAL_PREFIX = ${STANDALONE_INTERNALAPI_NET_PREFIX}
standalone_deploy: export NETWORK_STORAGE_PREFIX = ${STANDALONE_STORAGE_NET_PREFIX}
standalone_deploy: export NETWORK_STORAGE_MGMT_PREFIX = ${STANDALONE_STORAGEMGMT_NET_PREFIX}
standalone_deploy: export NETWORK_TENANT_PREFIX = ${STANDALONE_TENANT_NET_PREFIX}
standalone_deploy: export NETWORK_EXTERNAL_PREFFIX = ${STANDALONE_EXTERNAL_NET_PREFFIX}
standalone_deploy: export ADOPTED_INTERNAL_NET = ${ADOPTED_INTERNALAPI_NETWORK}
standalone_deploy: export ADOPTED_STORAGE_NET = ${ADOPTED_STORAGE_NETWORK}
standalone_deploy: export ADOPTED_STORAGE_MGMT_NET = ${ADOPTED_STORAGEMGMT_NETWORK}
standalone_deploy: export ADOPTED_TENANT_NET = ${ADOPTED_TENANT_NETWORK}
standalone_deploy: export ADOPTED_EXTERNAL_NET = ${ADOPTED_EXTERNAL_NETWORK}
standalone_deploy:
$(eval $(call vars))
scripts/standalone.sh ${EDPM_COMPUTE_SUFFIX} ${STANDALONE_COMPUTE_DRIVER} '${EDPM_COMPUTE_ADDITIONAL_NETWORKS}' '${EDPM_COMPUTE_ADDITIONAL_HOST_ROUTES}'
Expand Down
9 changes: 9 additions & 0 deletions devsetup/scripts/standalone.sh
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,15 @@ dns_server: ${PRIMARY_RESOLV_CONF_ENTRY}
compute_driver: ${COMPUTE_DRIVER}
sriov_agent: ${EDPM_COMPUTE_SRIOV_ENABLED}
dhcp_agent: ${EDPM_COMPUTE_DHCP_AGENT_ENABLED}
# Adoption related stuff
adopted_internal_net: ${ADOPTED_INTERNAL_NET}
adopted_storage_net: ${ADOPTED_STORAGE_NET}
adopted_storage_mgmt_net: ${ADOPTED_STORAGE_MGMT_NET}
adopted_tenant_net: ${ADOPTED_TENANT_NET}
standalone_internal_prefix: ${NETWORK_INTERNAL_PREFIX}
standalone_storage_prefix: ${NETWORK_STORAGE_PREFIX}
standalone_storage_mgmt_prefix: ${NETWORK_STORAGE_MGMT_PREFIX}
standalone_tenant_prefix: ${NETWORK_TENANT_PREFIX}
EOF

jinja2_render standalone/network_data.j2 "${J2_VARS_FILE}" > ${MY_TMP_DIR}/network_data.yaml
Expand Down
11 changes: 11 additions & 0 deletions devsetup/scripts/tripleo.sh
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,17 @@ manage_default_route: ${TRIPLEO_NETWORKING}
dns_server: ${PRIMARY_RESOLV_CONF_ENTRY}
user_home: /home/zuul
cloud_domain: ${CLOUD_DOMAIN}
# Adoption related stuff
adopted_internal_net: ${ADOPTED_INTERNAL_NET}
adopted_storage_net: ${ADOPTED_STORAGE_NET}
adopted_storage_mgmt_net: ${ADOPTED_STORAGE_MGMT_NET}
adopted_tenant_net: ${ADOPTED_TENANT_NET}
adopted_external_net: ${ADOPTED_EXTERNAL_NET}
standalone_internal_prefix: ${NETWORK_INTERNAL_PREFIX}
standalone_storage_prefix: ${NETWORK_STORAGE_PREFIX}
standalone_storage_mgmt_prefix: ${NETWORK_STORAGE_MGMT_PREFIX}
standalone_tenant_prefix: ${NETWORK_TENANT_PREFIX}
standalone_external_prefix: ${NETWORK_EXTERNAL_PREFIX}
EOF

jinja2_render ${SCRIPTPATH}/../tripleo/undercloud.conf.j2 "${J2_VARS_FILE}" > ${MY_TMP_DIR}/undercloud.conf
Expand Down
38 changes: 31 additions & 7 deletions devsetup/standalone/net_config.j2
Original file line number Diff line number Diff line change
Expand Up @@ -42,32 +42,56 @@ network_config:
mtu: {{ interface_mtu }}
vlan_id: 20
addresses:
- ip_netmask: 172.17.0.{{ ip_address_suffix }}/24
- ip_netmask: 172.17.0.2/32
- ip_netmask: {{ standalone_internal_prefix | default("172.17.0", true) }}.{{ ip_address_suffix }}/24
- ip_netmask: {{ standalone_internal_prefix | default("172.17.0", true) }}.2/32
{% if adopted_internal_net|default %}
routes:
- ip_netmask: {{ adopted_internal_net }}
next_hop: {{ standalone_internal_prefix | default("172.17.0", true) }}.{{ ip_address_suffix }}
{% else %}
routes: []
{% endif %}
# storage
- type: vlan
mtu: {{ interface_mtu }}
vlan_id: 21
addresses:
- ip_netmask: 172.18.0.{{ ip_address_suffix }}/24
- ip_netmask: 172.18.0.2/32
- ip_netmask: {{ standalone_storage_prefix | default("172.18.0", true) }}.{{ ip_address_suffix }}/24
- ip_netmask: {{ standalone_storage_prefix | default("172.18.0", true) }}.2/32
{% if adopted_storage_net|default %}
routes:
- ip_netmask: {{ adopted_storage_net }}
next_hop: {{ standalone_storage_prefix | default("172.18.0", true) }}.{{ ip_address_suffix }}
{% else %}
routes: []
{% endif %}
# storage_mgmt
- type: vlan
mtu: {{ interface_mtu }}
vlan_id: 23
addresses:
- ip_netmask: 172.20.0.{{ ip_address_suffix }}/24
- ip_netmask: 172.20.0.2/32
- ip_netmask: {{ standalone_storage_mgmt_prefix | default("172.20.0", true) }}.{{ ip_address_suffix }}/24
- ip_netmask: {{ standalone_storage_mgmt_prefix | default("172.20.0", true) }}.2/32
{% if adopted_storage_mgmt_net|default %}
routes:
- ip_netmask: {{ adopted_storage_mgmt_net }}
next_hop: {{ standalone_storage_mgmt_prefix | default("172.20.0", true) }}.{{ ip_address_suffix }}
{% else %}
routes: []
{% endif %}
# tenant
- type: vlan
mtu: {{ interface_mtu }}
vlan_id: 22
addresses:
- ip_netmask: 172.19.0.{{ ip_address_suffix }}/24
- ip_netmask: {{ standalone_tenant_prefix | default("172.19.0", true) }}.{{ ip_address_suffix }}/24
{% if adopted_tenant_net|default %}
routes:
- ip_netmask: {{ adopted_tenant_net }}
next_hop: {{ standalone_tenant_prefix | default("172.19.0", true) }}.{{ ip_address_suffix }}
{% else %}
routes: []
{% endif %}
{%- for network in additional_networks if network.standalone_config %}
{%- set net = network.standalone_config %}
- type: {{ net.type }}
Expand Down
48 changes: 39 additions & 9 deletions devsetup/tripleo/net_config.j2
Original file line number Diff line number Diff line change
Expand Up @@ -33,37 +33,67 @@ network_config:
mtu: {{ interface_mtu }}
vlan_id: 44
addresses:
- ip_netmask: 172.21.0.{{ ip_address_suffix }}/24
- ip_netmask: 172.21.0.2/32
- ip_netmask: {{ standalone_external_prefix | default("172.21.0", true)}}.{{ ip_address_suffix }}/24
- ip_netmask: {{ standalone_external_prefix | default("172.21.0", true)}}.2/32
{% if adopted_external_net|default %}
routes:
- ip_netmask: {{ adopted_external_net }}
next_hop: {{ standalone_external_prefix | default("172.21.0", true) }}.{{ip_address_suffix}}
{% else %}
routes: []
{% endif %}
# internal
- type: vlan
mtu: {{ interface_mtu }}
vlan_id: 20
addresses:
- ip_netmask: 172.17.0.{{ ip_address_suffix }}/24
- ip_netmask: 172.17.0.2/32
- ip_netmask: {{ standalone_internal_prefix | default("172.17.0", true)}}.{{ ip_address_suffix }}/24
- ip_netmask: {{ standalone_internal_prefix | default("172.17.0", true)}}.2/32
{% if adopted_internal_net|default %}
routes:
- ip_netmask: {{ adopted_internal_net }}
next_hop: {{ standalone_internal_prefix | default("172.17.0", true) }}.{{ip_address_suffix}}
{% else %}
routes: []
{% endif %}
# storage
- type: vlan
mtu: {{ interface_mtu }}
vlan_id: 21
addresses:
- ip_netmask: 172.18.0.{{ ip_address_suffix }}/24
- ip_netmask: 172.18.0.2/32
- ip_netmask: {{ standalone_storage_prefix | default("172.18.0", true) }}.{{ ip_address_suffix }}/24
- ip_netmask: {{ standalone_storage_prefix | default("172.18.0", true) }}.2/32
{% if adopted_storage_net|default %}
routes:
- ip_netmask: {{ adopted_storage_net }}
next_hop: {{ standalone_storage_prefix | default("172.18.0", true) }}.{{ ip_address_suffix }}
{% else %}
routes: []
{% endif %}
# storage_mgmt
- type: vlan
mtu: {{ interface_mtu }}
vlan_id: 23
addresses:
- ip_netmask: 172.20.0.{{ ip_address_suffix }}/24
- ip_netmask: 172.20.0.2/32
- ip_netmask: {{ standalone_storage_mgmt_prefix | default("172.20.0", true) }}.{{ ip_address_suffix }}/24
- ip_netmask: {{ standalone_storage_mgmt_prefix | default("172.20.0", true) }}.2/32
{% if adopted_storage_mgmt_net|default %}
routes:
- ip_netmask: {{ adopted_storage_mgmt_net }}
next_hop: {{ standalone_storage_mgmt_prefix | default("172.20.0", true) }}.{{ ip_address_suffix }}
{% else %}
routes: []
{% endif %}
# tenant
- type: vlan
mtu: {{ interface_mtu }}
vlan_id: 22
addresses:
- ip_netmask: 172.19.0.{{ ip_address_suffix }}/24
- ip_netmask: {{ standalone_tenant_prefix | default("172.19.0", true) }}.{{ ip_address_suffix }}/24
{% if adopted_tenant_net|default %}
routes:
- ip_netmask: {{ adopted_tenant_net }}
next_hop: {{ standalone_tenant_prefix | default("172.19.0", true) }}.{{ ip_address_suffix }}
{% else %}
routes: []
{% endif %}
86 changes: 86 additions & 0 deletions devsetup/tripleo/overcloud_net_config_scenario_a.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
#jinja2: trim_blocks:False
network_config:
- type: ovs_bridge
name: br-ex
mtu: {{ interface_mtu }}
use_dhcp: false
dns_servers:
{% if dns_server %}
- {{ dns_server }}
{% endif %}
- {{ gateway_ip }}
domain: []
addresses:
- ip_netmask: {{ ctlplane_ip }}/{{ ctlplane_cidr }}
routes: []
members:
- type: interface
name: {{ os_net_config_iface | default(nic1) }}
mtu: {{ interface_mtu }}
# force the MAC address of the bridge to this interface
primary: true
# external
- type: vlan
mtu: {{ interface_mtu }}
vlan_id: 44
addresses:
- ip_netmask: {{ standalone_external_prefix | default("172.21.0", true)}}.{{ ip_address_suffix }}/24
{% if adopted_external_net|default %}
routes:
- ip_netmask: {{ adopted_external_net }}
next_hop: {{ standalone_external_prefix | default("172.21.0", true) }}.{{ip_address_suffix}}
{% else %}
routes: []
{% endif %}
# internal
- type: vlan
mtu: {{ interface_mtu }}
vlan_id: 20
addresses:
- ip_netmask: {{ standalone_internal_prefix | default("172.17.0", true)}}.{{ ip_address_suffix }}/24
{% if adopted_internal_net|default %}
routes:
- ip_netmask: {{ adopted_internal_net }}
next_hop: {{ standalone_internal_prefix | default("172.17.0", true) }}.{{ip_address_suffix}}
{% else %}
routes: []
{% endif %}
# storage
- type: vlan
mtu: {{ interface_mtu }}
vlan_id: 21
addresses:
- ip_netmask: {{ standalone_storage_prefix | default("172.18.0", true) }}.{{ ip_address_suffix }}/24
{% if adopted_storage_net|default %}
routes:
- ip_netmask: {{ adopted_storage_net }}
next_hop: {{ standalone_storage_prefix | default("172.18.0", true) }}.{{ ip_address_suffix }}
{% else %}
routes: []
{% endif %}
# storage_mgmt
- type: vlan
mtu: {{ interface_mtu }}
vlan_id: 23
addresses:
- ip_netmask: {{ standalone_storage_mgmt_prefix | default("172.20.0", true) }}.{{ ip_address_suffix }}/24
{% if adopted_storage_mgmt_net|default %}
routes:
- ip_netmask: {{ adopted_storage_mgmt_net }}
next_hop: {{ standalone_storage_mgmt_prefix | default("172.20.0", true) }}.{{ ip_address_suffix }}
{% else %}
routes: []
{% endif %}
# tenant
- type: vlan
mtu: {{ interface_mtu }}
vlan_id: 22
addresses:
- ip_netmask: {{ standalone_tenant_prefix | default("172.19.0", true) }}.{{ ip_address_suffix }}/24
{% if adopted_tenant_net|default %}
routes:
- ip_netmask: {{ adopted_tenant_net }}
next_hop: {{ standalone_tenant_prefix | default("172.19.0", true) }}.{{ ip_address_suffix }}
{% else %}
routes: []
{% endif %}
6 changes: 3 additions & 3 deletions scripts/gen-metallb-config.sh
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ spec:
EOF_CAT
if [ -n "$IPV4_ENABLED" ]; then
cat >> ${DEPLOY_DIR}/ipaddresspools.yaml <<EOF_CAT
- 172.17.0.80-172.17.0.90
- ${INTERNALAPI_PREFIX}.80-${INTERNALAPI_PREFIX}.90
EOF_CAT
fi
if [ -n "$IPV6_ENABLED" ]; then
Expand All @@ -112,7 +112,7 @@ spec:
EOF_CAT
if [ -n "$IPV4_ENABLED" ]; then
cat >> ${DEPLOY_DIR}/ipaddresspools.yaml <<EOF_CAT
- 172.18.0.80-172.18.0.90
- ${STORAGE_PREFIX}.80-${STORAGE_PREFIX}.90
EOF_CAT
fi
if [ -n "$IPV6_ENABLED" ]; then
Expand All @@ -132,7 +132,7 @@ spec:
EOF_CAT
if [ -n "$IPV4_ENABLED" ]; then
cat >> ${DEPLOY_DIR}/ipaddresspools.yaml <<EOF_CAT
- 172.19.0.80-172.19.0.90
- ${TENANT_PREFIX}.80-${TENANT_PREFIX}.90
EOF_CAT
fi
if [ -n "$IPV6_ENABLED" ]; then
Expand Down
Loading