Merge "Add DNSaaS component (Designate) to mitaka/newton model"
diff --git a/classes/cluster/virtual-mcp-pike-dvr/.env b/classes/cluster/virtual-mcp-pike-dvr/.env
index d2e169a..54bad51 100644
--- a/classes/cluster/virtual-mcp-pike-dvr/.env
+++ b/classes/cluster/virtual-mcp-pike-dvr/.env
@@ -1 +1 @@
-EXTRA_FORMULAS="ntp sphinx nginx heka grafana rsyslog prometheus telegraf memcached collectd fluentd"
+FORMULAS_SALT_MASTER+=(fluentd git grafana linux nginx ntp openssh prometheus reclass rsyslog salt sphinx telegraf)
diff --git a/classes/cluster/virtual-mcp-pike-ovs/.env b/classes/cluster/virtual-mcp-pike-ovs/.env
new file mode 100644
index 0000000..54bad51
--- /dev/null
+++ b/classes/cluster/virtual-mcp-pike-ovs/.env
@@ -0,0 +1 @@
+FORMULAS_SALT_MASTER+=(fluentd git grafana linux nginx ntp openssh prometheus reclass rsyslog salt sphinx telegraf)
diff --git a/classes/cluster/virtual-mcp-pike-ovs/infra/config.yml b/classes/cluster/virtual-mcp-pike-ovs/infra/config.yml
index cce68af..653eb75 100644
--- a/classes/cluster/virtual-mcp-pike-ovs/infra/config.yml
+++ b/classes/cluster/virtual-mcp-pike-ovs/infra/config.yml
@@ -8,24 +8,17 @@
- system.salt.master.pkg
- system.reclass.storage.salt
- system.salt.minion.ca.salt_master
-- system.salt.minion.cert.proxy
- system.sphinx.server.doc.reclass
- system.keystone.client.single
-- system.keystone.client.service.aodh
-- system.keystone.client.service.ceilometer
- system.keystone.client.service.nova21
- system.keystone.client.service.nova-placement
- system.keystone.client.service.glare
- system.keystone.client.service.cinder3
- system.keystone.client.service.designate
-- system.mysql.client.single
- system.reclass.storage.system.openstack_control_cluster
- system.reclass.storage.system.openstack_compute_multi
- system.reclass.storage.system.openstack_gateway_single
- system.reclass.storage.system.openstack_dashboard_single
-- system.reclass.storage.system.stacklightv2_server_cluster
-- cluster.virtual-mcp-pike-ovs.openstack.proxy
-- cluster.virtual-mcp-pike-ovs.stacklight.proxy
- cluster.virtual-mcp-pike-ovs
parameters:
_param:
@@ -48,14 +41,6 @@
proto: static
address: ${_param:single_address}
netmask: 255.255.255.0
- nginx:
- server:
- site:
- nginx_proxy_openstack_web:
- proxy:
- host: prx
- nginx_proxy_openstack_api_heat_cfn:
- enabled: false
salt:
master:
reactor:
@@ -120,21 +105,6 @@
cluster_param:
openstack_gateway_node01_address:
value_template: <<node_control_ip>>
- stacklight_monitor_node01:
- expression: <<node_hostname>>__equals__mon01
- cluster_param:
- stacklight_monitor_node01_address:
- value_template: <<node_control_ip>>
- stacklight_monitor_node02:
- expression: <<node_hostname>>__equals__mon02
- cluster_param:
- stacklight_monitor_node02_address:
- value_template: <<node_control_ip>>
- stacklight_monitor_node03:
- expression: <<node_hostname>>__equals__mon03
- cluster_param:
- stacklight_monitor_node03_address:
- value_template: <<node_control_ip>>
openstack_dashboard:
expression: <<node_hostname>>__startswith__prx
node_class:
@@ -163,10 +133,6 @@
params:
mysql_cluster_role: slave
linux_system_codename: xenial
- stacklight_server_node01:
- classes:
- - system.influxdb.server.single
- - system.influxdb.database.stacklight
openstack_compute_node01:
params:
single_address: 172.16.10.105
diff --git a/classes/cluster/virtual-mcp-pike-ovs/init.yml b/classes/cluster/virtual-mcp-pike-ovs/init.yml
index 98fc137..3083cdd 100644
--- a/classes/cluster/virtual-mcp-pike-ovs/init.yml
+++ b/classes/cluster/virtual-mcp-pike-ovs/init.yml
@@ -1,52 +1,20 @@
classes:
- system.linux.network.dynamic_hosts
-- service.grafana.collector
-- system.fluentd
-- system.fluentd.label.default_metric
-- system.fluentd.label.default_metric.prometheus
-- system.fluentd.label.default_output.elasticsearch
-- system.fluentd.label.default_output.drop_event
- system.linux.system.repo.mcp.extra
- system.linux.system.single
-- system.linux.system.repo.mcp.apt_mirantis.fluentd
-- system.rsyslog.client.single
-- system.prometheus.collector
-- system.telegraf.agent
- system.openssh.server.team.lab
- system.openssh.server.team.tcpcloud
- system.openssh.server.team.mcp_qa
- cluster.virtual-mcp-pike-ovs.infra
- cluster.virtual-mcp-pike-ovs.openstack
-- cluster.virtual-mcp-pike-ovs.stacklight
-
+- cluster.overrides
parameters:
_param:
cluster_domain: virtual-mcp-pike-ovs.local
cluster_name: virtual-mcp-pike-ovs
infra_config_hostname: cfg01
- # infra service addresses
infra_config_address: 172.16.10.100
- # openstack service addresses
- openstack_proxy_address: 172.16.10.121
- openstack_proxy_node01_address: 172.16.10.121
- openstack_control_address: 172.16.10.254
- openstack_control_node01_address: 172.16.10.101
- openstack_control_node02_address: 172.16.10.102
- openstack_control_node03_address: 172.16.10.103
- openstack_gateway_address: 172.16.10.110
- openstack_database_address: ${_param:openstack_control_address}
- openstack_message_queue_address: ${_param:openstack_control_address}
- openstack_message_queue_node01_address: ${_param:openstack_control_node01_address}
- openstack_message_queue_node02_address: ${_param:openstack_control_node02_address}
- openstack_message_queue_node03_address: ${_param:openstack_control_node03_address}
- # stacklight service addresses
- stacklight_monitor_address: 172.16.10.253
- stacklight_monitor_node01_address: 172.16.10.107
- stacklight_monitor_node02_address: 172.16.10.108
- stacklight_monitor_node03_address: 172.16.10.109
- stacklight_telemetry_node01_address: ${_param:stacklight_monitor_node01_address}
- stacklight_log_address: ${_param:stacklight_monitor_address}
- openstack_gateway_address: 172.16.10.110
- openstack_gateway_node01_address: ${_param:openstack_gateway_address}
- stacklight_telemetry_address: ${_param:stacklight_monitor_address}
-
+ salt:
+ minion:
+ trusted_ca_minions:
+ - cfg01.${linux:system:domain}
diff --git a/classes/cluster/virtual-mcp-pike-ovs/openstack/compute.yml b/classes/cluster/virtual-mcp-pike-ovs/openstack/compute.yml
index 97a0cfb..65e84e5 100644
--- a/classes/cluster/virtual-mcp-pike-ovs/openstack/compute.yml
+++ b/classes/cluster/virtual-mcp-pike-ovs/openstack/compute.yml
@@ -5,8 +5,6 @@
- system.linux.network.hosts
- system.nova.compute.cluster
- system.neutron.compute.cluster
-- system.ceilometer.agent.cluster
-- system.prometheus.exporters.libvirt
- cluster.virtual-mcp-pike-ovs
parameters:
_param:
@@ -18,11 +16,6 @@
nova:
compute:
vncproxy_url: http://${_param:cluster_vip_address}:6080
- notification:
- driver: messagingv2
- topics: "notifications,${_param:stacklight_notification_topic}"
- notify_on:
- state_change: vm_and_task_state
message_queue:
members:
- host: ${_param:openstack_control_node01_address}
@@ -40,12 +33,14 @@
mtu: ${_param:interface_mtu}
primary_interface:
enabled: true
+ ipflush_onchange: true
name: ${_param:primary_interface}
mtu: ${_param:interface_mtu}
proto: manual
type: eth
tenant_interface:
enabled: true
+ ipflush_onchange: true
name: ${_param:tenant_interface}
mtu: ${_param:interface_mtu}
proto: manual
@@ -65,4 +60,4 @@
address: ${_param:tenant_address}
netmask: 255.255.255.0
use_interfaces:
- - ${_param:tenant_interface}
\ No newline at end of file
+ - ${_param:tenant_interface}
diff --git a/classes/cluster/virtual-mcp-pike-ovs/openstack/control.yml b/classes/cluster/virtual-mcp-pike-ovs/openstack/control.yml
index 38c3c70..6c027bf 100644
--- a/classes/cluster/virtual-mcp-pike-ovs/openstack/control.yml
+++ b/classes/cluster/virtual-mcp-pike-ovs/openstack/control.yml
@@ -20,19 +20,12 @@
- system.neutron.control.openvswitch.cluster
- system.cinder.control.cluster
- system.heat.server.cluster
-- system.ceilometer.server.cluster
-- system.ceilometer.server.backend.influxdb
-- system.aodh.server.cluster
-- system.heka.ceilometer_collector.single
- system.designate.server.cluster
- system.designate.server.backend.bind
- system.bind.server.single
- system.galera.server.cluster
-- system.galera.server.database.aodh
-- system.galera.server.database.ceilometer
- system.galera.server.database.cinder
- system.galera.server.database.glance
-- system.galera.server.database.grafana
- system.galera.server.database.heat
- system.galera.server.database.keystone
- system.galera.server.database.nova
@@ -77,9 +70,6 @@
keystone:
server:
admin_email: ${_param:admin_email}
- notification:
- driver: messagingv2
- topics: "notifications,${_param:stacklight_notification_topic}"
designate:
server:
pools:
@@ -118,19 +108,6 @@
engine: file
images: []
workers: 1
- notification:
- driver: messagingv2
- topics: "notifications,${_param:stacklight_notification_topic}"
- heat:
- server:
- notification:
- driver: messagingv2
- topics: "notifications,${_param:stacklight_notification_topic}"
- neutron:
- server:
- notification:
- driver: messagingv2
- topics: "notifications,${_param:stacklight_notification_topic}"
nova:
controller:
networking: dvr
@@ -143,15 +120,3 @@
novncproxy_port: 6080
vncproxy_url: http://${_param:cluster_vip_address}:6080
workers: 1
- notification:
- driver: messagingv2
- topics: "notifications,${_param:stacklight_notification_topic}"
- cinder:
- volume:
- notification:
- driver: messagingv2
- topics: "notifications,${_param:stacklight_notification_topic}"
- controller:
- notification:
- driver: messagingv2
- topics: "notifications,${_param:stacklight_notification_topic}"
diff --git a/classes/cluster/virtual-mcp-pike-ovs/openstack/init.yml b/classes/cluster/virtual-mcp-pike-ovs/openstack/init.yml
index 3325580..e1aa93a 100644
--- a/classes/cluster/virtual-mcp-pike-ovs/openstack/init.yml
+++ b/classes/cluster/virtual-mcp-pike-ovs/openstack/init.yml
@@ -1,5 +1,29 @@
parameters:
_param:
+ # openstack service addresses
+ openstack_database_address: 172.16.10.254
+ openstack_proxy_address: 172.16.10.121
+ openstack_proxy_node01_address: 172.16.10.121
+ openstack_control_address: 172.16.10.254
+ openstack_control_node01_hostname: ctl01
+ openstack_control_node02_hostname: ctl02
+ openstack_control_node03_hostname: ctl03
+ openstack_control_node01_address: 172.16.10.101
+ openstack_control_node02_address: 172.16.10.102
+ openstack_control_node03_address: 172.16.10.103
+ openstack_database_address: ${_param:openstack_control_address}
+ openstack_database_node01_address: ${_param:openstack_control_node01_address}
+ openstack_database_node02_address: ${_param:openstack_control_node02_address}
+ openstack_database_node03_address: ${_param:openstack_control_node03_address}
+ openstack_message_queue_address: ${_param:openstack_control_address}
+ openstack_message_queue_node01_address: ${_param:openstack_control_node01_address}
+ openstack_message_queue_node02_address: ${_param:openstack_control_node02_address}
+ openstack_message_queue_node03_address: ${_param:openstack_control_node03_address}
+ openstack_gateway_address: 172.16.10.110
+ openstack_gateway_node01_address: ${_param:openstack_gateway_address}
+ openstack_dns_node01_address: 172.16.10.111
+ openstack_dns_node02_address: 172.16.10.112
+
openstack_version: pike
cinder_version: ${_param:openstack_version}
apt_mk_version: testing
@@ -29,11 +53,11 @@
cluster_vip_address: 172.16.10.254
cluster_local_address: ${_param:single_address}
cluster_node01_hostname: ctl01
- cluster_node01_address: 172.16.10.101
+ cluster_node01_address: ${_param:openstack_control_node01_address}
cluster_node02_hostname: ctl02
- cluster_node02_address: 172.16.10.102
+ cluster_node02_address: ${_param:openstack_control_node02_address}
cluster_node03_hostname: ctl03
- cluster_node03_address: 172.16.10.103
+ cluster_node03_address: ${_param:openstack_control_node03_address}
rabbitmq_secret_key: workshop
rabbitmq_admin_password: workshop
rabbitmq_openstack_password: workshop
@@ -75,14 +99,8 @@
heat_version: ${_param:openstack_version}
heat_service_host: ${_param:cluster_vip_address}
heat_domain_admin_password: workshop
- ceilometer_version: ${_param:openstack_version}
- ceilometer_service_host: ${_param:cluster_vip_address}
cinder_version: ${_param:openstack_version}
cinder_service_host: ${_param:cluster_vip_address}
- aodh_version: ${_param:openstack_version}
- aodh_service_host: ${_param:cluster_vip_address}
- ceilometer_graphite_publisher_host: 172.16.10.107
- ceilometer_graphite_publisher_port: 2013
nova_version: ${_param:openstack_version}
nova_service_host: ${_param:cluster_vip_address}
nova_vncproxy_url: http://${_param:cluster_vip_address}:8060
@@ -94,19 +112,14 @@
mysql_admin_user: root
mysql_admin_password: workshop
mysql_cinder_password: workshop
- mysql_ceilometer_password: workshop
mysql_glance_password: workshop
- mysql_grafana_password: workshop
mysql_heat_password: workshop
mysql_keystone_password: workshop
mysql_neutron_password: workshop
mysql_nova_password: workshop
- mysql_aodh_password: workshop
mysql_designate_password: workshop
keystone_service_token: workshop
keystone_admin_password: workshop
- keystone_ceilometer_password: workshop
- keystone_aodh_password: workshop
keystone_cinder_password: workshop
keystone_glance_password: workshop
keystone_heat_password: workshop
@@ -114,17 +127,11 @@
keystone_neutron_password: workshop
keystone_nova_password: workshop
keystone_designate_password: workshop
- ceilometer_secret_key: workshop
horizon_version: ${_param:openstack_version}
horizon_secret_key: opaesee8Que2yahJoh9fo0eefo1Aeyo6ahyei8zeiboh3aeth5loth7ieNa5xi5e
horizon_identity_host: ${_param:cluster_vip_address}
horizon_identity_encryption: none
horizon_identity_version: 2
- mongodb_server_replica_set: ceilometer
- mongodb_ceilometer_password: cloudlab
- mongodb_admin_password: cloudlab
- mongodb_shared_key: eoTh1AwahlahqueingeejooLughah4tei9feing0eeVaephooDi2li1TaeV1ooth
- ceilometer_influxdb_password: lmapass
openstack_log_appender: true
openstack_fluentd_handler_enabled: true
linux:
diff --git a/classes/cluster/virtual-mcp-pike-ovs/openstack/proxy.yml b/classes/cluster/virtual-mcp-pike-ovs/openstack/proxy.yml
index f7ec9ce..2819d1e 100644
--- a/classes/cluster/virtual-mcp-pike-ovs/openstack/proxy.yml
+++ b/classes/cluster/virtual-mcp-pike-ovs/openstack/proxy.yml
@@ -12,4 +12,4 @@
authority: ${_param:salt_minion_ca_authority}
engine: salt
mode: secure
- salt_minion_ca_host: cfg01.${_param:cluster_domain}
\ No newline at end of file
+ salt_minion_ca_host: cfg01.${_param:cluster_domain}
diff --git a/classes/cluster/virtual-mcp-pike-ovs/stacklight/client.yml b/classes/cluster/virtual-mcp-pike-ovs/stacklight/client.yml
deleted file mode 100644
index 62634a9..0000000
--- a/classes/cluster/virtual-mcp-pike-ovs/stacklight/client.yml
+++ /dev/null
@@ -1,22 +0,0 @@
-classes:
-- system.docker.client
-- system.elasticsearch.client.single
-- system.grafana.client
-- system.grafana.client.datasource.prometheus
-- system.kibana.client.single
-- cluster.virtual-mcp-pike-ovs
-parameters:
- _param:
- # Elasticsearch/Kibana client parameters
- stacklight_log_address: ${_param:stacklight_monitor_address}
- # Grafana client parameters
- grafana_address: ${_param:stacklight_monitor_address}
- grafana_port: 15013
- grafana_user: admin
- grafana_password: ${_param:grafana_admin_password}
- grafana_prometheus_address: ${_param:stacklight_monitor_address}
- grafana_prometheus_port: 15016
-
- cluster_node01_address: ${_param:stacklight_monitor_node01_address}
- cluster_node02_address: ${_param:stacklight_monitor_node02_address}
- cluster_node03_address: ${_param:stacklight_monitor_node03_address}
diff --git a/classes/cluster/virtual-mcp-pike-ovs/stacklight/init.yml b/classes/cluster/virtual-mcp-pike-ovs/stacklight/init.yml
deleted file mode 100644
index f89e303..0000000
--- a/classes/cluster/virtual-mcp-pike-ovs/stacklight/init.yml
+++ /dev/null
@@ -1,36 +0,0 @@
-parameters:
- _param:
- linux_system_codename: xenial
- prometheus_control_address: ${_param:stacklight_monitor_address}
- heka_elasticsearch_host: ${_param:stacklight_monitor_address}
- elasticsearch_port: 9200
- stacklight_environment: ${_param:cluster_domain}
- stacklight_notification_topic: stacklight_notifications
- grafana_admin_password: admin
- grafana_database_type: mysql
- grafana_database_host: ${_param:openstack_database_address}
- grafana_database_password: ${_param:mysql_grafana_password}
- fluentd_elasticsearch_host: ${_param:stacklight_log_address}
- linux:
- network:
- host:
- mon:
- address: ${_param:stacklight_monitor_address}
- names:
- - mon
- - mon.${_param:cluster_domain}
- mon01:
- address: ${_param:stacklight_monitor_node01_address}
- names:
- - mon01
- - mon01.${_param:cluster_domain}
- mon02:
- address: ${_param:stacklight_monitor_node02_address}
- names:
- - mon02
- - mon02.${_param:cluster_domain}
- mon03:
- address: ${_param:stacklight_monitor_node03_address}
- names:
- - mon03
- - mon03.${_param:cluster_domain}
diff --git a/classes/cluster/virtual-mcp-pike-ovs/stacklight/proxy.yml b/classes/cluster/virtual-mcp-pike-ovs/stacklight/proxy.yml
deleted file mode 100644
index 1e72fd9..0000000
--- a/classes/cluster/virtual-mcp-pike-ovs/stacklight/proxy.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-classes:
-- system.nginx.server.single
-- system.nginx.server.proxy.stacklight.grafana
-- system.nginx.server.proxy.stacklight.kibana
-- system.nginx.server.proxy.monitoring.prometheus_server
-- system.nginx.server.proxy.monitoring.prometheus_alertmanager
-- system.salt.minion.cert.proxy
-- cluster.virtual-mcp-pike-ovs
-parameters:
- _param:
- nginx_proxy_grafana_port: 15013
- nginx_proxy_ssl:
- enabled: true
- authority: ${_param:salt_minion_ca_authority}
- engine: salt
- mode: secure
- salt_minion_ca_host: cfg01.${_param:cluster_domain}
diff --git a/classes/cluster/virtual-mcp-pike-ovs/stacklight/server.yml b/classes/cluster/virtual-mcp-pike-ovs/stacklight/server.yml
deleted file mode 100644
index f1631aa..0000000
--- a/classes/cluster/virtual-mcp-pike-ovs/stacklight/server.yml
+++ /dev/null
@@ -1,73 +0,0 @@
-classes:
-- system.docker.host
-- system.linux.system.repo.mcp.apt_mirantis.influxdb
-- system.linux.system.repo.mcp.extra
-- system.linux.system.repo.mcp.apt_mirantis.elastic
-- system.linux.system.repo.mcp.apt_mirantis.kibana
-- system.linux.system.repo.mcp.apt_mirantis.docker
-- system.heka.remote_collector.container
-- system.heka.remote_collector.input.amqp
-- system.heka.remote_collector.output.elasticsearch
-- system.heka.remote_collector.output.telegraf
-- system.elasticsearch.server.cluster
-- system.elasticsearch.server.curator
-- system.kibana.server.single
-- system.haproxy.proxy.listen.stacklight.elasticsearch
-- system.haproxy.proxy.listen.stacklight.kibana
-- system.haproxy.proxy.listen.stacklight.influxdb_relay
-- service.haproxy.proxy.single
-- system.influxdb.relay.cluster
-- system.influxdb.server.single
-- system.influxdb.database.stacklight
-- system.influxdb.database.ceilometer
-- system.keepalived.cluster.instance.prometheus_server_vip
-- system.telegraf.agent.remote
-- system.prometheus.server.remote_write.docker
-- system.prometheus.server.alertmanager.dns
-- system.prometheus.server.target.dns
-- system.docker.swarm.stack.monitoring.prometheus_global
-- system.docker.swarm.stack.monitoring.remote_collector
-- system.docker.swarm.stack.dashboard
-- cluster.virtual-mcp-pike-ovs
-parameters:
- _param:
- heka_amqp_host: ${_param:openstack_control_address}
- kibana_elasticsearch_host: ${_param:stacklight_monitor_address}
- keepalived_prometheus_vip_address: ${_param:stacklight_monitor_address}
- keepalived_prometheus_vip_password: 'password'
- keepalived_prometheus_vip_interface: ens4
- cluster_vip_address: ${_param:stacklight_monitor_address}
- cluster_local_address: ${_param:single_address}
- cluster_elasticsearch_port: 9200
- cluster_kibana_port: 5601
- cluster_node01_hostname: mon01
- cluster_node01_address: ${_param:stacklight_monitor_node01_address}
- cluster_node02_hostname: mon02
- cluster_node02_address: ${_param:stacklight_monitor_node02_address}
- cluster_node03_hostname: mon03
- cluster_node03_address: ${_param:stacklight_monitor_node03_address}
- docker_image_alertmanager: docker-prod-local.artifactory.mirantis.com/openstack-docker/alertmanager:${_param:apt_mk_version}
- docker_image_pushgateway: docker-prod-local.artifactory.mirantis.com/openstack-docker/pushgateway:${_param:apt_mk_version}
- docker_image_prometheus: docker-prod-local.artifactory.mirantis.com/openstack-docker/prometheus:${_param:apt_mk_version}
- docker_image_remote_agent: docker-prod-local.artifactory.mirantis.com/openstack-docker/telegraf:${_param:apt_mk_version}
- docker_image_remote_storage_adapter: docker-prod-local.artifactory.mirantis.com/openstack-docker/remote_storage_adapter:${_param:apt_mk_version}
- docker_image_remote_collector: docker-prod-local.artifactory.mirantis.com/openstack-docker/heka:${_param:apt_mk_version}
- docker_image_prometheus_relay: docker-prod-local.artifactory.mirantis.com/openstack-docker/prometheus_relay:${_param:apt_mk_version}
- docker_image_grafana: docker-prod-local.artifactory.mirantis.com/mirantis/external/grafana:${_param:apt_mk_version}
- influxdb_port: 8086
- influxdb_admin_password: password
- influxdb_stacklight_password: lmapass
- prometheus_influxdb_url: "http://${_param:stacklight_monitor_address}:${_param:influxdb_port}/"
- prometheus_influxdb_db: lma
- prometheus_influxdb_username: lma
- prometheus_influxdb_password: ${_param:influxdb_stacklight_password}
- remote_collector_telegraf_host: monitoring_remote_agent
- linux:
- network:
- interface:
- ens4:
- enabled: true
- type: eth
- proto: static
- address: ${_param:single_address}
- netmask: 255.255.255.0
diff --git a/classes/system b/classes/system
index 86e4aaa..d955008 160000
--- a/classes/system
+++ b/classes/system
@@ -1 +1 @@
-Subproject commit 86e4aaabf472ae168e50423dd5d510818713261b
+Subproject commit d9550082248816acf8be8937a11f968cd9da4618