Class: Chef::Knife::NodeEditor

Inherits:
Object
  • Object
show all
Defined in:
lib/chef/knife/core/node_editor.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(node, ui, config) ⇒ NodeEditor

Returns a new instance of NodeEditor.



30
31
32
# File 'lib/chef/knife/core/node_editor.rb', line 30

def initialize(node, ui, config)
  @node, @ui, @config = node, ui, config
end

Instance Attribute Details

#configObject (readonly)

Returns the value of attribute config.



28
29
30
# File 'lib/chef/knife/core/node_editor.rb', line 28

def config
  @config
end

#nodeObject (readonly)

Returns the value of attribute node.



26
27
28
# File 'lib/chef/knife/core/node_editor.rb', line 26

def node
  @node
end

#uiObject (readonly)

Returns the value of attribute ui.



27
28
29
# File 'lib/chef/knife/core/node_editor.rb', line 27

def ui
  @ui
end

Instance Method Details

#apply_updates(updated_data) ⇒ Object



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/chef/knife/core/node_editor.rb', line 63

def apply_updates(updated_data)
  # TODO: should warn/error/ask for confirmation when changing the
  # name, since this results in a new node, not an edited node.
  @updated_node = Node.new.tap do |n|
    n.name( updated_data["name"] )
    n.chef_environment( updated_data["chef_environment"] )
    n.run_list( updated_data["run_list"])
    n.normal_attrs = updated_data["normal"]

    if config[:all_attributes]
      n.default_attrs   = updated_data["default"]
      n.override_attrs  = updated_data["override"]
      n.automatic_attrs = updated_data["automatic"]
    else
      n.default_attrs   = node.default_attrs
      n.override_attrs  = node.override_attrs
      n.automatic_attrs = node.automatic_attrs
    end
  end
end

#edit_data(text) ⇒ Object



58
59
60
61
# File 'lib/chef/knife/core/node_editor.rb', line 58

def edit_data(text)
  edited_data = tempfile_for(text) {|filename| system("#{config[:editor]} #{filename}")}
  Chef::JSONCompat.from_json(edited_data)
end

#edit_nodeObject



34
35
36
37
38
39
40
41
# File 'lib/chef/knife/core/node_editor.rb', line 34

def edit_node
  abort "You specified the --no-editor option, nothing to edit" if config[:no_editor]
  assert_editor_set!

  updated_node_data = edit_data(view)
  apply_updates(updated_node_data)
  @updated_node
end

#updated?Boolean

Returns:

  • (Boolean)


84
85
86
87
88
89
90
91
92
93
# File 'lib/chef/knife/core/node_editor.rb', line 84

def updated?
  pristine_copy = Chef::JSONCompat.from_json(Chef::JSONCompat.to_json(node), :create_additions => false)
  updated_copy  = Chef::JSONCompat.from_json(Chef::JSONCompat.to_json(@updated_node), :create_additions => false)
  unless pristine_copy == updated_copy
    updated_properties = %w{name normal chef_environment run_list default override automatic}.reject do |key|
       pristine_copy[key] == updated_copy[key]
    end
  end
  ( pristine_copy != updated_copy ) && updated_properties
end

#viewObject



43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/chef/knife/core/node_editor.rb', line 43

def view
  result = {}
  result["name"] = node.name
  result["chef_environment"] = node.chef_environment
  result["normal"] = node.normal_attrs
  result["run_list"] = node.run_list

  if config[:all_attributes]
    result["default"]   = node.default_attrs
    result["override"]  = node.override_attrs
    result["automatic"] = node.automatic_attrs
  end
  Chef::JSONCompat.to_json_pretty(result)
end