熟悉Cloud Foundry的技术人员,肯定对cloud_controller不陌生。cloud_controller作为Cloud Foundry的管理模块,一方面管理用户的RESTful请求,另一方面将一些重要的配置性信息持久化,存入cloud_controller节点处的数据库。
关于cloud_controller节点处的数据库,深入一些了解Cloud Foundry,就会发现其实是postgres 8.4关系型数据库。另外在Cloud Foundry中还有一个postgres9.0,这个数据库会作为一个service,供用户使用。
ActiveRecord是Rails中用来把对象映射到数据库表的组件。这项功能被称为对象关系映射(Object-relational mapping),它可以同时利用关系数据库(用来支持持久化)和面向对象编程(用于支持业务逻辑)中的优点来处理业务。ActiveRecord既可以在Rails中应用,也可以在普通程序中使用。在Rails应用中,ActiveRecord应用于模型(MVC中的“M”)中。
而cloud_controller中的数据库就是一个使用ActiveRecord的例子。以下的介绍都是基于cloud_controller的postgres数据库中service数据表。service数据表主要存储各gateway的信息(gateway的label、url、description等)。
service.rb主要讲述了该数据表的格式以及属性说明。以下一一说来:
LABEL_REGEX = /^\S+-\S+$/这句代码主要是设定了一个正则表达式,以便以后验证label的格式是否正确。
validates_format_of :label, :with => LABEL_REGEXvalidate_format_of主要是验证实际操作中产生的该属性数据是否符合某种格式,具体格式即为:with后面的正则表达式。
validates_presence_of :label, :url, :token以上代码的意思是:验证:lable,:url,:token这三个属性是否为非nil或空字符串。
关于这种验证性的操作,会有很验证关键字,比如在service.rb文件中还有:
validates_uniqueness_of :label, :scope => :provider validates_format_of :url, :with => URI::regexp(%w(http https)) validates_format_of :info_url, :with => URI::regexp(%w(http https)), :allow_nil => true validates_format_of :label, :with => LABEL_REGEX validate :cf_plan_id_matches_plans其中validates_uniqueness_of 验证资料在数据表种的唯一性。
validates_format_of 验证数据在数据表中的格式。
validate 调用保存操作,在该例子中表示cf_plan_id和plan匹配。
除此之外,验证性的方法还有:
validates_length_of 验证长度,比如:validates_length_of :numbers :maxmin>=100
validates_numericality_of 验证是否是一个数字,且可以限定数字的大小,比如:validates_numericality_of :age, :greater_than => 18
validates_inclusion_of 验证数据是否是某些范围内的值,比如 :validates_inclusion_of :status, :in => ["pending", "sent"]
以下是关于serialize的内容:
serialize :tags serialize :plans serialize :cf_plan_id serialize :plan_options serialize :binding_options serialize :acls # supported_versions in array, like ["1.0", "2.0"] serialize :supported_versions # optional alias hash for service versions # for example {"current" => "1.0", "next" => "2.0"} serialize :version_aliases
其中最主要的关键字自然是serialize。serialize是序列化的意思,其作用是将一些事物转换为可以被数据表存储或者传输的信息。
现在来看一下这行代码:
attr_accessible :label, :token, :url, :description, :info_url, :tags,……其中attr_accessible关键字很重要。这里会涉及一个mass assignment的问题,也就是说在大量赋值中存在问题,比如说数据表中有个属性不能对所有的用户可见,则在mass assignment中可能会存在一些不安全的行为,比如普通用户做管理员使用的属性进行了修改等。而在使用attr_accessible以后,这些属性会在mass assignment的时候被自动忽略。如果这些属性需要被赋值的时候,那就只能手动的来做了。