Skip to content

Commit

Permalink
Merge pull request #1020 from cfchase/osp-float-warning
Browse files Browse the repository at this point in the history
Validate no other hosts on OpenStack's overcloud_float_net
  • Loading branch information
jmontleon committed Jul 11, 2016
2 parents 9c3a5be + aa2c301 commit 0ec6838
Show file tree
Hide file tree
Showing 6 changed files with 212 additions and 75 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -88,11 +88,14 @@ def validate
@deployment.valid?
error_messages = @deployment.errors.full_messages
error_messages += @deployment.openstack_deployment.errors.full_messages if @deployment.deploy_openstack?
warning_messages = @deployment.warnings
warning_messages += @deployment.openstack_deployment.warnings if @deployment.deploy_openstack?

render json: {
:validation => {
:deployment_id => @deployment.id,
:errors => error_messages,
:warnings => @deployment.warnings
:warnings => warning_messages
}
}
end
Expand Down
53 changes: 45 additions & 8 deletions server/app/lib/fusor/validators/openstack_deployment_validator.rb
Original file line number Diff line number Diff line change
@@ -1,29 +1,32 @@
require 'ip'

module Fusor
module Validators
class OpenstackDeploymentValidator < ActiveModel::Validator

def validate(openstack_deployment)
validate_overcloud openstack_deployment
validate_ceph openstack_deployment if openstack_deployment.external_ceph_storage
validate_ceph openstack_deployment
validate_network openstack_deployment
end

private

def validate_overcloud(openstack_deployment)
if openstack_deployment.undercloud_admin_password.empty?
openstack_deployment.errors[:undercloud_password] << _('Openstack deployments must specify an admin password for the Undercloud')
openstack_deployment.errors[:undercloud_admin_password] << _('Openstack deployments must specify an admin password for the Undercloud')
end

if openstack_deployment.undercloud_ip_address.empty?
openstack_deployment.errors[:undercloud_ip_addr] << _('Openstack deployments must specify an ip address for the Undercloud')
openstack_deployment.errors[:undercloud_ip_address] << _('Openstack deployments must specify an ip address for the Undercloud')
end

if openstack_deployment.undercloud_ssh_username.empty?
openstack_deployment.errors[:undercloud_user] << _('Openstack deployments must specify an ssh user for the Undercloud')
openstack_deployment.errors[:undercloud_ssh_username] << _('Openstack deployments must specify an ssh user for the Undercloud')
end

if openstack_deployment.undercloud_ssh_password.empty?
openstack_deployment.errors[:undercloud_user_password] << _('Openstack deployments must specify an ssh password for the Undercloud')
openstack_deployment.errors[:undercloud_ssh_password] << _('Openstack deployments must specify an ssh password for the Undercloud')
end

if openstack_deployment.overcloud_deployed?
Expand All @@ -43,7 +46,7 @@ def validate_overcloud(openstack_deployment)
end

if openstack_deployment.overcloud_float_net.empty?
openstack_deployment.errors[:overcloud_password] << _('Openstack deployments must specify a floating network for the Overcloud')
openstack_deployment.errors[:overcloud_float_net] << _('Openstack deployments must specify a floating network for the Overcloud')
end

if openstack_deployment.overcloud_float_gateway.empty?
Expand All @@ -55,15 +58,15 @@ def validate_overcloud(openstack_deployment)
end

if openstack_deployment.overcloud_compute_count.nil? || openstack_deployment.overcloud_compute_count < 1
openstack_deployment.errors[:overcloud_compute_flavor] << _('Openstack deployments must have at least 1 Compute node for the Overcloud')
openstack_deployment.errors[:overcloud_compute_count] << _('Openstack deployments must have at least 1 Compute node for the Overcloud')
end

if openstack_deployment.overcloud_controller_flavor.empty?
openstack_deployment.errors[:overcloud_controller_flavor] << _('Openstack deployments must have a Controller flavor for the Overcloud')
end

if openstack_deployment.overcloud_controller_count.nil? || openstack_deployment.overcloud_controller_count < 1
openstack_deployment.errors[:overcloud_compute_flavor] << _('Openstack deployments must have at least 1 Controller node for the Overcloud')
openstack_deployment.errors[:overcloud_controller_count] << _('Openstack deployments must have at least 1 Controller node for the Overcloud')
end

if openstack_deployment.overcloud_ceph_storage_flavor.empty?
Expand Down Expand Up @@ -92,6 +95,8 @@ def validate_overcloud(openstack_deployment)
end

def validate_ceph(openstack_deployment)
return unless openstack_deployment.external_ceph_storage

if openstack_deployment.ceph_ext_mon_host.empty?
openstack_deployment.errors[:ceph_ext_mon_host] << _('Openstack deployment is missing external host address for external Ceph Storage')
end
Expand Down Expand Up @@ -120,6 +125,38 @@ def validate_ceph(openstack_deployment)
openstack_deployment.errors[:glance_rbd_pool_name] << _('Openstack deployment is missing the Glance RBD pool name for external Ceph Storage')
end
end

def validate_network(openstack_deployment)
return unless openstack_deployment.deploy_cfme?

float_sn = get_ip(openstack_deployment.overcloud_float_net)
return unless float_sn

conflict_found = Host.all.any? do |host|
ip = get_ip(host.ip)
ip && ip.is_in?(float_sn)
end

if conflict_found
warning = "You already have hosts with addresses on the floating IP subnet #{float_sn} for this deployment. "\
"If you proceed and a VM is assigned a conflicting IP address by OpenStack your deployment will fail."
add_warning(openstack_deployment, warning)
end
end

def get_ip(ip_str)
begin
IP.new(ip_str)
rescue ArgumentError
nil
end
end

def add_warning(openstack_deployment, warning, other_info = '')
openstack_deployment.warnings << warning
full_warning = other_info.blank? ? warning : "#{warning} #{other_info}"
Rails.logger.warn("#{full_warning}")
end
end
end
end
10 changes: 10 additions & 0 deletions server/app/models/fusor/openstack_deployment.rb
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,19 @@ class OpenstackDeployment < ActiveRecord::Base
glance_rbd_pool_name: 'GlanceRbdPoolName'
}

attr_accessor :warnings

after_initialize :setup_warnings
validates_with Fusor::Validators::OpenstackDeploymentValidator, on: :update

has_one :deployment, :class_name => "Fusor::Deployment"

def setup_warnings
self.warnings = []
end

def deploy_cfme?
deployment && deployment.deploy_cfme && deployment.cfme_install_loc == 'OpenStack'
end
end
end
4 changes: 3 additions & 1 deletion server/test/fixtures/fusor_deployments.yml
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,8 @@ osp:
upstream_consumer_uuid: 1
organization_id: 1
deploy_openstack: true
deploy_cfme: false
deploy_cfme: true
deploy_rhev: false
cfme_root_password: redhat1234
cfme_install_loc: OpenStack
openstack_deployment: osp
8 changes: 8 additions & 0 deletions server/test/fixtures/hosts.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,11 @@ engine2:

engine3:
name: engine3

managed_host1:
name: managed1
type: 'Host::Managed'

managed_host2:
name: managed2
type: 'Host::Managed'

0 comments on commit 0ec6838

Please sign in to comment.