Class: PuppetX::Puppetlabs::Migration::CatalogDeltaModel::CatalogDelta

Inherits:
Diff
  • Object
show all
Defined in:
lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb

Overview

Represents a delta between two catalogs

Instance Attribute Summary collapse

Attributes inherited from Diff

#diff_id

Instance Method Summary collapse

Methods inherited from DeltaEntity

from_hash

Methods included from ModelObject

#to_hash

Constructor Details

#initialize(baseline, preview, options, timestamp, excludes = EMPTY_ARRAY) ⇒ CatalogDelta

Creates a new delta between the two catalog hashes baseline and preview. The delta will be produced without considering differences in resource tagging if ignore_tags is set to ‘true`. The verbose flag controls whether or not attributes will be included in missing and added resources in the delta.

Parameters:

  • baseline (Hash<Symbol,Object>)

    the hash representing the baseline catalog

  • preview (Hash<Symbol,Object] the hash representing the preview catalog)

    review [Hash<Symbol,Object] the hash representing the preview catalog

  • options (Hash<Symbol,Object>)

    preview options

  • timestamp (String)

    when preview run began. In ISO 8601 format with 9 characters second-fragment

  • excludes (Array<Exclusion>) (defaults to: EMPTY_ARRAY)

    ] excludes,



562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 562

def initialize(baseline, preview, options, timestamp, excludes = EMPTY_ARRAY)
  excludes_per_type = {}
  (Exclude::DEFAULT_EXCLUSIONS + excludes).each do |ex|
    type = ex.type.downcase
    ex_for_type = (excludes_per_type[type] ||= [])
    ex_for_type << ex
  end

  @produced_by      = 'puppet preview 3.8.0'
  @timestamp        = timestamp
  @baseline_catalog = options[:baseline_catalog]
  @preview_catalog  = options[:preview_catalog]
  @node_name        = options[:node]
  @tags_ignored     = options[:skip_tags]
  @string_numeric_diff_ignored = options[:migration_checker] && !options[:diff_string_numeric]

  baseline = assert_type(Hash, baseline, {})
  preview = assert_type(Hash, preview, {})

  @baseline_env     = baseline['environment']
  @preview_env      = preview['environment']
  @version_equal    = baseline['version'] == preview['version']

  baseline_resources = create_resources(baseline, excludes_per_type)
  @baseline_resource_count = baseline_resources.size


  preview_resources = create_resources(preview, excludes_per_type)
  @preview_resource_count = preview_resources.size

  @added_resources = preview_resources.reject { |key,_| baseline_resources.include?(key) }.values
  @added_resource_count = @added_resources.size
  @added_attribute_count = @added_resources.inject(0) { |count, r| count + r.attributes.size }

  @missing_resources = baseline_resources.reject { |key,_| preview_resources.include?(key) }.values
  @missing_resource_count = @missing_resources.size
  @missing_attribute_count = @missing_resources.inject(0) { |count, r| count + r.attributes.size }

  @equal_resource_count = 0
  @equal_attribute_count = 0
  @conflicting_attribute_count = 0

  @conflicting_resources = []
  baseline_resources.each_pair do |key,br|
    pr = preview_resources[key]
    next if pr.nil?
    conflict = create_resource_conflict(br, pr)
    if conflict.nil?
      # Resources are equal
      @equal_resource_count += 1
      @equal_attribute_count += br.attributes.size
    else
      @conflicting_resources << conflict
      @equal_attribute_count += conflict.equal_attribute_count
      @conflicting_attribute_count += conflict.conflicting_attributes.size
      @added_attribute_count += conflict.added_attributes.size
      @missing_attribute_count += conflict.missing_attributes.size
    end
  end
  @conflicting_resource_count = @conflicting_resources.size

  baseline_edges = create_edges(baseline, excludes_per_type)
  @baseline_edge_count = baseline_edges.size

  preview_edges = create_edges(preview, excludes_per_type)
  @preview_edge_count = preview_edges.size

  @added_edges = preview_edges.reject { |edge| baseline_edges.include?(edge) }
  @added_edge_count = @added_edges.size
  @missing_edges = baseline_edges.reject { |edge| preview_edges.include?(edge) }
  @missing_edge_count = @missing_edges.size

  @preview_compliant = @missing_resources.empty? && @missing_edges.empty? && @conflicting_resources.all? { |cr| cr.compliant? }
  @preview_equal = @preview_compliant && @conflicting_resources.empty? && @added_resources.empty? && @added_edges.empty?

  unless options[:verbose_diff]
    # Clear attributes in the added and missing resources array
    @added_resources.each { |r| r.clear_attributes }
    @missing_resources.each { |r| r.clear_attributes }
  end

  assign_ids(1)
end

Instance Attribute Details

#added_attribute_countObject (readonly)



479
480
481
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 479

def added_attribute_count
  @added_attribute_count
end

#added_edge_countObject (readonly)



464
465
466
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 464

def added_edge_count
  @added_edge_count
end

#added_edgesObject (readonly)



524
525
526
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 524

def added_edges
  @added_edges
end

#added_resource_countInteger (readonly)

Returns total number of resource attributes added in preview.

Returns:

  • (Integer)

    total number of resource attributes added in preview



449
450
451
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 449

def added_resource_count
  @added_resource_count
end

#added_resourcesObject (readonly)



509
510
511
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 509

def added_resources
  @added_resources
end

#baseline_catalogString (readonly)

Returns the file name of the preview catalog.

Returns:

  • (String)

    the file name of the preview catalog



539
540
541
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 539

def baseline_catalog
  @baseline_catalog
end

#baseline_edge_countObject (readonly)



494
495
496
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 494

def baseline_edge_count
  @baseline_edge_count
end

#baseline_envObject (readonly)



394
395
396
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 394

def baseline_env
  @baseline_env
end

#baseline_resource_countObject (readonly)



434
435
436
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 434

def baseline_resource_count
  @baseline_resource_count
end

#conflicting_attribute_countObject (readonly)



489
490
491
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 489

def conflicting_attribute_count
  @conflicting_attribute_count
end

#conflicting_resource_countInteger (readonly)

Returns total number of resource attributes in conflict between baseline and preview.

Returns:

  • (Integer)

    total number of resource attributes in conflict between baseline and preview



459
460
461
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 459

def conflicting_resource_count
  @conflicting_resource_count
end

#conflicting_resourcesObject (readonly)



514
515
516
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 514

def conflicting_resources
  @conflicting_resources
end

#equal_attribute_countObject (readonly)



474
475
476
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 474

def equal_attribute_count
  @equal_attribute_count
end

#equal_resource_countInteger (readonly)

Returns total number of attributes that are equal between baseline and preview.

Returns:

  • (Integer)

    total number of attributes that are equal between baseline and preview



444
445
446
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 444

def equal_resource_count
  @equal_resource_count
end

#missing_attribute_countObject (readonly)



484
485
486
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 484

def missing_attribute_count
  @missing_attribute_count
end

#missing_edge_countObject (readonly)



469
470
471
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 469

def missing_edge_count
  @missing_edge_count
end

#missing_edgesObject (readonly)



519
520
521
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 519

def missing_edges
  @missing_edges
end

#missing_resource_countInteger (readonly)

Returns total number of resource attributes only present in baseline.

Returns:

  • (Integer)

    total number of resource attributes only present in baseline



454
455
456
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 454

def missing_resource_count
  @missing_resource_count
end

#missing_resourcesObject (readonly)



504
505
506
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 504

def missing_resources
  @missing_resources
end

#node_nameObject (readonly)



549
550
551
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 549

def node_name
  @node_name
end

#preview_catalogObject (readonly)



544
545
546
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 544

def preview_catalog
  @preview_catalog
end

#preview_edge_countObject (readonly)



499
500
501
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 499

def preview_edge_count
  @preview_edge_count
end

#preview_envObject (readonly)



399
400
401
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 399

def preview_env
  @preview_env
end

#preview_resource_countObject (readonly)



439
440
441
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 439

def preview_resource_count
  @preview_resource_count
end

#produced_byObject (readonly)



529
530
531
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 529

def produced_by
  @produced_by
end

#timestampObject (readonly)



534
535
536
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 534

def timestamp
  @timestamp
end

Instance Method Details

#assign_ids(start) ⇒ Object



663
664
665
666
667
668
669
670
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 663

def assign_ids(start)
  start = 1
  start = assign_ids_on_each(start, added_resources)
  start = assign_ids_on_each(start, missing_resources)
  start = assign_ids_on_each(start, conflicting_resources)
  start = assign_ids_on_each(start, added_edges)
  assign_ids_on_each(start, missing_edges)
end

#compliant?(bav, pav) ⇒ Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Answers the question, is bav and pav compliant? Sets are compliant if pav is a subset of bav Arrays are compliant if pav contains all non unique values in bav. Order is insignificant Hashes are compliant if pav has at least the same set of keys as bav, and the values are compliant All other values are compliant if the values are equal

Parameters:

  • bav (Object)

    value of baseline attribute

  • pav (Object)

    value of preview attribute

Returns:

  • (Boolean)

    the result of the comparison



767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 767

def compliant?(bav, pav)
  if bav.is_a?(Set) && pav.is_a?(Set)
    bav.subset?(pav)
  elsif bav.is_a?(Array) && pav.is_a?(Array)
    return false if pav.size < bav.size
    cp = pav.clone
    bav.each do |be|
      ix = cp.index(be)
      return false if ix.nil?
      cp.delete_at(ix)
    end
    true
  elsif bav.is_a?(Hash) && pav.is_a?(Hash)
    # Double negation here since Hash doesn't have an all? method
    !bav.any? {|k,v| !(pav.include?(k) && compliant?(v, pav[k])) }
  else
    values_equal?(bav, pav)
  end
end

#initialize_from_hash(hash) ⇒ Object



646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 646

def initialize_from_hash(hash)
  hash.each_pair do |k, v|
    k = :"@#{k}"
    instance_variable_set(k,
      case k
      when :@added_resources, :@missing_resources
        v.map { |rh| Resource.from_hash(rh) }
      when :@conflicting_resources
        v.map { |rh| ResourceConflict.from_hash(rh) }
      when :@added_edges, :@missing_edges
        v.map { |rh| Edge.from_hash(rh) }
      else
        v
      end)
  end
end

#preview_compliant?Boolean

Returns ‘true` if preview is compliant with baseline.

Returns:

  • (Boolean)

    ‘true` if preview is compliant with baseline



415
416
417
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 415

def preview_compliant?
  @preview_compliant
end

#preview_equal?Boolean

Returns ‘true` if preview is equal to baseline.

Returns:

  • (Boolean)

    ‘true` if preview is equal to baseline



421
422
423
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 421

def preview_equal?
  @preview_equal
end

#string_numeric_diff_ignored?Boolean

Returns ‘true` if string/numeric diffs were ignored when comparing resources.

Returns:

  • (Boolean)

    ‘true` if string/numeric diffs were ignored when comparing resources



409
410
411
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 409

def string_numeric_diff_ignored?
  @string_numeric_diff_ignored
end

#tags_ignored?Boolean

Returns ‘true` if tags are ignored when comparing resources.

Returns:

  • (Boolean)

    ‘true` if tags are ignored when comparing resources



403
404
405
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 403

def tags_ignored?
  @tags_ignored
end

#version_equal?Boolean

Returns ‘true` if baseline version is equal to preview version.

Returns:

  • (Boolean)

    ‘true` if baseline version is equal to preview version



427
428
429
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 427

def version_equal?
  @version_equal
end