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,



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
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 586

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.include?(:skip_tags) ? options[:skip_tags] : false

  if options[:migration_checker]
    @string_numeric_diff_ignored = options.include?(:diff_string_numeric) ? !options[:diff_string_numeric] : true
    @array_value_diff_ignored = options.include?(:diff_array_value) ? !options[:diff_array_value] : false
  else
    @string_numeric_diff_ignored = false
    @array_value_diff_ignored = false
  end

  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] == true
    # Clear attributes in the added and missing resources array
    @added_resources.each { |r| r.clear_attributes }
    @missing_resources.each { |r| r.clear_attributes }
  else
    @added_resources.each { |r| r.finish_attributes }
    @missing_resources.each { |r| r.finish_attributes }
  end
  @conflicting_resources.each { |r| r.finish_attributes }

  assign_ids(1)
end

Instance Attribute Details

#added_attribute_countObject (readonly)



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

def added_attribute_count
  @added_attribute_count
end

#added_edge_countObject (readonly)



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

def added_edge_count
  @added_edge_count
end

#added_edgesObject (readonly)



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

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



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

def added_resource_count
  @added_resource_count
end

#added_resourcesObject (readonly)



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

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



563
564
565
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 563

def baseline_catalog
  @baseline_catalog
end

#baseline_edge_countObject (readonly)



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

def baseline_edge_count
  @baseline_edge_count
end

#baseline_envObject (readonly)



412
413
414
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 412

def baseline_env
  @baseline_env
end

#baseline_resource_countObject (readonly)



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

def baseline_resource_count
  @baseline_resource_count
end

#conflicting_attribute_countObject (readonly)



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

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



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

def conflicting_resource_count
  @conflicting_resource_count
end

#conflicting_resourcesObject (readonly)



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

def conflicting_resources
  @conflicting_resources
end

#equal_attribute_countObject (readonly)



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

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



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

def equal_resource_count
  @equal_resource_count
end

#missing_attribute_countObject (readonly)



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

def missing_attribute_count
  @missing_attribute_count
end

#missing_edge_countObject (readonly)



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

def missing_edge_count
  @missing_edge_count
end

#missing_edgesObject (readonly)



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

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



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

def missing_resource_count
  @missing_resource_count
end

#missing_resourcesObject (readonly)



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

def missing_resources
  @missing_resources
end

#node_nameObject (readonly)



573
574
575
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 573

def node_name
  @node_name
end

#preview_catalogObject (readonly)



568
569
570
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 568

def preview_catalog
  @preview_catalog
end

#preview_edge_countObject (readonly)



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

def preview_edge_count
  @preview_edge_count
end

#preview_envObject (readonly)



417
418
419
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 417

def preview_env
  @preview_env
end

#preview_resource_countObject (readonly)



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

def preview_resource_count
  @preview_resource_count
end

#produced_byObject (readonly)



553
554
555
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 553

def produced_by
  @produced_by
end

#timestampObject (readonly)



558
559
560
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 558

def timestamp
  @timestamp
end

Instance Method Details

#array_value_diff_ignored?Boolean

Returns ‘true` if array/value diffs were ignored when comparing resources.

Returns:

  • (Boolean)

    ‘true` if array/value diffs were ignored when comparing resources



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

def array_value_diff_ignored?
  @array_value_diff_ignored
end

#assign_ids(start) ⇒ Object



698
699
700
701
702
703
704
705
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 698

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



812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 812

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



681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 681

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



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

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



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

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



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

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



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

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



451
452
453
# File 'lib/puppet_x/puppetlabs/migration/catalog_delta_model.rb', line 451

def version_equal?
  @version_equal
end