Parent

OpenShift::Runtime::Manifest

Manifest is a wrapper class for cartridge manifests.

Wrapper speeds up access and provides fixed API

Constants

MAX_CARTRIDGE_NAME
MAX_VENDOR_NAME
TODO:

these should be configurable

RESERVED_CARTRIDGE_NAME_PATTERN
RESERVED_VENDOR_NAME_PATTERN
VALID_CARTRIDGE_NAME_PATTERN
VALID_VENDOR_NAME_PATTERN

When a cartridge is installed from a URL, we validate the vendor name by matching against VALID_VENDOR_NAME_PATTERN, and the cartridge name agasint VALID_CARTRIDGE_NAME_PATTERN. If it does not match the respective pattern, the cartridge will be rejected.

Attributes

cartridge_vendor[R]
cartridge_version[R]
categories[R]
compatible_versions[R]
directory[R]
endpoints[R]
install_build_required[R]
manifest[R]
manifest_path[R]
name[R]
repository_path[R]
short_name[R]
source_md5[R]
source_url[R]
version[R]
versions[R]

Public Class Methods

build_ident(vendor, software, software_version, cartridge_version) click to toggle source
# File lib/openshift-origin-common/models/manifest.rb, line 334
def self.build_ident(vendor, software, software_version, cartridge_version)
  vendor = vendor.gsub(/\s+/, '').downcase
  "#{vendor}:#{software}:#{software_version}:#{cartridge_version}"
end
manifest_from_yaml(yaml_str) click to toggle source
# File lib/openshift-origin-common/models/manifest.rb, line 63
def self.manifest_from_yaml(yaml_str)
  YAML.load(yaml_str, :safe => true)
end
new(manifest) → Cartridge click to toggle source
new(manifest, software_version) → Cartridge
new(manifest, software_version, repository_base_path) → Cartridge

Cartridge is a wrapper class for cartridge manifests

Cartridge.new('/var/lib/openshift/.cartridge_repository/php/1.0/metadata/manifest.yml', '3.5', '.../.cartridge_repository') -> Cartridge
Cartridge.new('Name: ...', '3.5') -> Cartridge
# File lib/openshift-origin-common/models/manifest.rb, line 212
def initialize(manifest, version=nil, type=:url, repository_base_path='', check_names=true)
  if type == :url
    @manifest = YAML.safe_load(manifest)
    @manifest_path = :url
  else
    @manifest = YAML.safe_load_file(manifest)
    @manifest_path = manifest
  end

  # Validate and use the provided version, defaulting to the manifest Version key
  raise MissingElementError.new(nil, 'Version') unless @manifest.has_key?('Version')
  raise InvalidElementError.new(nil, 'Versions') if @manifest.has_key?('Versions') && !@manifest['Versions'].kind_of?(Array)

  if @manifest.has_key?('Compatible-Versions') && !@manifest['Compatible-Versions'].kind_of?(Array)
    raise InvalidElementError.new(nil, 'Compatible-Versions')
  end

  @versions = raw_versions.collect do |v|
    valid_version_number(v) ? v : '0.0.0'
  end

  @cartridge_version =  @manifest['Cartridge-Version'].to_s
  unless valid_version_number(@cartridge_version)
    @cartridge_version = '0.0.0'
  end

  @compatible_versions = (@manifest['Compatible-Versions'] || []).collect do |v|
    valid_version_number(v.to_s) ? v.to_s : '0.0.0'
  end

  if version
    raise ArgumentError.new(
              "Unsupported version #{version} from #{versions} for #{@manifest['Name']}"
          ) unless versions.include?(version.to_s)

    @version = version.to_s
    @manifest['Version'] = @version
  else
    @version = @manifest['Version'].to_s
  end

  unless valid_version_number(@version)
    @version = '0.0.0'
  end

  # If version overrides are present, merge them on top of the manifest
  if @manifest.has_key?('Version-Overrides')
    vtree = @manifest['Version-Overrides'][@version]

    if vtree
      @manifest.merge!(vtree) 
    end
  end

  @cartridge_vendor       = @manifest['Cartridge-Vendor']
  @name                   = @manifest['Name']
  @short_name             = @manifest['Cartridge-Short-Name']
  @categories             = @manifest['Categories'] || []
  @is_deployable          = @categories.include?('web_framework')
  @is_web_proxy           = @categories.include?('web_proxy')
  @install_build_required = @manifest.has_key?('Install-Build-Required') ? @manifest['Install-Build-Required'] : false


  #FIXME: reinstate code after manifests are updated
  #raise MissingElementError.new(nil, 'Cartridge-Vendor') unless @cartridge_vendor
  #raise MissingElementError.new(nil, 'Cartridge-Version') unless @cartridge_version
  raise MissingElementError.new(nil, 'Cartridge-Short-Name') unless @short_name
  raise InvalidElementError.new(nil, 'Cartridge-Short-Name') if @short_name.include?('-')
  raise MissingElementError.new(nil, 'Name') unless @name

  if check_names
    validate_vendor_name
    validate_cartridge_name
    check_reserved_cartridge_name
  end

  if @manifest.has_key?('Source-Url')
    raise InvalidElementError.new(nil, 'Source-Url') unless @manifest['Source-Url'] =~ URI::ABS_URI
    @source_url = @manifest['Source-Url']
    @source_md5 = @manifest['Source-Md5']
  else
    raise MissingElementError.new('Source-Url is required in manifest to obtain cartridge via URL',
                                  'Source-Url') if :url == @manifest_path
  end

  @short_name.upcase!

  if @cartridge_vendor && @name && @cartridge_version
    @directory           = @name.downcase
    repository_directory = "#{@cartridge_vendor.gsub(/\s+/, '').downcase}-#{@name}"
    @repository_path     = PathUtils.join(repository_base_path, repository_directory, @cartridge_version)
  end

  @endpoints = Endpoint.parse(@short_name, @manifest, @categories)
end
parse_ident(ident) click to toggle source
# File lib/openshift-origin-common/models/manifest.rb, line 339
def self.parse_ident(ident)
  cooked = ident.split(':')
  raise ArgumentError.new("'#{ident}' is not a legal cartridge identifier") if 4 != cooked.size
  cooked
end
sort_versions(array) click to toggle source

Sort an array of "string" version numbers

# File lib/openshift-origin-common/models/manifest.rb, line 405
def self.sort_versions(array)
  results = []

  copy = Marshal.load(Marshal.dump(array))
  copy.delete_if {|v| v == '_'}
  copy.collect {|v| Gem::Version.new(v)}.sort.each do |version|
    results << version.to_s
  end

  results
end
valid_cartridge_name?(name) click to toggle source
# File lib/openshift-origin-common/models/manifest.rb, line 380
def self.valid_cartridge_name?(name)
  name =~ VALID_CARTRIDGE_NAME_PATTERN
end

Public Instance Methods

buildable?() click to toggle source

For now, these are synonyms

Alias for: deployable?
check_reserved_cartridge_name() click to toggle source
# File lib/openshift-origin-common/models/manifest.rb, line 390
def check_reserved_cartridge_name
  if name =~ RESERVED_CARTRIDGE_NAME_PATTERN
    raise InvalidElementError.new("'#{name}' is reserved.", 'Name')
  end
end
check_reserved_vendor_name() click to toggle source
# File lib/openshift-origin-common/models/manifest.rb, line 384
def check_reserved_vendor_name
  if cartridge_vendor =~ RESERVED_VENDOR_NAME_PATTERN
    raise InvalidElementError.new("'#{cartridge_vendor}' is reserved.", 'Cartridge-Vendor')
  end
end
deployable?() click to toggle source
# File lib/openshift-origin-common/models/manifest.rb, line 321
def deployable?
  @is_deployable
end
Also aliased as: web_framework?, buildable?
project_version_overrides(version, repository_base_path) click to toggle source
# File lib/openshift-origin-common/models/manifest.rb, line 400
def project_version_overrides(version, repository_base_path)
  Runtime::Manifest.new(manifest_path, version, :file, repository_base_path)
end
public_endpoints() click to toggle source

Convenience method which returns an array containing only those Endpoints which have a public_port_name specified.

# File lib/openshift-origin-common/models/manifest.rb, line 317
def public_endpoints
  @endpoints.select { |e| e.public_port_name }
end
raw_versions() click to toggle source

obtain all software versions covered in this manifest

# File lib/openshift-origin-common/models/manifest.rb, line 309
def raw_versions
  seed = (@manifest['Versions'] || []).map { |v| v.to_s }
  seed << @manifest['Version'].to_s
  seed.uniq
end
to_s() click to toggle source
# File lib/openshift-origin-common/models/manifest.rb, line 345
def to_s
  instance_variables.each_with_object('<Cartridge: ') do |v, a|
    a << "#{v}: #{instance_variable_get(v)} "
  end << ' >'
end
valid_version_number(version) click to toggle source
# File lib/openshift-origin-common/models/manifest.rb, line 396
def valid_version_number(version)
  version =~ /^\A(\d+\.*)+\Z/
end
validate_cartridge_name() click to toggle source
# File lib/openshift-origin-common/models/manifest.rb, line 367
def validate_cartridge_name
  if name !~ VALID_CARTRIDGE_NAME_PATTERN
    raise InvalidElementError.new(
      "'#{name}' does not match pattern #{VALID_CARTRIDGE_NAME_PATTERN.inspect}.",
      'Name'
    )
  end

  if name.length > MAX_CARTRIDGE_NAME
    raise InvalidElementError.new("'#{name}' must be no longer than #{MAX_VENDOR_NAME} characters.", 'Name')
  end
end
validate_vendor_name(check_reserved_name = false) click to toggle source
# File lib/openshift-origin-common/models/manifest.rb, line 351
def validate_vendor_name(check_reserved_name = false)
  if cartridge_vendor !~ VALID_VENDOR_NAME_PATTERN
    raise InvalidElementError.new(
      "'#{cartridge_vendor}' does not match pattern #{VALID_VENDOR_NAME_PATTERN.inspect}.",
      'Cartridge-Vendor'
    )
  end

  if cartridge_vendor.length > MAX_VENDOR_NAME
    raise InvalidElementError.new(
      "'#{cartridge_vendor}' must be no longer than #{MAX_VENDOR_NAME} characters.",
      'Cartridge-Vendor'
    )
  end
end
web_framework?() click to toggle source
Alias for: deployable?
web_proxy?() click to toggle source
# File lib/openshift-origin-common/models/manifest.rb, line 330
def web_proxy?
  @is_web_proxy
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.