现在的位置: 首页 > 综合 > 正文

浅谈Cloud Foundry中cloud_controller的postgres数据库

2014年01月05日 ⁄ 综合 ⁄ 共 2360字 ⁄ 字号 评论关闭

        熟悉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_REGEX

       validate_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的时候被自动忽略。如果这些属性需要被赋值的时候,那就只能手动的来做了。

抱歉!评论已关闭.