From a7503a7d3f1dd41fde7f8c22dc227bb55dc2d0b6 Mon Sep 17 00:00:00 2001 From: Pete Birley Date: Tue, 20 Jun 2017 00:22:49 -0500 Subject: [PATCH] Kubernetes Entrypoint: Lookup service names for dependency checks The existing entrypoint logic used static names to reolve dependencies. This prevented the service names, and thus the hostnames of services being altered. This PS resolves that issue by looking up the service name from the endpoints specified in the values for a chart. Partial-Implements: blueprint enhance-entrypoint-dependency-checking External-Tracking-Id: OSH-21 Change-Id: Ib49490f332f8cd88e98c50d9335dfd314a170936 --- barbican/values.yaml | 35 +++++--- cinder/values.yaml | 67 ++++++++------ glance/values.yaml | 65 ++++++++------ heat/templates/job-db-init.yaml | 2 +- heat/values.yaml | 59 +++++++----- .../endpoints/_hostname_endpoint_lookup.tpl | 32 +++++++ .../snippets/_k8s_init_dep_check.tpl | 2 +- .../utils/_comma_joined_hostname_list.tpl | 19 ++++ horizon/values.yaml | 13 ++- keystone/templates/job-db-init.yaml | 2 +- keystone/values.yaml | 32 ++++--- magnum/templates/job-db-init.yaml | 2 +- magnum/values.yaml | 43 +++++---- mistral/values.yaml | 59 +++++++----- neutron/values.yaml | 82 ++++++++++------- nova/values.yaml | 90 +++++++++++++------ rabbitmq/values.yaml | 5 +- senlin/templates/job-db-init.yaml | 2 +- senlin/values.yaml | 43 +++++---- 19 files changed, 427 insertions(+), 227 deletions(-) create mode 100644 helm-toolkit/templates/endpoints/_hostname_endpoint_lookup.tpl create mode 100644 helm-toolkit/templates/utils/_comma_joined_hostname_list.tpl diff --git a/barbican/values.yaml b/barbican/values.yaml index b9b16021bf..bc7975da1b 100644 --- a/barbican/values.yaml +++ b/barbican/values.yaml @@ -63,32 +63,39 @@ keystone: dependencies: db_init: - service: - - mariadb + services: + - service: oslo_db + endpoint: internal db_sync: jobs: - barbican-db-init - service: - - mariadb + services: + - service: oslo_db + endpoint: internal ks_user: - service: - - keystone-api + services: + - service: identity + endpoint: internal ks_service: - service: - - keystone-api + services: + - service: identity + endpoint: internal ks_endpoints: jobs: - barbican-ks-service - service: - - keystone-api + services: + - service: identity + endpoint: internal api: jobs: - barbican-db-sync - barbican-ks-user - barbican-ks-endpoints - service: - - keystone-api - - mariadb + services: + - service: oslo_db + endpoint: internal + - service: identity + endpoint: internal conf: paste: @@ -171,7 +178,7 @@ endpoints: amqp: 5672 oslo_cache: hosts: - default: memcache + default: memcached port: memcache: 11211 diff --git a/cinder/values.yaml b/cinder/values.yaml index e9acbe6b6b..fd9ce2d6af 100644 --- a/cinder/values.yaml +++ b/cinder/values.yaml @@ -153,60 +153,75 @@ conf: dependencies: db_init: - service: - - mariadb + services: + - service: oslo_db + endpoint: internal db_sync: jobs: - cinder-db-init - service: - - mariadb + services: + - service: oslo_db + endpoint: internal ks_user: - service: - - keystone-api + services: + - service: identity + endpoint: internal ks_service: - service: - - keystone-api + services: + - service: identity + endpoint: internal ks_endpoints: jobs: - cinder-ks-service - service: - - keystone-api + services: + - service: identity + endpoint: internal api: jobs: - cinder-db-sync - cinder-ks-user - cinder-ks-endpoints - service: - - mariadb - - keystone-api + services: + - service: oslo_db + endpoint: internal + - service: identity + endpoint: internal bootstrap: - service: - - keystone-api - - cinder-api + services: + - service: identity + endpoint: internal + - service: volume + endpoint: internal volume: jobs: - cinder-db-sync - cinder-ks-user - cinder-ks-endpoints - service: - - keystone-api - - cinder-api + services: + - service: identity + endpoint: internal + - service: volume + endpoint: internal scheduler: jobs: - cinder-db-sync - cinder-ks-user - cinder-ks-endpoints - service: - - keystone-api - - cinder-api + services: + - service: identity + endpoint: internal + - service: volume + endpoint: internal backup: jobs: - cinder-db-sync - cinder-ks-user - cinder-ks-endpoints - service: - - keystone-api - - cinder-api + services: + - service: identity + endpoint: internal + - service: volume + endpoint: internal # We use a different layout of the endpoints here to account for versioning # this swaps the service name and type, and should be rolled out to other @@ -284,7 +299,7 @@ endpoints: amqp: 5672 oslo_cache: hosts: - default: memcache + default: memcached port: memcache: 11211 diff --git a/glance/values.yaml b/glance/values.yaml index 891a4f3cf5..6dbca9abd3 100644 --- a/glance/values.yaml +++ b/glance/values.yaml @@ -232,54 +232,69 @@ resources: dependencies: db_init: - service: - - mariadb + services: + - service: oslo_db + endpoint: internal db_sync: jobs: - glance-db-init - service: - - mariadb + services: + - service: oslo_db + endpoint: internal bootstrap: jobs: - glance-db-sync - glance-ks-user - glance-ks-endpoints - service: - - mariadb - - glance-api + services: + - service: identity + endpoint: internal + - service: image + endpoint: internal ks_user: - service: - - keystone-api + services: + - service: identity + endpoint: internal ks_service: - service: - - keystone-api + services: + - service: identity + endpoint: internal ks_endpoints: jobs: - glance-ks-service - service: - - keystone-api + services: + - service: identity + endpoint: internal api: jobs: - glance-db-sync - glance-ks-user - glance-ks-endpoints - service: - - keystone-api - - mariadb + services: + - service: oslo_db + endpoint: internal + - service: identity + endpoint: internal registry: jobs: - glance-db-sync - glance-ks-user - glance-ks-endpoints - service: - - keystone-api - - mariadb - - glance-api + services: + - service: oslo_db + endpoint: internal + - service: identity + endpoint: internal + - service: image + endpoint: internal tests: - service: - - keystone-api - - glance-api - - glance-registry + services: + - service: oslo_db + endpoint: internal + - service: identity + endpoint: internal + - service: image + endpoint: internal # typically overriden by environmental # values, but should include all endpoints @@ -326,7 +341,7 @@ endpoints: mysql: 3306 oslo_cache: hosts: - default: memcache + default: memcached port: memcache: 11211 oslo_messaging: diff --git a/heat/templates/job-db-init.yaml b/heat/templates/job-db-init.yaml index d61b2f9d66..1693fbcc86 100644 --- a/heat/templates/job-db-init.yaml +++ b/heat/templates/job-db-init.yaml @@ -13,7 +13,7 @@ # limitations under the License. {{- $envAll := . }} -{{- $dependencies := .Values.dependencies.init }} +{{- $dependencies := .Values.dependencies.db_init }} apiVersion: batch/v1 kind: Job metadata: diff --git a/heat/values.yaml b/heat/values.yaml index c0a4712832..f480900b0e 100644 --- a/heat/values.yaml +++ b/heat/values.yaml @@ -181,56 +181,69 @@ network: dependencies: db_init: - service: - - mariadb + services: + - service: oslo_db + endpoint: internal db_sync: jobs: - heat-db-init - service: - - mariadb + services: + - service: oslo_db + endpoint: internal ks_user: - service: - - keystone-api + services: + - service: identity + endpoint: internal ks_service: - service: - - keystone-api + services: + - service: identity + endpoint: internal ks_endpoints: jobs: - heat-ks-service - service: - - keystone-api + services: + - service: identity + endpoint: internal api: jobs: - heat-db-sync - heat-ks-user - heat-ks-endpoints - service: - - keystone-api - - mariadb + services: + - service: oslo_db + endpoint: internal + - service: identity + endpoint: internal cfn: jobs: - heat-db-sync - heat-ks-user - heat-ks-endpoints - service: - - keystone-api - - mariadb + services: + - service: oslo_db + endpoint: internal + - service: identity + endpoint: internal cloudwatch: jobs: - heat-db-sync - heat-ks-user - heat-ks-endpoints - service: - - keystone-api - - mariadb + services: + - service: oslo_db + endpoint: internal + - service: identity + endpoint: internal engine: jobs: - heat-db-sync - heat-ks-user - heat-ks-endpoints - service: - - keystone-api - - mariadb + services: + - service: oslo_db + endpoint: internal + - service: identity + endpoint: internal # typically overriden by environmental # values, but should include all endpoints @@ -287,7 +300,7 @@ endpoints: mysql: 3306 oslo_cache: hosts: - default: memcache + default: memcached port: memcache: 11211 oslo_messaging: diff --git a/helm-toolkit/templates/endpoints/_hostname_endpoint_lookup.tpl b/helm-toolkit/templates/endpoints/_hostname_endpoint_lookup.tpl new file mode 100644 index 0000000000..de813ab431 --- /dev/null +++ b/helm-toolkit/templates/endpoints/_hostname_endpoint_lookup.tpl @@ -0,0 +1,32 @@ +# Copyright 2017 The Openstack-Helm Authors. +# +# 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. + +# This function returns hostnames from endpoint definitions for use cases +# where the uri style return is not appropriate, and only the short hostname or +# kubernetes servicename is used or relevant in the template: +# { tuple "memcache" "internal" . | include "helm-toolkit.endpoints.hostname_endpoint_lookup" } +# returns: the short internal hostname, which will also match the service name + + +{{- define "helm-toolkit.endpoints.hostname_endpoint_lookup" -}} +{{- $type := index . 0 -}} +{{- $endpoint := index . 1 -}} +{{- $context := index . 2 -}} +{{- $endpointMap := index $context.Values.endpoints $type }} +{{- with $endpointMap -}} +{{- $endpointScheme := .scheme }} +{{- $endpointHost := index .hosts $endpoint | default .hosts.default}} +{{- printf "%s" $endpointHost -}} +{{- end -}} +{{- end -}} diff --git a/helm-toolkit/templates/snippets/_k8s_init_dep_check.tpl b/helm-toolkit/templates/snippets/_k8s_init_dep_check.tpl index b3d9ba6bca..4c0b7623c4 100644 --- a/helm-toolkit/templates/snippets/_k8s_init_dep_check.tpl +++ b/helm-toolkit/templates/snippets/_k8s_init_dep_check.tpl @@ -33,7 +33,7 @@ - name: INTERFACE_NAME value: eth0 - name: DEPENDENCY_SERVICE - value: "{{ include "helm-toolkit.utils.joinListWithComma" $deps.service }}" + value: "{{ tuple $deps.services $envAll | include "helm-toolkit.utils.comma_joined_hostname_list" }}" - name: DEPENDENCY_JOBS value: "{{ include "helm-toolkit.utils.joinListWithComma" $deps.jobs }}" - name: DEPENDENCY_DAEMONSET diff --git a/helm-toolkit/templates/utils/_comma_joined_hostname_list.tpl b/helm-toolkit/templates/utils/_comma_joined_hostname_list.tpl new file mode 100644 index 0000000000..f697d616c6 --- /dev/null +++ b/helm-toolkit/templates/utils/_comma_joined_hostname_list.tpl @@ -0,0 +1,19 @@ +# Copyright 2017 The Openstack-Helm Authors. +# +# 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. + +{{- define "helm-toolkit.utils.comma_joined_hostname_list" -}} +{{- $deps := index . 0 -}} +{{- $envAll := index . 1 -}} +{{- range $k, $v := $deps -}}{{- if $k -}},{{- end -}}{{ tuple $v.service $v.endpoint $envAll | include "helm-toolkit.endpoints.hostname_endpoint_lookup" }}{{- end -}} +{{- end -}} diff --git a/horizon/values.yaml b/horizon/values.yaml index 04439e1864..c6d609f7e8 100644 --- a/horizon/values.yaml +++ b/horizon/values.yaml @@ -58,9 +58,11 @@ local_settings: dependencies: dashboard: - service: - - memcached - - keystone-api + services: + - service: oslo_cache + endpoint: internal + - service: identity + endpoint: internal resources: enabled: false @@ -85,6 +87,11 @@ endpoints: port: admin: 35357 api: 5000 + oslo_cache: + hosts: + default: memcached + port: + memcache: 11211 mounts: horizon: diff --git a/keystone/templates/job-db-init.yaml b/keystone/templates/job-db-init.yaml index d8727d2249..50cd04a6e2 100644 --- a/keystone/templates/job-db-init.yaml +++ b/keystone/templates/job-db-init.yaml @@ -13,7 +13,7 @@ # limitations under the License. {{- $envAll := . }} -{{- $dependencies := .Values.dependencies.init }} +{{- $dependencies := .Values.dependencies.db_init }} {{- $mounts_keystone_db_init := .Values.mounts.keystone_db_init.keystone_db_init }} {{- $mounts_keystone_db_init_init := .Values.mounts.keystone_db_init.init_container }} diff --git a/keystone/values.yaml b/keystone/values.yaml index 11afa5a519..46db9a9bfe 100644 --- a/keystone/values.yaml +++ b/keystone/values.yaml @@ -79,23 +79,29 @@ dependencies: api: jobs: - keystone-db-sync - service: - - mariadb - - memcached + services: + - service: oslo_cache + endpoint: internal + - service: oslo_db + endpoint: internal + db_init: + services: + - service: oslo_db + endpoint: internal db_sync: jobs: - keystone-db-init - service: - - mariadb - init: - service: - - mariadb + services: + - service: oslo_db + endpoint: internal tests: - service: - - keystone-api + services: + - service: identity + endpoint: internal bootstrap: - service: - - keystone-api + services: + - service: identity + endpoint: internal resources: enabled: false @@ -225,6 +231,6 @@ endpoints: amqp: 5672 oslo_cache: hosts: - default: memcache + default: memcached port: memcache: 11211 diff --git a/magnum/templates/job-db-init.yaml b/magnum/templates/job-db-init.yaml index b6dc35875e..e696ea4ded 100644 --- a/magnum/templates/job-db-init.yaml +++ b/magnum/templates/job-db-init.yaml @@ -13,7 +13,7 @@ # limitations under the License. {{- $envAll := . }} -{{- $dependencies := .Values.dependencies.init }} +{{- $dependencies := .Values.dependencies.db_init }} apiVersion: batch/v1 kind: Job metadata: diff --git a/magnum/values.yaml b/magnum/values.yaml index a59f7a4de5..3d16b45911 100644 --- a/magnum/values.yaml +++ b/magnum/values.yaml @@ -102,40 +102,49 @@ network: dependencies: db_init: - service: - - mariadb + services: + - service: oslo_db + endpoint: internal db_sync: jobs: - magnum-db-init - service: - - mariadb + services: + - service: oslo_db + endpoint: internal ks_user: - service: - - keystone-api + services: + - service: identity + endpoint: internal ks_service: - service: - - keystone-api + services: + - service: identity + endpoint: internal ks_endpoints: jobs: - magnum-ks-service - service: - - keystone-api + services: + - service: identity + endpoint: internal api: jobs: - magnum-db-sync - magnum-ks-user - magnum-ks-endpoints - service: - - keystone-api - - mariadb + services: + - service: oslo_db + endpoint: internal + - service: identity + endpoint: internal conductor: jobs: - magnum-db-sync - magnum-ks-user - magnum-ks-endpoints - service: - - keystone-api - - mariadb + services: + - service: oslo_db + endpoint: internal + - service: identity + endpoint: internal # typically overriden by environmental # values, but should include all endpoints @@ -174,7 +183,7 @@ endpoints: mysql: 3306 oslo_cache: hosts: - default: memcache + default: memcached port: memcache: 11211 oslo_messaging: diff --git a/mistral/values.yaml b/mistral/values.yaml index 46acc4c1cb..92fb08849f 100644 --- a/mistral/values.yaml +++ b/mistral/values.yaml @@ -86,56 +86,69 @@ network: dependencies: db_init: - service: - - mariadb + services: + - service: oslo_db + endpoint: internal db_sync: jobs: - mistral-db-init - service: - - mariadb + services: + - service: oslo_db + endpoint: internal ks_user: - service: - - keystone-api + services: + - service: identity + endpoint: internal ks_service: - service: - - keystone-api + services: + - service: identity + endpoint: internal ks_endpoints: jobs: - mistral-ks-service - service: - - keystone-api + services: + - service: identity + endpoint: internal api: jobs: - mistral-db-sync - mistral-ks-user - mistral-ks-endpoints - service: - - keystone-api - - mariadb + services: + - service: oslo_db + endpoint: internal + - service: identity + endpoint: internal engine: jobs: - mistral-db-sync - mistral-ks-user - mistral-ks-endpoints - service: - - keystone-api - - mariadb + services: + - service: oslo_db + endpoint: internal + - service: identity + endpoint: internal event_engine: jobs: - mistral-db-sync - mistral-ks-user - mistral-ks-endpoints - service: - - keystone-api - - mariadb + services: + - service: oslo_db + endpoint: internal + - service: identity + endpoint: internal executor: jobs: - mistral-db-sync - mistral-ks-user - mistral-ks-endpoints - service: - - keystone-api - - mariadb + services: + - service: oslo_db + endpoint: internal + - service: identity + endpoint: internal # typically overriden by environmental # values, but should include all endpoints @@ -188,7 +201,7 @@ endpoints: amqp: 5672 oslo_cache: hosts: - default: memcache + default: memcached port: memcache: 11211 diff --git a/neutron/values.yaml b/neutron/values.yaml index cee9d9f460..d73ad9bdb3 100644 --- a/neutron/values.yaml +++ b/neutron/values.yaml @@ -134,57 +134,77 @@ ml2: dependencies: db_init: - service: - - mariadb + services: + - service: oslo_db + endpoint: internal db_sync: jobs: - neutron-db-init - service: - - mariadb + services: + - service: oslo_db + endpoint: internal ks_user: - service: - - keystone-api + services: + - service: identity + endpoint: internal ks_service: - service: - - keystone-api + services: + - service: identity + endpoint: internal ks_endpoints: jobs: - neutron-ks-service - service: - - keystone-api + services: + - service: identity + endpoint: internal server: jobs: - neutron-db-sync - neutron-ks-user - neutron-ks-endpoints - service: - - rabbitmq - - mariadb - - keystone-api - - memcached + services: + - service: oslo_db + endpoint: internal + - service: oslo_messaging + endpoint: internal + - service: oslo_cache + endpoint: internal + - service: identity + endpoint: internal dhcp: - service: - - rabbitmq - - neutron-server - - nova-api + services: + - service: oslo_messaging + endpoint: internal + - service: network + endpoint: internal + - service: compute + endpoint: internal daemonset: - ovs-agent metadata: - service: - - rabbitmq - - neutron-server - - nova-api + services: + - service: oslo_messaging + endpoint: internal + - service: network + endpoint: internal + - service: compute + endpoint: internal daemonset: - ovs-agent ovs_agent: - service: - - rabbitmq - - neutron-server + services: + - service: oslo_messaging + endpoint: internal + - service: network + endpoint: internal l3: - service: - - rabbitmq - - neutron-server - - nova-api + services: + - service: oslo_messaging + endpoint: internal + - service: network + endpoint: internal + - service: compute + endpoint: internal daemonset: - ovs-agent @@ -462,7 +482,7 @@ endpoints: amqp: 5672 oslo_cache: hosts: - default: memcache + default: memcached port: memcache: 11211 compute: diff --git a/nova/values.yaml b/nova/values.yaml index d5dd214dfc..5e0b9c94e3 100644 --- a/nova/values.yaml +++ b/nova/values.yaml @@ -147,60 +147,94 @@ dependencies: - nova-db-sync - nova-ks-user - nova-ks-endpoints - service: - - mariadb + services: + - service: oslo_messaging + endpoint: internal + - service: oslo_db + endpoint: internal + - service: identity + endpoint: internal db_init: - service: - - mariadb + services: + - service: oslo_db + endpoint: internal db_sync: jobs: - nova-db-init - service: - - mariadb + services: + - service: oslo_db + endpoint: internal bootstrap: - service: - - keystone-api - - nova-api + services: + - service: identity + endpoint: internal + - service: compute + endpoint: internal ks_user: - service: - - keystone-api + services: + - service: identity + endpoint: internal ks_service: - service: - - keystone-api + services: + - service: identity + endpoint: internal ks_endpoints: jobs: - nova-ks-service - service: - - keystone-api + services: + - service: identity + endpoint: internal compute: jobs: - nova-db-sync - service: - - keystone-api - - nova-api + services: + - service: oslo_messaging + endpoint: internal + - service: compute + endpoint: internal + - service: network + endpoint: internal daemonset: - ovs-agent libvirt: jobs: - nova-db-sync - service: - - keystone-api - - nova-api consoleauth: jobs: - nova-db-sync - service: - - mariadb + services: + - service: oslo_messaging + endpoint: internal + - service: oslo_db + endpoint: internal + - service: identity + endpoint: internal + - service: compute + endpoint: internal scheduler: jobs: - nova-db-sync - service: - - mariadb + services: + - service: oslo_messaging + endpoint: internal + - service: oslo_db + endpoint: internal + - service: identity + endpoint: internal + - service: compute + endpoint: internal conductor: jobs: - nova-db-sync - service: - - mariadb + services: + - service: oslo_messaging + endpoint: internal + - service: oslo_db + endpoint: internal + - service: identity + endpoint: internal + - service: compute + endpoint: internal mounts: nova_compute: @@ -393,7 +427,7 @@ endpoints: amqp: 5672 oslo_cache: hosts: - default: memcache + default: memcached port: memcache: 11211 compute: diff --git a/rabbitmq/values.yaml b/rabbitmq/values.yaml index dff17be842..a1054b4b72 100644 --- a/rabbitmq/values.yaml +++ b/rabbitmq/values.yaml @@ -75,5 +75,6 @@ probes_delay: 180 probes_timeout: 10 dependencies: - service: - - etcd + services: + - service: etcd + endpoint: internal diff --git a/senlin/templates/job-db-init.yaml b/senlin/templates/job-db-init.yaml index 78a31ec6e5..4b1f8b2a18 100644 --- a/senlin/templates/job-db-init.yaml +++ b/senlin/templates/job-db-init.yaml @@ -13,7 +13,7 @@ # limitations under the License. {{- $envAll := . }} -{{- $dependencies := .Values.dependencies.init }} +{{- $dependencies := .Values.dependencies.db_init }} apiVersion: batch/v1 kind: Job metadata: diff --git a/senlin/values.yaml b/senlin/values.yaml index 1dfe20f471..e26f505f10 100644 --- a/senlin/values.yaml +++ b/senlin/values.yaml @@ -103,40 +103,49 @@ network: dependencies: db_init: - service: - - mariadb + services: + - service: oslo_db + endpoint: internal db_sync: jobs: - senlin-db-init - service: - - mariadb + services: + - service: oslo_db + endpoint: internal ks_user: - service: - - keystone-api + services: + - service: identity + endpoint: internal ks_service: - service: - - keystone-api + services: + - service: identity + endpoint: internal ks_endpoints: jobs: - senlin-ks-service - service: - - keystone-api + services: + - service: identity + endpoint: internal api: jobs: - senlin-db-sync - senlin-ks-user - senlin-ks-endpoints - service: - - keystone-api - - mariadb + services: + - service: oslo_db + endpoint: internal + - service: identity + endpoint: internal engine: jobs: - senlin-db-sync - senlin-ks-user - senlin-ks-endpoints - service: - - keystone-api - - mariadb + servics: + - service: oslo_db + endpoint: internal + - service: identity + endpoint: internal # typically overriden by environmental # values, but should include all endpoints @@ -175,7 +184,7 @@ endpoints: mysql: 3306 oslo_cache: hosts: - default: memcache + default: memcached port: memcache: 11211 oslo_messaging: