Bug #13435
openWindows fact import fails with: Can't add or remove `.` from identifier
Description
Hi,
we have a problem with empty fact fields in some foreman views. If you go to the facts area, you see all the facts filled with values but if you go to the dashboard or to the host page there are only empty fields.
This is a problem because we need these fields through api calls for further actions.
The attached screenshots shows an example of one host. If you need further details please ask.
Best regards
Files
Updated by Ivan Necas almost 9 years ago
- Project changed from foreman-tasks to Foreman
- Category set to Facts
Updated by Dominic Cleal almost 9 years ago
- Status changed from New to Need more information
It's likely that the facts import is failing, please provide the contents of /var/log/foreman/production.log while running the config management agent (Puppet, Salt, Chef, whatever you're using).
Updated by Marcus Asshauer almost 9 years ago
Hi,
here is the error message. The real hostname is cleared. We are using puppet 3.8.5 on windows.
2016-01-27T22:34:59 [app] [I] Started POST "/api/hosts/facts" for 172.17.0.31 at 2016-01-27 22:34:59 +0100 2016-01-27T22:34:59 [app] [I] Processing by Api::V2::HostsController#facts as JSON 2016-01-27T22:34:59 [app] [I] Parameters: {"facts"=>"[FILTERED]", "name"=>"$HOSTNAME$", "certname"=>"$HOSTNAME$", "apiv"=>"v2", :host=>{"name"=>"$HOSTNAME$", "cert name"=>"$HOSTNAME$"}} 2016-01-27T22:35:00 [app] [I] Import facts for '$HOSTNAME$' completed. Added: 62, Updated: 0, Deleted 0 facts 2016-01-27T22:35:00 [app] [W] Action failed | ActiveRecord::RecordInvalid: Validation failed: Identifier Can't add or remove `.` from identifier | /usr/share/foreman/vendor/ruby/1.9.1/gems/activerecord-3.2.21/lib/active_record/validations.rb:56:in `save!' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activerecord-3.2.21/lib/active_record/attribute_methods/dirty.rb:33:in `save!' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activerecord-3.2.21/lib/active_record/transactions.rb:264:in `block in save!' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activerecord-3.2.21/lib/active_record/transactions.rb:313:in `block in with_transaction_returning_status' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activerecord-3.2.21/lib/active_record/connection_adapters/abstract/database_statements.rb:192:in `transaction' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activerecord-3.2.21/lib/active_record/transactions.rb:208:in `transaction' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activerecord-3.2.21/lib/active_record/transactions.rb:311:in `with_transaction_returning_status' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activerecord-3.2.21/lib/active_record/transactions.rb:264:in `save!' | /usr/share/foreman/app/models/host/base.rb:168:in `set_interfaces' | /usr/share/foreman/app/models/host/base.rb:148:in `populate_fields_from_facts' | /usr/share/foreman/app/models/host/managed.rb:525:in `populate_fields_from_facts' | /usr/share/foreman/app/models/host/base.rb:124:in `import_facts' | /usr/share/foreman/app/models/host/managed.rb:516:in `import_host_and_facts' | /usr/share/foreman/app/controllers/api/v2/hosts_controller.rb:229:in `facts' | /usr/share/foreman/vendor/ruby/1.9.1/gems/actionpack-3.2.21/lib/action_controller/metal/implicit_render.rb:4:in `send_action' | /usr/share/foreman/vendor/ruby/1.9.1/gems/actionpack-3.2.21/lib/abstract_controller/base.rb:167:in `process_action' | /usr/share/foreman/vendor/ruby/1.9.1/gems/actionpack-3.2.21/lib/action_controller/metal/rendering.rb:10:in `process_action' | /usr/share/foreman/vendor/ruby/1.9.1/gems/actionpack-3.2.21/lib/abstract_controller/callbacks.rb:18:in `block in process_action' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activesupport-3.2.21/lib/active_support/callbacks.rb:518:in `block (5 levels) in _run__694125201084166110__process_action__2912110175458462536__callbacks' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activesupport-3.2.21/lib/active_support/callbacks.rb:215:in `block in _conditional_callback_around_8161' | /usr/share/foreman/app/controllers/api/v2/base_controller.rb:151:in `disable_json_root' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activesupport-3.2.21/lib/active_support/callbacks.rb:214:in `_conditional_callback_around_8161' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activesupport-3.2.21/lib/active_support/callbacks.rb:495:in `block (4 levels) in _run__694125201084166110__process_action__2912110175458462536__callbacks' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activesupport-3.2.21/lib/active_support/callbacks.rb:215:in `block in _conditional_callback_around_8160' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activesupport-3.2.21/lib/active_support/callbacks.rb:326:in `around' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activesupport-3.2.21/lib/active_support/callbacks.rb:310:in `_callback_around_2668' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activesupport-3.2.21/lib/active_support/callbacks.rb:214:in `_conditional_callback_around_8160' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activesupport-3.2.21/lib/active_support/callbacks.rb:483:in `block (3 levels) in _run__694125201084166110__process_action__2912110175458462536__callbacks' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activesupport-3.2.21/lib/active_support/callbacks.rb:215:in `block in _conditional_callback_around_8159' | /usr/share/foreman/app/controllers/concerns/application_shared.rb:13:in `set_timezone' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activesupport-3.2.21/lib/active_support/callbacks.rb:214:in `_conditional_callback_around_8159' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activesupport-3.2.21/lib/active_support/callbacks.rb:482:in `block (2 levels) in _run__694125201084166110__process_action__2912110175458462536__callbacks' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activesupport-3.2.21/lib/active_support/callbacks.rb:215:in `block in _conditional_callback_around_8158' | /usr/share/foreman/app/models/concerns/foreman/thread_session.rb:32:in `clear_thread' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activesupport-3.2.21/lib/active_support/callbacks.rb:214:in `_conditional_callback_around_8158' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activesupport-3.2.21/lib/active_support/callbacks.rb:437:in `block in _run__694125201084166110__process_action__2912110175458462536__callbacks' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activesupport-3.2.21/lib/active_support/callbacks.rb:215:in `block in _conditional_callback_around_8157' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activesupport-3.2.21/lib/active_support/callbacks.rb:326:in `around' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activesupport-3.2.21/lib/active_support/callbacks.rb:310:in `_callback_around_13' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activesupport-3.2.21/lib/active_support/callbacks.rb:214:in `_conditional_callback_around_8157' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activesupport-3.2.21/lib/active_support/callbacks.rb:403:in `_run__694125201084166110__process_action__2912110175458462536__callbacks' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activesupport-3.2.21/lib/active_support/callbacks.rb:405:in `__run_callback' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activesupport-3.2.21/lib/active_support/callbacks.rb:385:in `_run_process_action_callbacks' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activesupport-3.2.21/lib/active_support/callbacks.rb:81:in `run_callbacks' | /usr/share/foreman/vendor/ruby/1.9.1/gems/actionpack-3.2.21/lib/abstract_controller/callbacks.rb:17:in `process_action' | /usr/share/foreman/vendor/ruby/1.9.1/gems/actionpack-3.2.21/lib/action_controller/metal/rescue.rb:29:in `process_action' | /usr/share/foreman/vendor/ruby/1.9.1/gems/actionpack-3.2.21/lib/action_controller/metal/instrumentation.rb:30:in `block in process_action' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activesupport-3.2.21/lib/active_support/notifications.rb:123:in `block in instrument' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activesupport-3.2.21/lib/active_support/notifications/instrumenter.rb:20:in `instrument' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activesupport-3.2.21/lib/active_support/notifications.rb:123:in `instrument' | /usr/share/foreman/vendor/ruby/1.9.1/gems/actionpack-3.2.21/lib/action_controller/metal/instrumentation.rb:29:in `process_action' | /usr/share/foreman/vendor/ruby/1.9.1/gems/actionpack-3.2.21/lib/action_controller/metal/params_wrapper.rb:207:in `process_action' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activerecord-3.2.21/lib/active_record/railties/controller_runtime.rb:18:in `process_action' | /usr/share/foreman/vendor/ruby/1.9.1/gems/actionpack-3.2.21/lib/abstract_controller/base.rb:121:in `process' | /usr/share/foreman/vendor/ruby/1.9.1/gems/actionpack-3.2.21/lib/abstract_controller/rendering.rb:45:in `process' | /usr/share/foreman/vendor/ruby/1.9.1/gems/actionpack-3.2.21/lib/action_controller/metal.rb:203:in `dispatch' | /usr/share/foreman/vendor/ruby/1.9.1/gems/actionpack-3.2.21/lib/action_controller/metal/rack_delegation.rb:14:in `dispatch' | /usr/share/foreman/vendor/ruby/1.9.1/gems/actionpack-3.2.21/lib/action_controller/metal.rb:246:in `block in action' | /usr/share/foreman/vendor/ruby/1.9.1/gems/actionpack-3.2.21/lib/action_dispatch/routing/route_set.rb:73:in `call' | /usr/share/foreman/vendor/ruby/1.9.1/gems/actionpack-3.2.21/lib/action_dispatch/routing/route_set.rb:73:in `dispatch' | /usr/share/foreman/vendor/ruby/1.9.1/gems/actionpack-3.2.21/lib/action_dispatch/routing/route_set.rb:36:in `call' | /usr/share/foreman/vendor/ruby/1.9.1/gems/actionpack-3.2.21/lib/action_dispatch/routing/mapper.rb:43:in `call' | /usr/share/foreman/vendor/ruby/1.9.1/gems/journey-1.0.4/lib/journey/router.rb:68:in `block in call' | /usr/share/foreman/vendor/ruby/1.9.1/gems/journey-1.0.4/lib/journey/router.rb:56:in `each' | /usr/share/foreman/vendor/ruby/1.9.1/gems/journey-1.0.4/lib/journey/router.rb:56:in `call' | /usr/share/foreman/vendor/ruby/1.9.1/gems/actionpack-3.2.21/lib/action_dispatch/routing/route_set.rb:608:in `call' | /usr/share/foreman/vendor/ruby/1.9.1/gems/apipie-rails-0.2.6/lib/apipie/extractor/recorder.rb:97:in `call' | /usr/share/foreman/vendor/ruby/1.9.1/gems/apipie-rails-0.2.6/lib/apipie/middleware/checksum_in_headers.rb:27:in `call' | /usr/share/foreman/vendor/ruby/1.9.1/gems/actionpack-3.2.21/lib/action_dispatch/middleware/best_standards_support.rb:17:in `call' | /usr/share/foreman/vendor/ruby/1.9.1/gems/rack-1.4.7/lib/rack/etag.rb:23:in `call' | /usr/share/foreman/vendor/ruby/1.9.1/gems/rack-1.4.7/lib/rack/conditionalget.rb:35:in `call' | /usr/share/foreman/vendor/ruby/1.9.1/gems/actionpack-3.2.21/lib/action_dispatch/middleware/head.rb:14:in `call' | /usr/share/foreman/vendor/ruby/1.9.1/gems/actionpack-3.2.21/lib/action_dispatch/middleware/params_parser.rb:21:in `call' | /usr/share/foreman/lib/middleware/catch_json_parse_errors.rb:9:in `call' | /usr/share/foreman/vendor/ruby/1.9.1/gems/actionpack-3.2.21/lib/action_dispatch/middleware/flash.rb:242:in `call' | /usr/share/foreman/vendor/ruby/1.9.1/gems/rack-1.4.7/lib/rack/session/abstract/id.rb:210:in `context' | /usr/share/foreman/vendor/ruby/1.9.1/gems/rack-1.4.7/lib/rack/session/abstract/id.rb:205:in `call' | /usr/share/foreman/vendor/ruby/1.9.1/gems/actionpack-3.2.21/lib/action_dispatch/middleware/cookies.rb:341:in `call' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activerecord-3.2.21/lib/active_record/query_cache.rb:64:in `call' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activerecord-3.2.21/lib/active_record/connection_adapters/abstract/connection_pool.rb:479:in `call' | /usr/share/foreman/vendor/ruby/1.9.1/gems/actionpack-3.2.21/lib/action_dispatch/middleware/callbacks.rb:28:in `block in call' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activesupport-3.2.21/lib/active_support/callbacks.rb:405:in `_run__2571137705120427849__call__2942009808983377772__callbacks' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activesupport-3.2.21/lib/active_support/callbacks.rb:405:in `__run_callback' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activesupport-3.2.21/lib/active_support/callbacks.rb:385:in `_run_call_callbacks' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activesupport-3.2.21/lib/active_support/callbacks.rb:81:in `run_callbacks' | /usr/share/foreman/vendor/ruby/1.9.1/gems/actionpack-3.2.21/lib/action_dispatch/middleware/callbacks.rb:27:in `call' | /usr/share/foreman/vendor/ruby/1.9.1/gems/actionpack-3.2.21/lib/action_dispatch/middleware/remote_ip.rb:31:in `call' | /usr/share/foreman/vendor/ruby/1.9.1/gems/actionpack-3.2.21/lib/action_dispatch/middleware/debug_exceptions.rb:16:in `call' | /usr/share/foreman/vendor/ruby/1.9.1/gems/actionpack-3.2.21/lib/action_dispatch/middleware/show_exceptions.rb:56:in `call' | /usr/share/foreman/vendor/ruby/1.9.1/gems/railties-3.2.21/lib/rails/rack/logger.rb:32:in `call_app' | /usr/share/foreman/vendor/ruby/1.9.1/gems/railties-3.2.21/lib/rails/rack/logger.rb:18:in `call' | /usr/share/foreman/vendor/ruby/1.9.1/gems/actionpack-3.2.21/lib/action_dispatch/middleware/request_id.rb:22:in `call' | /usr/share/foreman/vendor/ruby/1.9.1/gems/rack-1.4.7/lib/rack/methodoverride.rb:21:in `call' | /usr/share/foreman/vendor/ruby/1.9.1/gems/rack-1.4.7/lib/rack/runtime.rb:17:in `call' | /usr/share/foreman/vendor/ruby/1.9.1/gems/activesupport-3.2.21/lib/active_support/cache/strategy/local_cache.rb:72:in `call' | /usr/share/foreman/vendor/ruby/1.9.1/gems/rack-1.4.7/lib/rack/lock.rb:15:in `call' | /usr/share/foreman/vendor/ruby/1.9.1/gems/actionpack-3.2.21/lib/action_dispatch/middleware/static.rb:83:in `call' | /usr/share/foreman/vendor/ruby/1.9.1/gems/rack-cache-1.2/lib/rack/cache/context.rb:136:in `forward' | /usr/share/foreman/vendor/ruby/1.9.1/gems/rack-cache-1.2/lib/rack/cache/context.rb:143:in `pass' | /usr/share/foreman/vendor/ruby/1.9.1/gems/rack-cache-1.2/lib/rack/cache/context.rb:155:in `invalidate' | /usr/share/foreman/vendor/ruby/1.9.1/gems/rack-cache-1.2/lib/rack/cache/context.rb:71:in `call!' | /usr/share/foreman/vendor/ruby/1.9.1/gems/rack-cache-1.2/lib/rack/cache/context.rb:51:in `call' | /usr/share/foreman/vendor/ruby/1.9.1/gems/railties-3.2.21/lib/rails/engine.rb:484:in `call' | /usr/share/foreman/vendor/ruby/1.9.1/gems/railties-3.2.21/lib/rails/application.rb:231:in `call' | /usr/share/foreman/vendor/ruby/1.9.1/gems/railties-3.2.21/lib/rails/railtie/configurable.rb:30:in `method_missing' | /usr/share/foreman/vendor/ruby/1.9.1/gems/rack-1.4.7/lib/rack/builder.rb:134:in `call' | /usr/share/foreman/vendor/ruby/1.9.1/gems/rack-1.4.7/lib/rack/urlmap.rb:64:in `block in call' | /usr/share/foreman/vendor/ruby/1.9.1/gems/rack-1.4.7/lib/rack/urlmap.rb:49:in `each' | /usr/share/foreman/vendor/ruby/1.9.1/gems/rack-1.4.7/lib/rack/urlmap.rb:49:in `call' | /usr/lib/ruby/vendor_ruby/phusion_passenger/rack/thread_handler_extension.rb:77:in `process_request' | /usr/lib/ruby/vendor_ruby/phusion_passenger/request_handler/thread_handler.rb:142:in `accept_and_process_next_request' | /usr/lib/ruby/vendor_ruby/phusion_passenger/request_handler/thread_handler.rb:110:in `main_loop' | /usr/lib/ruby/vendor_ruby/phusion_passenger/request_handler.rb:448:in `block (3 levels) in start_threads' | /usr/share/foreman/vendor/ruby/1.9.1/gems/logging-2.0.0/lib/logging/diagnostic_context.rb:448:in `call' | /usr/share/foreman/vendor/ruby/1.9.1/gems/logging-2.0.0/lib/logging/diagnostic_context.rb:448:in `block in create_with_logging_context' 2016-01-27T22:35:00 [app] [I] Rendered api/v2/errors/standard_error.json.rabl within api/v2/layouts/error_layout (1.4ms) 2016-01-27T22:35:00 [app] [I] Completed 500 Internal Server Error in 1229.2ms (Views: 13.9ms | ActiveRecord: 505.9ms)
Updated by Dominic Cleal almost 9 years ago
If you could also attach the debug output from the instructions at http://projects.theforeman.org/issues/11786#note-1 then it'd help complete the info for this ticket. Thanks.
Updated by Marcus Asshauer almost 9 years ago
Host::Managed Load (3.3ms) SELECT "hosts".* FROM "hosts" WHERE "hosts"."type" IN ('Host::Managed') AND "hosts"."name" = '$HOSTNAME$' LIMIT 1 Nic::Base Load (1.7ms) SELECT "nics".* FROM "nics" WHERE "nics"."host_id" = 549 ORDER BY identifier => "[#<Nic::Managed id: 1196, mac: nil, ip: nil, type: \"Nic::Managed\", name: \"$HOSTNAME$\", host_id: 549, subnet_id: nil, domain_id: 3, attrs: {}, created_at: \"2016-01-28 10:53:55\", updated_at: \"2016-01-28 11:28:56\", provider: nil, username: nil, password: nil, virtual: false, link: true, identifier: \"\", tag: \"\", attached_to: \"\", managed: true, mode: \"balance-rr\", attached_devices: \"\", bond_options: \"\", primary: true, provision: true, compute_attributes: {}, execution: false>]"
{ "dir": "C:\\puppet\\facter", "env_windows_installdir": "C:\\puppet", "architecture": "x64", "kernel": "windows", "domain": "$DOMAIN$", "virtual": "physical", "is_virtual": false, "hardwaremodel": "x64", "operatingsystem": "windows", "os": { "name": "windows", "family": "windows", "release": { "major": "7", "full": "7" } }, "facterversion": "2.4.5", "fqdn": "$HOSTNAME$", "hostname": "$HOSTNAME$", "id": "$USERNAME$", "interfaces": "Team_1", "ipaddress_team_1": "1.1.2.7", "macaddress_team_1": "00:22:19:D3:BC:7E", "netmask_team_1": "255.255.248.0", "mtu_team_1": 0, "ipaddress": "1.1.2.7", "kernelmajversion": "6.1", "kernelrelease": "6.1.7601", "kernelversion": "6.1.7601", "macaddress": "00:22:19:D3:BC:7E", "manufacturer": "Dell Inc.", "serialnumber": "BQ8774J", "productname": "PowerEdge R200", "memorysize": "4.00 GB", "memoryfree": "3.05 GB", "memorysize_mb": "4094.32", "memoryfree_mb": "3126.23", "netmask": "255.255.248.0", "network_team_1": "1.1.2.0", "operatingsystemmajrelease": "7", "operatingsystemrelease": "7", "osfamily": "windows", "path": "C:\\puppet\\puppet\\bin;C:\\puppet\\facter\\bin;C:\\puppet\\hiera\\bin;C:\\puppet\\bin;C:\\puppet\\sys\\ruby\\bin;C:\\puppet\\sys\\tools\\bin;C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\puppet\\bin", "physicalprocessorcount": 1, "processors": { "models": [ "Intel(R) Xeon(R) CPU X3360 @ 2.83GHz", "Intel(R) Xeon(R) CPU X3360 @ 2.83GHz", "Intel(R) Xeon(R) CPU X3360 @ 2.83GHz", "Intel(R) Xeon(R) CPU X3360 @ 2.83GHz" ], "count": 4, "physicalcount": 1 }, "processor0": "Intel(R) Xeon(R) CPU X3360 @ 2.83GHz", "processor1": "Intel(R) Xeon(R) CPU X3360 @ 2.83GHz", "processor2": "Intel(R) Xeon(R) CPU X3360 @ 2.83GHz", "processor3": "Intel(R) Xeon(R) CPU X3360 @ 2.83GHz", "processorcount": 4, "ps": "tasklist.exe", "puppetversion": "3.8.5", "rubyplatform": "x64-mingw32", "rubysitedir": "C:/puppet/sys/ruby/lib/ruby/site_ruby/2.0.0", "rubyversion": "2.0.0", "system32": "C:\\Windows\\system32", "system_uptime": { "seconds": 19384030, "hours": 5384, "days": 224, "uptime": "224 days" }, "timezone": "Mitteleuropõische Zeit", "uptime": "224 days", "uptime_days": 224, "uptime_hours": 5384, "uptime_seconds": 19384030 }
I hope the stripped sensitive information is not needed.
Updated by Dominic Cleal almost 9 years ago
- Subject changed from Empty fact fields in some foreman tables (dashboard) to Windows fact import fails with: Can't add or remove `.` from identifier
- Status changed from Need more information to New
Thanks, that's plenty of info I think.
At a guess it's interpreting the underscore in the interface name as an identifier as used on Linux (e.g. eth0_1) and so it's causing a problem.
Updated by Charles McKnight almost 9 years ago
Related issue http://projects.theforeman.org/issues/13693
Updated by Anonymous over 8 years ago
- Related to Bug #13693: Interface Name being converted from using an `_` to a `.` added
Updated by Anonymous over 8 years ago
- Related to Bug #15636: Foreman Cannot Import Facts from Puppet due to ActiveRecord Validation added
Updated by Anonymous over 8 years ago
- Related to Bug #12399: Error saving eth0.1 NIC for host failed added